Вниз
Скачать: CL | DM;

Динамический массив   Найти похожие ветки 

← →
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= 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;


← →
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 вся ветка

Скачать: CL | DM;



Память: 0.52 MB
Время: 0.028 c
15-1168304227
vasIzmax
2007-01-09 03:57
2007.02.04
Везет как утопленнику :(


15-1168860340
XTD
2007-01-15 14:25
2007.02.04
ОФФ:Borland.Delphi.2006.Enterprise


2-1169130268
vitv
2007-01-18 17:24
2007.02.04
Построение запроса


2-1168911194
kingsoft
2007-01-16 04:33
2007.02.04
Открытие шаблона Microsoft Excel


15-1168379903
Bogdan1024
2007-01-10 00:58
2007.02.04
hlp-файлы




   Наверх