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

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

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

 
 Ответить  Открыть новую тему 
> Error 202, Stack overvlow error...
kent
сообщение 15.08.2005 12:01
Сообщение #1


Пионер
**

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

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


Столкнулся вот с такой ошибкой (что то со стеком)...

Вот задача:
Дана строка, состоящая из русских слов, разделенных пробелами (одним или
несколькими). Определить длину самого короткого|длинного слова.

Вот код:

uses crt;
type
TWords = Array [1..100] of String;

{-----------------------------------------------------}
Procedure GetWords(S : String; var mas : TWords; var count : Integer);
var i,j : Integer;
begin
i := 0;
for j := 1 to Length(S) do begin
if (j = 1) and (S[j] <> ' ') then
inc(i)
else if (j < Length(S)) and (S[j] = ' ') and (S[j + 1] <> ' ') then
inc(i);
if (S[j] <> ' ') then
mas[i] := mas[i] + S[j];
end;
count := i;
end;
{-----------------------------------------------------}

{-----------------------------------------------------}
Function LengthShortestWord(S: String) : Integer;
var i,count : Integer;
min : Integer;
mas : TWords;
begin
min := Maxint;
GetWords(S,mas,count);
for i := 1 to count do
if (Length(mas[i]) < min) then
min := Length(mas[i]);
LengthShortestWord := min;
end;
{-----------------------------------------------------}


var S : String;
begin
Clrscr;
WriteLn('Input String:');
ReadLn(S);
WriteLn('Length Shortest Word:');
WriteLn(LengthShortestWord(S));
ReadKey;
end.


Почему она возникает?

Сообщение отредактировано: kent - 15.08.2005 12:01
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 15.08.2005 12:06
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Переполнение стека ... при какой строке у тебя выдает ошибку ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 15.08.2005 12:13
Сообщение #3


Профи
****

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

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


Цитата(kent @ 15.08.05 12:01)
Столкнулся  вот с такой ошибкой (что то со стеком)...


Не знаю, что здесь со стеком, но массив "mas : TWords;" перед использованием лучше обнулить, там могут оказаться совсем не пустые строки. А стек прибавь, на всякий случай.

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


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

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


Еще я думаю массив mas лучше объявить глобально перед описанием подпрограмм


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kent
сообщение 15.08.2005 13:13
Сообщение #5


Пионер
**

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

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


Цитата(klem4 @ 15.08.05 13:15)
Еще я думаю массив mas лучше объявить глобально перед  описанием подпрограмм


Точно, после того как объявил глобально, все заработало без ошибок...
Спасибо!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.08.2005 15:07
Сообщение #6


Гость






Цитата(klem4 @ 15.08.05 12:15)
Еще я думаю массив mas лучше объявить глобально перед  описанием подпрограмм

Я бы, если честно, не рекомендовал "глобализовать" переменные, иногда это как раз НЕ нужно делать.
kent, увеличивай размер стека (третий параметр директивы {$M ...})

А еще лучше - вот так:

{-----------------------------------------------------}
Function LengthShortestWord(S: String) : Integer;
Var
mas : TWords;

Procedure GetWords(var count : Integer);
var i,j : Integer;
begin
i := 0;
for j := 1 to Length(S) do begin
if (j = 1) and (S[j] <> ' ') then
inc(i)
else if (j < Length(S)) and (S[j] = ' ') and (S[j + 1] <> ' ') then
inc(i);
if (S[j] <> ' ') then
mas[i] := mas[i] + S[j];
end;
count := i;
end;

var i,count : Integer;
min : Integer;
begin
min := Maxint;
GetWords(count);
for i := 1 to count do
if (Length(mas[i]) < min) then
min := Length(mas[i]);
LengthShortestWord := min;
end;
{-----------------------------------------------------}
 К началу страницы 
+ Ответить 
kent
сообщение 15.08.2005 17:17
Сообщение #7


Пионер
**

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

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


volvo, честно говоря не знал что можно процедуру в функцию вставлять, спасибо за совет... ;)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
FreeMan
сообщение 15.08.2005 17:21
Сообщение #8


-
****

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

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


можно вставить процедуру даже в функцию, вставленную в процедуру, которая вставлена в функцию smile.gif


--------------------
бб
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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