Помощь - Поиск - Пользователи - Календарь
Полная версия: ошибка переполнения стека
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Юрко
Здравствуйте, Представляю кусок програмьі. Надо огранизовать поиск в по слову в одной записе, тоисть запись
type  comp=record
firm:string;
n:string;
x:string
end;

организуєм поиск в записе х, по вьідает ошибку переполнения стека, хотя в строчке пару слов. Может я не правильно что-то делаю, или как с єтим бороться?


procedure found(var firm,n,x:string);
var chose,data,firm2,n2,x2,y1:string;
wrd:array [0..225] of string;
k3:integer;
cnt:byte;
i,j:integer;
begin
clrscr;

assign(F, komplek);
reset(F);

writeln('vvedite harakteristiku'); readln(x2);
while not Eof(F) do with c do begin
readln(F, firm);
readln(F, n);
readln(f, x);
x:=x+' ';
while (x<>'')and(pos(' ',x)<>0) do
begin
inc(cnt);
wrd[cnt]:=copy(x,1,pos(' ',x)-1);
delete(x,1,pos(' ',x));
inc(j);
end;

writeln;
for i:=1 to j do begin
y1:=wrd[i];
if x2=y1 then
writeln(firm, n:6, n1, x)
end;
close(F);
end.

volvo
Цитата
вьідает ошибку переполнения стека, хотя в строчке пару слов.
А неважно сколько... Ошибка возникает потому, что у тебя размер локальных переменных превышает размер стека. Смотри (в комментариях - размер переменных в байтах):
procedure found(var firm,n,x:string);
var chose,data,firm2,n2,x2,y1:string; { <- 6*256 }
wrd:array [0..225] of string; { <- 225*256 }
k3:integer; { <- 2 }
cnt:byte; { <- 1 }
i,j:integer; { <- 2*2 }
begin

итого: 1536 + 57600 + 2 + 1 + 4 = 59143 байта. Естественно, не поместится в стек (где и размещаются все локальные переменные), ведь его размер по умолчанию = 16К. Зайди в Options -> Memory Sizes и поменяй размер стеку на больше, чем 59143, или (лучше) воспользуйся директивой {$M} для изменения размера стека...

Хотя я бы все-таки подумал, зачем хранить 225 полных строк, по 256 символов. Ограничить размер строки нельзя?
Юрко
Да тут если меньше, то не всегда срабатьівает. Но за розьяснения спасибо))) А как пользоваться єтой дерективой {$M}, коротко можно здесь или ссьілочку...
Lapp
Цитата(Юрко @ 12.01.2009 0:09) *
Да тут если меньше, то не всегда срабатьівает. Но за розьяснения спасибо))) А как пользоваться єтой дерективой {$M}, коротко можно здесь или ссьілочку...

Вставляешь первой строкой программы:
{$M 65520,0,655360}

первое число - размер стека (по умолчанию - 16КВ, в моем примере - практически максимум возможного в ТР)
второе - нижний предел кучи
третье - верхний предел кучи
Юрко
Цитата(Lapp @ 12.01.2009 0:10) *

Вставляешь первой строкой программы:
{$M 65520,0,655360}

первое число - размер стека (по умолчанию - 16КВ, в моем примере - практически максимум возможного в ТР)
второе - нижний предел кучи
третье - верхний предел кучи

Спасибо, очень доступно и понятно)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.