Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: 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 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.032 c
3-1163586337
Ольга
2006-11-15 13:25
2007.02.04
Создание дистрибутива


15-1168969163
FAskerQ
2007-01-16 20:39
2007.02.04
Task Killer


15-1168591606
FIL-23
2007-01-12 11:46
2007.02.04
дайте ссылочку на материал по написанию драйверов


2-1168849914
Mishenka
2007-01-15 11:31
2007.02.04
Как узнать высоту системного трея в пикселях?


4-1158830774
2ded
2006-09-21 13:26
2007.02.04
JOB_INFO_1 PagesPrinted