IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> ошибка переполнения стека, Не вьіполняється поиск
Юрко
сообщение 11.01.2009 11:28
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Юрко

Репутация: -  0  +


Здравствуйте, Представляю кусок програмьі. Надо огранизовать поиск в по слову в одной записе, тоисть запись
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.



Сообщение отредактировано: Юрко - 11.01.2009 11:29
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 11.01.2009 11:36
Сообщение #2


Гость






Цитата
вьідает ошибку переполнения стека, хотя в строчке пару слов.
А неважно сколько... Ошибка возникает потому, что у тебя размер локальных переменных превышает размер стека. Смотри (в комментариях - размер переменных в байтах):
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 символов. Ограничить размер строки нельзя?
 К началу страницы 
+ Ответить 
Юрко
сообщение 12.01.2009 0:09
Сообщение #3





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Юрко

Репутация: -  0  +


Да тут если меньше, то не всегда срабатьівает. Но за розьяснения спасибо))) А как пользоваться єтой дерективой {$M}, коротко можно здесь или ссьілочку...

Сообщение отредактировано: Юрко - 12.01.2009 0:22
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 12.01.2009 1:10
Сообщение #4


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Юрко
сообщение 12.01.2009 4:34
Сообщение #5





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Юрко

Репутация: -  0  +


Цитата(Lapp @ 12.01.2009 0:10) *

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

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

Спасибо, очень доступно и понятно)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 10:20
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"