Текущий архив: 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.028 c