Помощь - Поиск - Пользователи - Календарь
Полная версия: ошибка переполнения стека
Форум «Всё о Паскале» > 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КВ, в моем примере - практически максимум возможного в ТР)
второе - нижний предел кучи
третье - верхний предел кучи

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