![]() |
|
Модераторы: volvo877, Snowy, MetalFan |
![]()
|
|
| s_a_s_h_a |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 261 Регистрация: 20.7.2004 Где: Петрозаводск Репутация: нет Всего: 1 |
Возникает ошибка "Stack overflow error" и выкидывает на открывающий begin функции find. Вопрос из-за чего она возникает и как её исправить? Матрица малой размерности (2х3) и заполняю маленькими целыми числами. Такая же ерунда была, когда find организовывал как процедуру. |
|||
|
||||
| SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
попробуй выполнить по шагам, свой код, через F7, если компиляторы Borland Pascal или Turbo Pascal. Stack overflow error - ошибка при переполнении стека. В тапкой простой программе такое может произойти если, происходит зацикливание вызова подпрограммы, то есть что-то типа:
А у тебя я такого не нашел... Это сообщение отредактировал(а) SPrograMMer - 18.4.2005, 17:57 -------------------- животное = зверь законченный гентушник |
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
У тебя процедура find содержит параметр типа M, который занимает слишком много памяти и когда он засовывается в стек, происходит переполнение.
Варианты решения: 1) Уменьшить размер типа M 2) Сделать этот параметр глобалной переменной 3) Нажми Ctrl+O+O, сверху появятся настройку компиляции по умолчанию. Исправь чтоб вторая строчка была примерно такой:
Т.е. короче говоря увеличь размер стека в программе. -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
Тогда разве на этапе компиляции ничего не должно выскакивать?! -------------------- животное = зверь законченный гентушник |
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
Это ведь зависит от размера стека, это не определяется во время компиляции. -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| SPrograMMer |
|
|||
![]() Спамер :) ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 5.11.2004 Где: Краснодар Репутация: нет Всего: 6 |
Хорошо, Fedor попробуй объявить следующее:
Получится ли? У меня к сожелению сейчас нет компилятора пасаля под DOS, проверить не могу... -------------------- животное = зверь законченный гентушник |
|||
|
||||
| Fedor |
|
|||
![]() Днепрянин ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2090 Регистрация: 8.2.2003 Где: Великий Репутация: нет Всего: 32 |
SPrograMMer ты не понял. Такую матрицу (200*200 of real) невозможно использовать в принципе из-за того, что память, которую она занимает составляет 200*200*6=240000 > 65535.
Если вернуться к условию, то матрица занимает 99*99*2=20000 байт. При вызове процедуры программа пытается запихнуть ее в стек, а размер стека у нас по умолчанию ~16000 байт. Вот и возникает ашипка. Если мы директивой компилятора увеличим размер стека например хотябы до 30000 то все будет уже ОК. -------------------- Мы - Днепряне. Мы всех сильней. |
|||
|
||||
| volvo877 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2073 Регистрация: 15.11.2004 Репутация: 2 Всего: 116 |
Есть еще 4-ый вариант - изменить заголовок функции find на:
Можно было бы просто передать по ссылке (var b:M), но для гарантии неизменности данных в массиве b пользуемся const Это сообщение отредактировал(а) volvo877 - 19.4.2005, 00:36 |
||||
|
|||||
| Zero |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
А теперь более точная формула для расёта нужного кол-ва байт в стеке: S=S1+548 где S ─ размер стека; S1 ─ max{размер памяти любого идентификатора} Т.е. в данном примере расчитывается так: S=99*99*2+548=20150; Т.е. Min размер стека можно указать таким
[Fedor: Добавлено в FAQ: http://vingrad.ru/DELPHI-FAQ-002496] Это сообщение отредактировал(а) Fedor - 20.4.2005, 17:29 |
||||
|
|||||
| Zero |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2169 Регистрация: 23.10.2004 Где: Россия, г. Рязань Репутация: нет Всего: 24 |
s_a_s_h_a ну типа если тебя бесят взякие ожжибки, ну типа пиши вот так в начале программы:
Добавлено @ 01:52 Ладно ето шутка, предыдущий способ самый правильный Это сообщение отредактировал(а) Zero - 19.4.2005, 01:54 |
|||
|
||||
![]()
|
| Правила форума "Delphi" | |
|
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |