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

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

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

 
 Ответить  Открыть новую тему 
> ошибка переполнения стека, Не вьіполняється поиск
сообщение
Сообщение #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.



Сообщение отредактировано: Юрко -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 символов. Ограничить размер строки нельзя?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


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

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


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

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

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


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

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

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


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





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

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


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

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

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

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

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

 





- Текстовая версия 18.04.2024 20:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name