jaguarchuk 0 / 0 / 0 Регистрация: 25.03.2012 Сообщений: 20 |
||||
1 |
||||
19.06.2012, 23:03. Показов 7818. Ответов 5 Метки нет (Все метки)
Ну ни как не хочет работать
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
19.06.2012, 23:03 |
Ответы с готовыми решениями: Ошибка stack overflow Stack is overflow в игре ошибка Overflow Stack Stack overflow в чате 5 |
421 / 351 / 19 Регистрация: 14.05.2012 Сообщений: 1,437 |
|
19.06.2012, 23:23 |
2 |
Что именно не работает?Выдает ошибку, или еще что?…
0 |
0 / 0 / 0 Регистрация: 25.03.2012 Сообщений: 20 |
|
19.06.2012, 23:34 [ТС] |
3 |
Что именно не работает?Выдает ошибку, или еще что?… ошибка же stack overflow
0 |
421 / 351 / 19 Регистрация: 14.05.2012 Сообщений: 1,437 |
|
19.06.2012, 23:41 |
4 |
ошибка Overflow Stack смотри здесь Добавлено через 36 секунд
0 |
429 / 337 / 36 Регистрация: 31.05.2011 Сообщений: 1,156 |
|
19.06.2012, 23:41 |
5 |
Ошибка видимо в другом месте кода
0 |
Одиночка 3942 / 1867 / 337 Регистрация: 16.03.2012 Сообщений: 3,880 |
||||
20.06.2012, 07:53 |
6 |
|||
Скорее всего в строке 12 выложенного кода компилятор интерпретирует p как функцию и происходит рекурсивное обращение к самой себе. Пиши так:
3 |
← →
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]
Неплохая шутка-)
В моей программе было 1000 циклов с массивами по 1000 элементов. Когда я увеличил кол-во циклов до 10000 циклов и массивы до 10000 элементов, программа при запуске цикла выдает ошибку Project1.exe raised exception class EStack Overflow with message Stack overflow. Process stopped. Use Step or Run to continue.
Что это значит? Как исправить переполнение стека и что это такое, переполнение стека? Возможно, в программме очень сложные рачеты, и ей не хватает мощности? Просто новый проект у Вас так не выдаст ошибку. Тут надо более сложные алгоритмы. Может кто встречался с такой ситуацией?
[ Это Сообщение было отредактировано mike в 2002-08-24 2252 ]
8 ответов
473
24 августа 2002 года
Azazell
49 / / 20.12.1999
stack overwlow в основном встречается при использовании рекурсии… штука жестокая… обычно свидетельствует о том, что программист забыл написать код выхода изи рекурсии, тогда функция вызывает сама себе, передавая параметры в стек, но если это происходит очень много раз… то стек переполняется.
а как у тебя эети циклы работают… почему именно 10000???
389
24 августа 2002 года
Dmitri
69 / / 20.08.2000
Но ведь при 1000 все работало, и рекурсии вроде я не ставил. Расчет очень сложный, но почему все зависит от кол-ва циклов и кол-ва элементов массивов?
442
24 августа 2002 года
HexoGenus
121 / / 20.03.2000
Что означают твои 10000 циклов без применения рекурсии???
неужели ты ручками написал 10000 раз
что то типа
for (int i=0; i<Count;i++) {…}
for (int j=0; j<Count;j++) {…}
for (int k=0; k<Count;k++) {…}
…
не верится…
или у тебя один цикл но он делает 10000 оборотов???
если так то не создаешь ли ты в процессе выполнения цикла какие либо объекты чем то типа new?
Тогда просто нужно не забывать уничтожать эти объекты при проходе каждого круга…
Если я тебя неправильно понял то дай хоть строки самого цикла в описательном виде…
а еще лучше выложи проблемный кусок исходника программы в инете и дай на него ссылку…
389
24 августа 2002 года
Dmitri
69 / / 20.08.2000
У меня олин большой цикл 10000 раз, new не использую. Причем при 1000 раз все работает, повышаю до 10000, не работает.
4
25 августа 2002 года
mike
3.7K / / 01.10.2002
А кусочек кода можно ?
389
25 августа 2002 года
Dmitri
69 / / 20.08.2000
Можно. Исходник занимает около 5000 строк, поэтому привожу смысл программы
Button OnClick
//очень много переменных, ну очень много,
штук 300 массивов с [10000] элементов
for(int i=0;i<10000;i++){
//расчет с использованием if-else, while, и тех переменных, которые мы объявили в начале
}
Если приведу весь код, легче не станет. Интересно, что если for(i<1000) и массивы на [1000] элементов, стек не переполняется…
389
25 августа 2002 года
Dmitri
69 / / 20.08.2000
Можно. Исходник занимает около 5000 строк, поэтому привожу смысл программы
Button OnClick
//очень много переменных, ну очень много,
штук 300 массивов с [10000] элементов
for(int i=0;i<10000;i++){
//расчет с использованием if-else, while, и тех переменных, которые мы объявили в начале
}
Если приведу весь код, легче не станет. Интересно, что если for(i<1000) и массивы на [1000] элементов, стек не переполняется…
Аноним
Попробуй цикл поместить в функцию(не __fastcall), а в ButtonClick вызывать эту функцию
Я работаю над приложением, в котором есть два списка. Я загружаю два списка со значениями, и когда я продолжаю щелкать элементы из списка, я получаю следующую ошибку во время отладки.
Запуск exe приводит к закрытию приложения. Иногда я получаю сообщение «Нарушение прав доступа».
Итак, что мне делать, чтобы избавиться от этой ошибки в моем приложении?
РЕДАКТИРОВАТЬ
..
В основной форме есть таймер, который обновляет все элементы управления timer_RefreshCOntrol (intervali 1).
когда editBox_one изменяется (значение), эта функция вызывается
Procedure TStringSetting.SetValue (const AValue : String);
Begin
...
If FValueControl <> Nil then
Begin
FValueControl.OnChange := VoidNotifyEvent;
FValueControl.Text := NewValue;
FValueControl.OnChange := EditChange; //<--here the stackoverflow error comes....
end;
end;
Procedure EditChange (Sender: TObject);
Begin
Value := FValueControl.Text;
If Not EditIsValid then FValueControl.Font.Color := clRed
else If Dirty then FValueControl.Font.Color := clBlue
else FValueControl.Font.Color := clWindowText;
If @OldCustomEditChange <> Nil then OldCustomEditChange(Sender);
end;`
the EditChange (Sender: TObject); <--keeps geting called and the stackoverflow error comes
EditChange
назначается в поле редактирования на FormCreate
EDIT2
Я не являюсь первоначальным разработчиком, я просто иногда возвращал код обратно, серьезный рефакторинг невозможен.
редактировать 3
Значение стека вызовов, но что такое «???»
EDIT 4
после прохождения @Cosmin Prund и @david
Я получил место, где начинается бесконечный зов
Procedure TFloatSetting.EditChange (Sender: TObject);
Begin
SkipNextOnChange := True;
Inherited EditChange(Sender);
IfValidThenStore(FValueControl.Text);
Inherited EditChange(Sender); {<-------This is where it start}
end;
Procedure TStringSetting.EditChange (Sender: TObject);
Begin
Value := FValueControl.Text;
If Not EditIsValid then FValueControl.Font.Color := clRed
else If Dirty then FValueControl.Font.Color := clBlue
else FValueControl.Font.Color := clWindowText;
If @OldCustomEditChange <> Nil then OldCustomEditChange(Sender); {<---this keeps calling Procedure TFloatSetting.EditChange (Sender: TObject);}
end;