Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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= 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.047 c
15-1168774293
Ricks
2007-01-14 14:31
2007.02.04
Подскажите, что сделать...


3-1163586337
Ольга
2006-11-15 13:25
2007.02.04
Создание дистрибутива


15-1168621719
AntiUser
2007-01-12 20:08
2007.02.04
Обход ограничений безопасности в FreeBSD


4-1158843222
laronov
2006-09-21 16:53
2007.02.04
Как получить данные из чужого DBGrid а


2-1169116390
mmip
2007-01-18 13:33
2007.02.04
Подключение к MS SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский