Срабатывает обработчик, в нем вызывается Next
, это вызывает срабатывание обработчика… и так до бесконечности, пока не забивается стек.
Как костыль — можно завести булеву переменную для блокировки обработчика: в начале обработчика проверять флаг, если его значение false
— выставлять в true
и выполнять остальную часть, в противном случае (если true
) — выходить. Тогда при попытке повторно зайти в обработчик его выполнение тут же прекратится. Переменная должна быть объявлена не в самом обработчике, а выше (в модуле, в классе).
Другой костыль — в начале обработчика, выставлять вашему набору данных AfterScroll := nil
, а в конце — возвращать обратно AfterScroll := ...
.
В обоих вариантах код обработчика стоит завернуть в try-finally
и разблокировку выполнять в блоке finally
. В противном случае, при возникновении исключения, вы останетесь без обработчика.
А вообще лучше разобраться, что у вас там с вычисляемым полем.
I’m getting an EStackOverflow when creating a packed struct in Borland Delphi 7.0
I want to do the following:
Type
T4 = packed record
VT : integer;
SKT : byte;
end;
T3 = packed record
O : boolean;
TT4 : array of T4;
end;
T2 = packed record
con : boolean;
TT3 : array [64..90,64..90] of T3;
End;
TTT = array [64..90,64..90] of T2;
procedure TForm1.Button1Click(Sender: TObject);
var
Arr : TTT;
begin
Arr[64,64].con:=false;
end;
But when I run the program and click the button, I get an EStackOverflow error on the begin
line of Button1Click
.
Can someone help me?
Blorgbeard
101k48 gold badges226 silver badges271 bronze badges
asked Mar 31, 2011 at 13:14
3
Simple, the created items are too big for the default stack size. Either increase that when creating the thread or allocate the memory on the heap. Either way works.
Just do the math on it:
sizeof(T4) = 5
sizeof(T3) = 5
sizeof(T2) = 3646 // if I'm right
sizeof(TTT)= 2657934
answered Mar 31, 2011 at 13:20
0xC0000022L0xC0000022L
20.4k9 gold badges83 silver badges150 bronze badges
1
You can partially solve this by increasing your stack size in your project options.
But you shouldn’t:
Don’t create those huge structures on the stack. That’s what the heap is for, not the stack.
answered Mar 31, 2011 at 15:05
leklerk 1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
||||
1 |
||||
09.01.2013, 10:18. Показов 2643. Ответов 10 Метки нет (Все метки)
Добрый день! Подскажите пожалуйста, когда может появляться сообщение «Stack overflow» (исключение EStackOverflow)?
Здесь присваивается значение вычисляемому полю (оно исчезает в гриде всякий раз, как переходишь на другую строку). Метод Post не вызываю. т.к. мне не нужно отправлять в БД, нужно только чтобы показывалось в гриде. Я использую LockType=ItBatchOptimistic (тогда данные в БД отсылаются только методом TADODataSet.UpdateBatch). В чем может быть ошибка?
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,723 |
|
09.01.2013, 10:29 |
2 |
В чем может быть ошибка? 1. Ты открыл НД, произошел автопереход на первую запись, возникло AfterScroll Дальше продолжать ? Или сам догадаешься ?
1 |
leklerk 1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
||||
09.01.2013, 10:52 [ТС] |
3 |
|||
Да, это верно, но почему-то, если убрать цикл и написать обработчик CalcFields:
то проблема остается…
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,723 |
|
09.01.2013, 10:58 |
4 |
Значит где-то в недрах HasRSTName ты так или иначе елозишь по записям этого НД.
0 |
1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
|
09.01.2013, 11:06 [ТС] |
5 |
HasRSTName это массив констант, смотри вверху кода…
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,723 |
|
09.01.2013, 11:15 |
6 |
смотри вверху кода В упор не вижу там никакого массива. Добавлено через 6 минут
const HasRSTName А, ты про этот .. физическое , а не вычисляемое поле ?
0 |
leklerk 1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
||||
09.01.2013, 11:30 [ТС] |
7 |
|||
Так а ‘НаличРСТ’ — это, надо понимать, физическое , а не вычисляемое поле ? Нет, ‘НаличРСТ’ как раз вычисляемое, а физическое — ‘НаличиеРСТ’. Добавлено через 1 минуту
Зато вижу First и Next, коих ни в коем случае нельзя вызывать ни в AfterScroll ни в CalcFields Я уже убрал First и Next (мой второй кусок кода):
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,723 |
|
09.01.2013, 11:32 |
8 |
уже убрал First и Next Что тогда осталось в AfterScroll ?
0 |
leklerk 1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
||||
09.01.2013, 11:50 [ТС] |
9 |
|||
Ничего, заменил на CalcFields:
0 |
2649 / 2270 / 279 Регистрация: 24.12.2010 Сообщений: 13,723 |
|
09.01.2013, 12:00 |
10 |
Какие еще события обрабатываешь и как ?
1 |
1 / 1 / 1 Регистрация: 23.02.2012 Сообщений: 74 |
|
09.01.2013, 12:06 [ТС] |
11 |
Спасибо за помощь, проблема решена, забыл убрать код из AfterScroll.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
09.01.2013, 12:06 |
Помогаю со студенческими работами здесь Ошибка «Floating point overflow»
Из слов «Работа», «крест», «тон» составить фразу «Кто не работает, тот не ест» и определить ее длину На форме располагаются компоненты: редактор Edit; линейка ScrollBar; радионабор с опциями «Цветы», «Деревья», «Рыбы», «Звери» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 11 |
← →
scout
(2003-05-03 20:31)
[0]
Ну беда!!! При запуске проекта вылетает сообщение:
Project lala.exe raised exception class EStackOverflow with message «Stack Overflow». Process stopped.
Что это такое и как с этим бороться?
← →
Anatoly Podgoretsky
(2003-05-03 20:49)
[1]
Бережнее относиться к стеку, не бездонный.
← →
default
(2003-05-03 21:36)
[2]
Anatoly Podgoretsky © (03.05.03 20:49)
Юмор однако!
И дно у стека есть хе
← →
Aldor
(2003-05-03 22:04)
[3]
Означает переполнение стека. Надо смотреть код. Стек заполняется, например, при объявлении локальных переменных и вызовах процедур. Наиболее частая причина переполнения стека — слишком глубокая рекурсия, возможно без условия выхода.
Иногда ошибку можно найти, используя отладочное окно Call Stack
(View -> Debug Windows -> Call Stack). Удачи!
← →
scout
(2003-05-04 21:45)
[4]
> Наиболее частая причина переполнения стека — слишком глубокая рекурсия, возможно без условия выхода.
Ну ты и загнул попроще нельзя.
← →
Arch-vile
(2003-05-04 23:19)
[5]
>
> Наиболее частая причина переполнения стека — слишком глубокая >рекурсия, возможно без условия выхода.
>Ну ты и загнул попроще нельзя.
рекурсия — обратный вызов процедуры, т.е. когда она сама себя вызывает. Например
procedure xxx(i:integer);
begin
xxx(i);
end;
вот тебе и обратный вызов, рекурсия. может быть через 2-3 функции-процедуры:
procedure xxx(i:integer);
begin
yyy(i);
end;
procedure yyy(i:integer);
begin
xxx(i);
end;
← →
Arch-vile
(2003-05-04 23:21)
[6]
ну типа того, может быть сложнее, и не обязательно
i
в качестве переменной
← →
k-man
(2003-05-05 18:35)
[7]
К вопросу понимания стека…
Попытаюсь предположить почему при глубокой рекурсии переполнятся стек.
Насколько я знаю 1)стек не бездонный.
2)в него при вызове процедур ложатся все (
не только они но все же по-моему они здесь стек и забивают)
К вопросу понимания стека…
Попытаюсь предположить почему при глубокой рекурсии переполнятся стек.
Насколько я знаю 1)стек не бездонный.
2)в него при вызове процедур ложатся все передаваемые аргументы(не только они но все же по-моему они здесь стек и забивают).
Может быть поэтому при глубокой рекурсии стек переполняется.
Так как эти параметров, точек возврата и т.д. становится слишком много..
Хотя это лишь предположение…. Вполне возможно ошибочное..
← →
Aldor
(2003-05-05 20:16)
[8]
2k-man
Все правильно, в стеке резервируется место для аргументов функции, возвращаемого значения функции, всех локальных переменных функции, и так же еще место для указателя, имеющего «внутреннее» предназначение. Таким образом можно примерно подсчитать, сколько места в стеке займет рекурсия заданной глубины.
← →
k-man
(2003-05-05 22:00)
[9]
А вот что интересно: От чего зависит размер стека?
И можно ли его как-то контролировать? Лично я сомневаюсь…
← →
Palladin
(2003-05-06 14:17)
[10]
> k-man © (05.05.03 22:00)
от установки
{$M}
← →
Alek Aaz
(2003-05-07 03:54)
[11]
ИМХО. Если в алгоритме есть логическая ошибка {$M} не поможет. Программа засрет все что можно.
← →
Palladin
(2003-05-07 08:47)
[12]
естественно
← →
Aldor
(2003-05-07 09:36)
[13]
Как? У ваc еще нет нового процессора Intel Pentium V, выполняющего бесконечный цикл за 6 секунд? :)))
← →
k-man
(2003-05-07 12:38)
[14]
> Как? У ваc еще нет нового процессора Intel Pentium V, выполняющего
> бесконечный цикл за 6 секунд? :)))
Слышал что это из рекламы суперкомпа Cray.
← →
Aldor
(2003-05-07 21:51)
[15]
2k-man
Не важно, это просто шутка
← →
Aldor
(2003-05-07 21:51)
[16]
2k-man
Неважно, это просто шутка
← →
k-man
(2003-05-07 22:34)
[17]
Неплохая шутка-)
Форум программистов Vingrad
Модераторы: Poseidon, Snowy, bems, MetalFan
Страницы: (2) [Все] 1 2 |
Поиск: |
|
Опции темы |
VTK |
|
||
Новичок Профиль Репутация: нет
|
Проект вызвал исключение EStackOverflow с сообщением ‘Stack Overflow’ как решить проблему??? Как быть??? Добавлено @ 10:19 |
||
|
|||
JUmPER |
|
||||
Бывалый Профиль Репутация: нет
|
не совсем понял: переполнение происходит при компиляции?
вот и ответ =)
——————— Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной |
||||
|
|||||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Извините за тупость… А какой ответ-то??? |
||
|
|||
JUmPER |
|
||
Бывалый Профиль Репутация: нет
|
не ставить TeeChart6 =) ——————— Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной |
||
|
|||
Alexeis |
|
||
Амеба Профиль
Репутация: 109
|
VTK, в какой момент это происходит? ——————— Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||
|
|||
Rennigth |
|
||||
Эксперт Профиль
Репутация: 49
|
VTK, Если во время компиляции… ——————— (* Honesta mors turpi vita potior *) |
||||
|
|||||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Ну попробовал Build Project, но чего-то ничего особенного он мне не сказал… |
||
|
|||
Alexeis |
|
||
Амеба Профиль
Репутация: 109
|
Тогда нужно пошагово отлаживать, до тех пор пока не будет найдена строка вызывающая исключение… ——————— Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Я это уже пробовал, но моего опыта не хватает, чтобы отследить ошибку…. |
||
|
|||
Alexeis |
|
||
Амеба Профиль
Репутация: 109
|
Ну тогда есть как минимум 3 выхода ——————— Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Вариантс экстрасенсом явно не подходит! alexeis1, послал тебе на мыло, могу выслать всем желающим помочь… |
||
|
|||
Alexeis |
|
||
Амеба Профиль
Репутация: 109
|
Так экзешник зачем было архивировать, если кто-то будет дебажить, то все равно прийдется компилировать, так что в данном случае он был лишним весом. Присоединённый файл ( Кол-во скачиваний: 4 ) ——————— Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Путем многочисленных иттераций процесса компиляции выяснилось, что сообщение вылетает во время создания формы на которой расположен объект QReport и QRChart, на том шаге, когда компонентам QReporta присваиваются адреса ячеек памяти…. |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Попробовал увеличить размер стека директивой {$M 16384,2147483647}, однако вылезла ошибка «Не в состоянии создать процесс: параметр задан неправильно», но в Drkb черным по белому написано, что максимальный размер стека равен 2147483647 |
||
|
|||
Matematik |
|
||
Эксперт Профиль Репутация: 17
|
Больную голову лечишь топором |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Я это и так знаю, QRChart, но без него не могу…. Это сообщение отредактировал(а) VTK — 14.11.2006, 15:48 |
||
|
|||
Rennigth |
|
||
Эксперт Профиль
Репутация: 49
|
И не будет. Разницы никакой если у тебя кто-то болеет бесконечной рекурсией. PS: Могу ошибаться, но мои телепатические способности почему-то подсказывают мне что причину ты найти не можешь по причине того что дебажишь ты без «debug dcu», в Project options -> Compiler галку поставь. ——————— (* Honesta mors turpi vita potior *) |
||
|
|||
Matematik |
|
||
Эксперт Профиль Репутация: 17
|
Может всетаки в программе ошибка, а эти компоненты становятся последней каплей, которая переполняет стек. |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
Зарылся дальше, выяснилось, что ошибка вылетает во время исполнения кода unit Classes в процедуре:
на строке for I := 0 to G.Count — 1 do TComponent(G[I]).Loaded; когда i=125… |
||
|
|||
VTK |
|
||
Новичок Профиль Репутация: нет
|
А вот видимо и ответ:
Значит нечего сделать нельзя??? |
||
|
|||
Vladimir_ |
|
||
Новичок Профиль Репутация: нет
|
Здравствуйте, вот обработчик :
в самом первом vare описал массив : Я и все realы заменил extendedами…. уверен что зацикливания не происходит, т.к если я поставлю размер выборки не 50 а допустим 5-10, шаг обучения 0,1 и среднеквадратичную ошибку 0,1 — отработает без проблем, сообственно это было пояснение к моей программе, которая прилагается…. Обьясните в чем казус,что нужно сделать ,чтобы исправить ситуацию, спасибо! Присоединённый файл ( Кол-во скачиваний: 2 ) |
||
|
|||
Страницы: (2) [Все] 1 2 |
|
Правила форума «Delphi: Общие вопросы» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) |
0 Пользователей: |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |