Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Stack overflow   Найти похожие ветки 

 
dabreezy   (2005-12-16 08:55) [0]

Добрый день.
Почему такой код вызывает Stack overflow.Причем если массивы сделать не 1..100000, а 1..50000 то все ок. Неужели у Delphi такие ограниченные возможности :(
procedure ClearBaza (filename: string);
var
 f,f1: textfile;
 buf: array [1..100000] of string;
 buf2,buf3: array [1..100000] of string;
 flag: byte;
 i,i1,i2,i3,i4: Longint;
begin
 assignfile (f,filename);
 reset (f);
 i:=1;
 while not eof(f) do
  begin
    readln (f,buf[i]);
    i:=i+1;
  end;
 closefile(f);

 assignfile (f1,"c:\baza.txt");
 reset (f1);
 i3:=1;
 while not eof(f1) do
  begin
    readln (f1,buf2[i3]);
    i3:=i3+1;
  end;
 closefile(f1);

 i4:=0;
 for i1:=1 to i-1 do
 begin
   flag:=1;
   for i2:=1 to i3 do
     begin
       if buf2[i2]=buf[i1] then begin flag:=0; break; end;
     end;
   if flag=1 then
     begin
       if buf[i1]<>"" then
       begin
         i4:=i4+1;
         buf3[i4]:=buf[i1];
       end;
     end;
 end;
 assignfile (f,filename);
 rewrite (f);
 assignfile (f1,"c:\baza.txt");
 append (f1);
 for i:=1 to i4 do
  begin
    writeln (f,buf3[i]);
    writeln (f1,buf3[i]);
  end;
 closefile(f);
 closefile(f1);

end;


 
Anatoly Podgoretsky ©   (2005-12-16 09:05) [1]

А какой у тебя установлен размер стека?
Сейчас у тебя под переменные на стеке требуется как минимум 100000*4*4, свыше 1,6 мб только в данной процедуре.


 
dabreezy   (2005-12-16 09:08) [2]

Спасибо за ответ, Анатолий.
А как узнать сколько сейчас памяти под стек? И как его увеличить? Сколько можно максимум поставить? Я помню в Турбо Паскале можно было сделать с помошью диррективы {$S}


 
evvcom ©   (2005-12-16 09:08) [3]


> 100000*4*4

Наверное, все-таки 100000*4*3 имелось ввиду?


 
evvcom ©   (2005-12-16 09:11) [4]


> И как его увеличить?

А зачем? Не привязывайся в данном случае к статическому массиву. У тебя ж файл может быть и гораздо большего размера. См. динамические массивы или лучше обрати внимание на списки, например, TStringList.


 
Anatoly Podgoretsky ©   (2005-12-16 09:14) [5]

evvcom ©   (16.12.05 09:08) [3]
Конечно, но это не важно, суть то в том, что на стек помещается большой объем данных.


 
dabreezy   (2005-12-16 09:15) [6]


> А зачем? Не привязывайся в данном случае к статическому
> массиву. У тебя ж файл может быть и гораздо большего размера.
>  См. динамические массивы или лучше обрати внимание на списки,
>  например, TStringList.

Большое спасибо. Поставил вот так {$M 16384,10048576} , все заработало.
Ну это не выход. Спасибо за совет будем изучать динамические массивы.


 
Anatoly Podgoretsky ©   (2005-12-16 09:15) [7]

dabreezy   (16.12.05 09:08) [2]
Как сказали переходи на динамические массивы или выводи массивы их функции.


 
Leonid Troyanovsky ©   (2005-12-16 09:16) [8]


> dabreezy   (16.12.05 08:55)  

> Неужели у Delphi  такие ограниченные возможности :(


Про почему Анатолий уже объяснил ( > 1.2Мб).
А для решения проблемы вместо массива возьми, например, TStringList.
См. также SetCapacity.

--
Regards, LVT.


 
dabreezy   (2005-12-16 09:16) [9]


> Как сказали переходи на динамические массивы или выводи
> массивы их функции.

Спасибо.



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.032 c
2-1134307926
WebSQLNeeder
2005-12-11 16:32
2006.01.01
Как узнать путь к программе где она находится в данный момент?


4-1130437729
Erl
2005-10-27 22:28
2006.01.01
Bitmap


1-1133511856
Шурик_
2005-12-02 11:24
2006.01.01
Обработка Cancel


9-1122544019
java73
2005-07-28 13:46
2006.01.01
поиск пути


1-1133514279
DimMih
2005-12-02 12:04
2006.01.01
Помещение компонентов в DBGrid