![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Stack overflow [D7, XP]
dabreezy © (2005-12-16 08:55:00)Добрый день.
Почему такой код вызывает 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;
Leonid Troyanovsky (2005-12-16 09:16:00) [1]
> dabreezy (16.12.05 08:55)
> Неужели у Delphi такие ограниченные возможности :(
Про почему Анатолий уже объяснил ( > 1.2Мб).
А для решения проблемы вместо массива возьми, например, TStringList.
См. также SetCapacity.
--
Regards, LVT.
dabreezy (2005-12-16 09:16:00) [2]
> Как сказали переходи на динамические массивы или выводи
> массивы их функции.
Спасибо.
dabreezy (2005-12-16 09:15:00) [3]
> А зачем? Не привязывайся в данном случае к статическому
> массиву. У тебя ж файл может быть и гораздо большего размера.
> См. динамические массивы или лучше обрати внимание на списки,
> например, TStringList.
Большое спасибо. Поставил вот так {$M 16384,10048576} , все заработало.
Ну это не выход. Спасибо за совет будем изучать динамические массивы.
Anatoly Podgoretsky (2005-12-16 09:15:00) [4]dabreezy (16.12.05 09:08) [2]
Как сказали переходи на динамические массивы или выводи массивы их функции.
Anatoly Podgoretsky (2005-12-16 09:14:00) [5]evvcom © (16.12.05 09:08) [3]
Конечно, но это не важно, суть то в том, что на стек помещается большой объем данных.
evvcom (2005-12-16 09:11:00) [6]
> И как его увеличить?
А зачем? Не привязывайся в данном случае к статическому массиву. У тебя ж файл может быть и гораздо большего размера. См. динамические массивы или лучше обрати внимание на списки, например, TStringList.
dabreezy (2005-12-16 09:08:00) [7]Спасибо за ответ, Анатолий.
А как узнать сколько сейчас памяти под стек? И как его увеличить? Сколько можно максимум поставить? Я помню в Турбо Паскале можно было сделать с помошью диррективы {$S}
evvcom (2005-12-16 09:08:00) [8]
> 100000*4*4
Наверное, все-таки 100000*4*3 имелось ввиду?
Anatoly Podgoretsky (2005-12-16 09:05:00) [9]А какой у тебя установлен размер стека?
Сейчас у тебя под переменные на стеке требуется как минимум 100000*4*4, свыше 1,6 мб только в данной процедуре.