Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
ВнизДинамический массив Найти похожие ветки
← →
Infinityx93 © (2007-01-12 01:29) [0]создаю массив строк
устанавливаю его длину (setlength) и обнуляю(finalize)
выдает еррор что не так?
еррор во время заполнения массива строками из файла текстового
← →
Anatoly Podgoretsky © (2007-01-12 01:32) [1]> Infinityx93 (12.01.2007 01:29:00) [0]
У тебя наверно ошибка в программе.
← →
Германн © (2007-01-12 01:49) [2]
> устанавливаю его длину (setlength) и обнуляю(finalize)
> выдает еррор что не так?
> еррор во время заполнения массива строками из файла текстового
>
Эт как? Сначала
> setlength
, потом
> finalize
, а потом заполняешь массив строками из файла текстового? Так что-ли???
← →
RASkov (2007-01-12 01:57) [3]> [0] Infinityx93 © (12.01.07 01:29)
> setlength
SetLength - наверное недостаточный Length устанавливаешь......
← →
Джо © (2007-01-12 06:54) [4]> обнуляю(finalize)
Finalize — это, как бы сказать, совсем не «обнуление».
← →
ors_archangel © (2007-01-12 07:17) [5]Код давай!
← →
Infinityx93 © (2007-01-14 01:43) [6]вот мой собственно код:
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;
где ошибка подскажите плз
← →
Германн © (2007-01-14 02:29) [7]
> где ошибка подскажите плз
Имхо, тут:
> finalize(fullst);
← →
Sha © (2007-01-14 12:58) [8]замени
finalize
наFillChar(fullst[0],Sizeof(fullst[0])*Length(fullst),0)
← →
Amoeba © (2007-01-15 10:55) [9]
> i := 0;
> while not eof(tempfile) do
> begin
> readln(tempfile,st);
> fullst[i] := st;
> end;
Забавно...
← →
Infinityx93 © (2007-01-16 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;
помогите пузырек не работает :(((
← →
ors_archangel © (2007-01-17 02:13) [11]А что же он делает?
← →
Германн © (2007-01-17 02:22) [12]
> 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 03:46) [13]j, k - должны быть локальными переменными порядкового типа, у тебя этого не видно
← →
evvcom © (2007-01-17 08:59) [14]> [8] Sha © (14.01.07 12:58)
> замени finalize на FillChar
Нафига? Оно ж SetLength уже инициализирует нулями. Просто finalize убрать вполне достаточно.
← →
Sha © (2007-01-17 09:28) [15]> 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 11:53) [16]> [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 12:24) [17]смотрим код еще раз
var
i : cardinal;
fullst : array of string;
сейчас fullst= nilprocedure TForm1.Button1Click(Sender: TObject);
BEGIN
i := 0;
while ....
inc(i);
end;
сейчас может быть i>0setlength(fullst,i);
сейчас в fullst лежит i указателей в космосfinalize(fullst);
попытка их финализации приведет к ошибке, т.к. реально по этим адресам
строк нет и освободить занятую несуществующими строками память невозможно
если же не обнулить эти указатели при помощи FillChar, то ошибка вылезет
позднее на операторе fullst[i] := st; из-за аналогичной попытки менеджера
памяти поуправлять невыделенной памятью.i := 0;
while ....
fullst[i] := st;
end;
END;
← →
Sha © (2007-01-17 12:38) [18]Перечитал справку еще раз. Был не прав.
Действительно обнуляет, когда указатели :)
Привык сам все делать, даже неожиданно как-то, что кто-то что-то за тебя сделал.
← →
evvcom © (2007-01-17 12:55) [19]> [18] Sha © (17.01.07 12:38)
:)
← →
Infinityx93 © (2007-01-20 00:38) [20]Вот весь код кто-то просил, собственно помогите вместо массивов с 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.
код не оптимизирован так что не надо писать про локальные или лишние переменные
← →
ors_archangel © (2007-01-20 01:05) [21]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;
Всё просто по-мойму, можешь и сам справиться.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.042 c