Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Stack overflow error, Работа с процедурами и функциями 
:(
    Опции темы
s_a_s_h_a
Дата 18.4.2005, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 261
Регистрация: 20.7.2004
Где: Петрозаводск

Репутация: нет
Всего: 1



Код


Type M=array[1..99,1..99] of integer;
var n1,m1: integer;
    a:M;
    stolbec : integer;

procedure vvod(n,m:integer;var b:M);
var i,j: integer;
begin
     writeln ('vvedite element');
     for i:=1 to n do
         for j:=1 to m do
         readln(b[i,j]);
end;


procedure vyvod_matr(n,m:integer;var b:M);
var i,j: integer;
begin
     for i:=1 to n do
       begin
         for j:=1 to m do
         write(' ',b[i,j]:5);
         writeln;
       end;
end;

function find(n,m:integer;b:M):integer;
var i,j: integer;
     summ: integer;
     max: integer;
begin
     max:=0;
     for j:=1 to m do
     begin
          summ:=0;

          for i:=1 to n do
          summ:=summ+b[i,j];
          if max<summ then
                          begin
                               max:=summ;
                               stolbec:=j;
                         end;
    end;
    find:=stolbec;
end;

procedure vyvod(stolbec:integer);
begin
     writeln ('stolbec: ', stolbec)   {stolbec s max summoj elementov}
end;

begin
     writeln ('vvedite razmernost matricy');
   readln(n1,m1);
   vvod(n1,m1,a);
   vyvod_matr(n1,m1,a);
   stolbec:=0;
   stolbec:=find(n1,m1,a);
   vyvod(stolbec);
   readln
end.


Возникает ошибка "Stack overflow error" и выкидывает на открывающий begin функции find. Вопрос из-за чего она возникает и как её исправить?
Матрица малой размерности (2х3) и заполняю маленькими целыми числами. Такая же ерунда была, когда find организовывал как процедуру.
PM MAIL   Вверх
SPrograMMer
Дата 18.4.2005, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



smile УСЕ хорошо вроде бы....
попробуй выполнить по шагам, свой код, через F7, если компиляторы Borland Pascal или Turbo Pascal.
Stack overflow error - ошибка при переполнении стека. В тапкой простой программе такое может произойти если, происходит зацикливание вызова подпрограммы, то есть что-то типа:
Код

procedure A;
Begin
   ...
   A;  // тут!!!
End;
...
Begin
  A;
End.

А у тебя я такого не нашел...

Это сообщение отредактировал(а) SPrograMMer - 18.4.2005, 17:57


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Fedor
Дата 18.4.2005, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



У тебя процедура find содержит параметр типа M, который занимает слишком много памяти и когда он засовывается в стек, происходит переполнение.
Варианты решения:
1) Уменьшить размер типа M
2) Сделать этот параметр глобалной переменной
3) Нажми Ctrl+O+O, сверху появятся настройку компиляции по умолчанию. Исправь чтоб вторая строчка была примерно такой:
Код

{$M 65384,0,655360}

Т.е. короче говоря увеличь размер стека в программе.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
SPrograMMer
Дата 18.4.2005, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



Цитата(Fedor @ 18.4.2005, 18:14)
параметр типа M, который занимает слишком много памяти

Тогда разве на этапе компиляции ничего не должно выскакивать?!


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Fedor
Дата 18.4.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



Цитата(SPrograMMer @ 18.4.2005, 18:32)
Тогда разве на этапе компиляции ничего не должно выскакивать?!


Это ведь зависит от размера стека, это не определяется во время компиляции.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
SPrograMMer
Дата 18.4.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Спамер :)
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 5.11.2004
Где: Краснодар

Репутация: нет
Всего: 6



Хорошо, Fedor попробуй объявить следующее:
Код

Type
  Dim200x200=Array[1..200,1..200] of Real;
Var
  D:Dim200x200;

Получится ли? У меня к сожелению сейчас нет компилятора пасаля под DOS, проверить не могу...


--------------------
животное = зверь
законченный гентушник
PM MAIL ICQ Jabber   Вверх
Fedor
Дата 18.4.2005, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


Профиль
Группа: Участник
Сообщений: 2090
Регистрация: 8.2.2003
Где: Великий

Репутация: нет
Всего: 32



SPrograMMer ты не понял. Такую матрицу (200*200 of real) невозможно использовать в принципе из-за того, что память, которую она занимает составляет 200*200*6=240000 > 65535.
Если вернуться к условию, то матрица занимает 99*99*2=20000 байт. При вызове процедуры программа пытается запихнуть ее в стек, а размер стека у нас по умолчанию ~16000 байт. Вот и возникает ашипка. Если мы директивой компилятора увеличим размер стека например хотябы до 30000 то все будет уже ОК.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
volvo877
Дата 19.4.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Fedor @ 18.4.2005, 18:14)
Варианты решения:
1) Уменьшить размер типа M
2) Сделать этот параметр глобалной переменной
3) Нажми Ctrl+O+O, сверху появятся настройку компиляции по умолчанию.

Есть еще 4-ый вариант - изменить заголовок функции find на:

Код
function find(n,m:integer; const b:M):integer;

Можно было бы просто передать по ссылке (var b:M), но для гарантии неизменности данных в массиве b пользуемся const

Это сообщение отредактировал(а) volvo877 - 19.4.2005, 00:36
PM MAIL   Вверх
Zero
Дата 19.4.2005, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



Цитата(Fedor @ 18.4.2005, 22:15)
Если мы директивой компилятора увеличим размер стека например хотябы до 30000 то все будет уже ОК.

А теперь более точная формула для расёта нужного кол-ва байт в стеке:
S=S1+548
где S ─ размер стека;
S1 ─ max{размер памяти любого идентификатора}
Т.е. в данном примере расчитывается так:
S=99*99*2+548=20150;
Т.е. Min размер стека можно указать таким
Код

{$M 20150,0,655360}
И если хоть на один байт уменьшить то будет ошибка.


[Fedor: Добавлено в FAQ: http://vingrad.ru/DELPHI-FAQ-002496]

Это сообщение отредактировал(а) Fedor - 20.4.2005, 17:29
PM MAIL ICQ   Вверх
Zero
  Дата 19.4.2005, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2169
Регистрация: 23.10.2004
Где: Россия, г. Рязань

Репутация: нет
Всего: 24



s_a_s_h_a ну типа если тебя бесят взякие ожжибки, ну типа пиши вот так в начале программы:
Код

{$S-}
И узё. smile smile smile smile smile
Добавлено @ 01:52
Ладно ето шутка, предыдущий способ самый правильный smile

Это сообщение отредактировал(а) Zero - 19.4.2005, 01:54
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0525 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.