![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Динамический массив
Infinityx93 © (2007-01-12 01:29:00)создаю массив строк
устанавливаю его длину (setlength) и обнуляю(finalize)
выдает еррор что не так?
еррор во время заполнения массива строками из файла текстового
ors_archangel (2007-01-20 01:05:00) [1]1. Декларации
ipadres,sort,httpadr,fullst,bytest : array [1..999999]of string;
mbyte : array [1..999999] of cardinal;
замеяешь на
ipadres,sort,httpadr,fullst,bytest : array of string;
mbyte : array of cardinal;
Внимание! Динамические массивы всегда индексируются от нуля!
2. Код.
Перед циклом обращений к массиву
while not eof(tempfile) do
begin
inc(i);
readln(tempfile,st);
fullst[i] := st;
ipadres[i] := copy(st,23,11);
...
end;
нужно установить его размер, если он известен, в твоём случае, это похоже не так, поэтому придётся увеличивать длину массива перед каждым добавлением элемента:
while not eof(tempfile) do
begin
inc(i);
readln(tempfile,st);
setlength(fullst, i);
fullst[i-1] := st;
setlength(ipadres, i);
ipadres[i-1] := copy(st,23,11);
...
end;
Всё просто по-мойму, можешь и сам справиться.
Infinityx93 (2007-01-20 00:38:00) [2]Вот весь код кто-то просил, собственно помогите вместо массивов с 9ми сделать динамические массивы
unit LOG;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, Buttons, TeEngine, Series, ExtCtrls, TeeProcs,
Chart;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
Button1: TButton;
Edit1: TEdit;
OpenDialog1: TOpenDialog;
Button2: TButton;
Chart1: TChart;
Button3: TButton;
Chart2: TChart;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
tt :array[0..65535] of longint;
ipadres,sort,httpadr,fullst,bytest : array [1..999999]of string;
mbyte : array [1..999999] of cardinal;
fileadres : string;
ccc : string;
c,d, n : byte;
du:double;
i,j,k : longint;
buble : boolean;
arbyte, aaa : array [0..65535] of cardinal;
b:cardinal;
dynser,dynser2 : tbarseries;
st : string;
tempst : string;
tempfile : text;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
BEGIN
i := 0;
if opendialog1.execute then
begin
edit1.Text := opendialog1.filename;
fileadres := opendialog1.FileName;
assignfile (tempfile, fileadres);
reset (tempfile);
while not eof(tempfile) do
begin
readln (tempfile,st);
inc(i);
end;
reset(tempfile);
i := 0;
while not eof(tempfile) do
begin
inc(i);
readln(tempfile,st);
fullst[i] := st;
ipadres[i] := copy(st,23,11);
for c:=0 to length(st) do
if (st[c]='G') and (st[c+1]='E') and (st[c+2]='T') then
begin
d:=c-2;
while st[d]<>' ' do
begin
d:=d-1;
if st[d]=' ' then
begin
byteST[i]:= copy(st,d+1,c-d-2);
mbyte[i]:= strtoint(byteST[i]);
end;
end;
end;
end;
end;
if edit1.Text <> 'Log не выбран!!!' then button2.enabled := true;
END;
procedure TForm1.Button2Click(Sender: TObject);
begin
inc(n);
for k := i-1 downto 1 do
for j := 1 to k do
if ipadres[j] > ipadres[j+1] then
begin
tempst := ipadres[j];
ipadres[j] := ipadres[j+1];
ipadres[j+1] := tempst;
tempst := httpadr[j];
httpadr[j] := httpadr[j+1];
httpadr[j+1] := tempst;
b := mbyte[j];
mbyte[j] := mbyte[j+1];
mbyte[j+1] := b;
end;
c:=1;
k:=0;
for j:= 1 to i do
BEGIN
if (ipadres[j] <> ipadres[j+1])
then
begin
tt[k]:=j;
if k = 0 then aaa[k]:=j
else aaa[k]:=j - tt[k-1];
k:=k+1;
c:=c+1;
end;
END;
//==================MBYTES==========================
k:=0;
for j:= 1 to i do
BEGIN
if (ipadres[j] = ipadres[j+1])
then
begin
mbyte[j+1] := mbyte[j] + mbyte[j+1];
end
else
begin
arbyte[k] := mbyte[j];
inc(k);
end;
END;
c:=k;
//====================MBYTES========================
//====================chart1========================
du:=i;
k:=0;
ccc := floattostr(i);
dynser2 := tbarseries.Create(self);
dynser2.ParentChart := chart1;
dynser2.ShowInLegend := false;
for k:=0 to c-1 do
begin
with dynser2 do addy(aaa[k],ipadres[tt[k]],random(5000000)+150);
end;
//===============chart1=============================
//==============CHART2==============================
dynser := tbarseries.Create(self);
dynser.ParentChart := chart2;
dynser.ShowInLegend := false;
for k:=0 to c-1 do
begin
arbyte[k] := arbyte[k] div 1024;
with dynser do addy(arbyte[k],ipadres[tt[k]],random(5000000)+100);
end;
//==============CHART2==============================
button2.Enabled := false;
button3.Enabled := true;
for j := 1 to i do mbyte[j] :=0;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
dynser.Clear;
dynser2.Clear;
end;
end.
код не оптимизирован так что не надо писать про локальные или лишние переменные
evvcom (2007-01-17 12:55:00) [3]> [18] Sha © (17.01.07 12:38)
:)
Sha (2007-01-17 12:38:00) [4]Перечитал справку еще раз. Был не прав.
Действительно обнуляет, когда указатели :)
Привык сам все делать, даже неожиданно как-то, что кто-то что-то за тебя сделал.
Sha (2007-01-17 12:24:00) [5]смотрим код еще раз
var
i : cardinal;
fullst : array of string;
сейчас fullst= nil
procedure TForm1.Button1Click(Sender: TObject);
BEGIN
i := 0;
while ....
inc(i);
end;
сейчас может быть i>0
setlength(fullst,i);
сейчас в fullst лежит i указателей в космос
finalize(fullst);
попытка их финализации приведет к ошибке, т.к. реально по этим адресам
строк нет и освободить занятую несуществующими строками память невозможно
если же не обнулить эти указатели при помощи FillChar, то ошибка вылезет
позднее на операторе fullst[i] := st; из-за аналогичной попытки менеджера
памяти поуправлять невыделенной памятью.
i := 0;
while ....
fullst[i] := st;
end;
END;
evvcom (2007-01-17 11:53:00) [6]> [15] Sha © (17.01.07 09:28)
When S is a dynamic array of types that must be initialized, newly allocated space is set to 0 or nil.
Исходя из
> [0] Infinityx93 © (12.01.07 01:29)
> создаю массив строк
видим, что dynamic array of types that must be initialized
Вроде всё так.
Sha (2007-01-17 09:28:00) [7]> evvcom © (17.01.07 08:59) [14]
>> замени finalize на FillChar
>Нафига? Оно ж SetLength уже инициализирует нулями. Просто finalize убрать вполне достаточно.
Existing characters in the string or elements in the array are preserved, but the content of newly allocated space is undefined.
evvcom (2007-01-17 08:59:00) [8]> [8] Sha © (14.01.07 12:58)
> замени finalize на FillChar
Нафига? Оно ж SetLength уже инициализирует нулями. Просто finalize убрать вполне достаточно.
ors_archangel (2007-01-17 03:46:00) [9]j, k - должны быть локальными переменными порядкового типа, у тебя этого не видно
Германн (2007-01-17 02:22:00) [10]
> Infinityx93 © (16.01.07 23:11) [10]
>
>
> i := 0;
> while not eof(tempfile) do
> begin
> readln(tempfile,st);
> fullst[i] := st;
> inc(i);
> end;
>
> procedure TForm1.Button2Click(Sender: TObject);
> begin
> for j := i - 1 downto 0 do
> for k := 0 to j do
> if fullst[k] > fullst[k+1] then
> begin
> st := fullst[k];
> fullst[k] := fullst[k+1];
> fullst[k+1] := st;
> end;
> end;
> помогите пузырек не работает :(((
>
И не заработает никогда в этом куске. Тут нужен не пузырёк, а ПУЗЫРЬ! А может и не один! :)
P.S. Перестань в нас плеваться, созданными бредовым воображением, кусками "якобы реального" кода!
ors_archangel (2007-01-17 02:13:00) [11]А что же он делает?
Infinityx93 (2007-01-16 23:11:00) [12]
i := 0;
while not eof(tempfile) do
begin
readln(tempfile,st);
fullst[i] := st;
inc(i);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
for j := i - 1 downto 0 do
for k := 0 to j do
if fullst[k] > fullst[k+1] then
begin
st := fullst[k];
fullst[k] := fullst[k+1];
fullst[k+1] := st;
end;
end;
помогите пузырек не работает :(((
Amoeba (2007-01-15 10:55:00) [13]
> i := 0;
> while not eof(tempfile) do
> begin
> readln(tempfile,st);
> fullst[ i] := st;
> end;
Забавно...
Sha (2007-01-14 12:58:00) [14]замени
finalizeнаFillChar(fullst[0],Sizeof(fullst[0])*Length(fullst),0)
Германн (2007-01-14 02:29:00) [15]
> где ошибка подскажите плз
Имхо, тут:
> finalize(fullst);
Infinityx93 (2007-01-14 01:43:00) [16]вот мой собственно код:
var
i : cardinal;
fileadres, st : string;
tempfile : text;
fullst : array of string;
procedure TForm1.Button1Click(Sender: TObject);
BEGIN
i := 0;
if opendialog1.execute then
begin
edit1.Text := opendialog1.filename;
fileadres := opendialog1.FileName;
assignfile (tempfile, fileadres);
reset (tempfile);
while not eof(tempfile) do
begin
readln (tempfile,st);
inc(i);
end;
end;
reset(tempfile);
setlength(fullst,i);
finalize(fullst);
i := 0;
while not eof(tempfile) do
begin
readln(tempfile,st);
fullst[i] := st;
end;
END;
где ошибка подскажите плз
ors_archangel (2007-01-12 07:17:00) [17]Код давай!
Джо (2007-01-12 06:54:00) [18]> обнуляю(finalize)
Finalize — это, как бы сказать, совсем не «обнуление».
RASkov (2007-01-12 01:57:00) [19]> [0] Infinityx93 © (12.01.07 01:29)
> setlength
SetLength - наверное недостаточный Length устанавливаешь......
Германн (2007-01-12 01:49:00) [20]
> устанавливаю его длину (setlength) и обнуляю(finalize)
> выдает еррор что не так?
> еррор во время заполнения массива строками из файла текстового
>
Эт как? Сначала
> setlength
, потом
> finalize
, а потом заполняешь массив строками из файла текстового? Так что-ли???