37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
|
||||||
1 | ||||||
Стек переполняется и переполняется...10.03.2012, 18:33. Показов 8594. Ответов 7
Метки нет (Все метки)
Короче говоря, в ходе написания программы наткнулся на то, что все время вылетает ошибка о том, что стек переполнен:
--------------------------- Debugger Exception Notification --------------------------- Project Modeling.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue. --------------------------- OK Help --------------------------- Опытным путем заметил, что возникает вот в этом месте:
0
|
10.03.2012, 18:33 | |
Ответы с готовыми решениями:
7
Стек и очередь. Задачи никогда не попадают в стек Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один Переполняется стек Почему переполняется стек |
26 / 26 / 2
Регистрация: 18.08.2010
Сообщений: 186
|
|
10.03.2012, 19:16 | 2 |
может,не использовать локальные переменные?
а можешь весь код показать?
0
|
401 / 312 / 74
Регистрация: 17.03.2010
Сообщений: 1,119
|
|
10.03.2012, 22:31 | 3 |
Покажи хотя бы всю процедуру, или лучше весь проект.
Ту вроде все в порядке. Вопрос откуда берется n?
0
|
37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
|
||||||
11.03.2012, 23:15 [ТС] | 4 | |||||
полностью оно выглядит так:
0
|
36 / 36 / 8
Регистрация: 10.11.2011
Сообщений: 94
|
|
12.03.2012, 08:41 | 5 |
RobertMenus, у тебя тройной цикл. посмотри чему равно ColCount и RowCount тогда уже и смотри что выходит за пределы. возможно у тебя не все впорядке с циклами
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|||||||||||
12.03.2012, 09:46 | 6 | ||||||||||
Переменные для процедур и методов размещаются на стеке. И если переменные занимают большой объём памяти, то стек вполне может переполниться.
Например, массив типа array [1..10000,1..10000] of Integer занимает в памяти: 10000*10000*4 = 400 Килобайт. Открываем через главное меню Delphi: Project - Options... - закладка Linker. На этой закладке по умолчанию глубина для каждого стека задана такой: Min stack size: $4000 = 16384 = 16 килобайт. - Это разрешённая глубина для отдельного стека. Суммарно для всех стеков разрешён размер: Maz stack size: $100000 = 1048576 = 1 МБайт. --- Т. е., размер по умолчанию для отдельного стека равен всего лишь 16 килобайт, а у нас размер массива в памяти равен 400 Килобайт - конечно же будет переполнение стека. --- Причём, менеджер памяти выделяет память для статических массивов по мере его (массива) использования. - С помощью механизма виртуализации адресов. Например, если объявить метод так:
Если же в этом методе задать цикл по элементам массива, например, так:
--- Вывод такой - надо использовать динамические массивы (array of array of Integer). Либо в опциях компановщика (Linker) задать очень большой размер для стека. Но лучше, конечно, динамические массивы использовать.
2
|
37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
|
||||||
12.03.2012, 17:38 [ТС] | 7 | |||||
при попытке увеличить размер стека в 10 раз и уменьшить массив до
--------------------------- Debugger Fault Notification --------------------------- Project D:\Projects\Âîâàíñüêå\Modeling\Modeling.exe raised too many consecutive exceptions: 'access violation at 0x00000000: read of address 0x00000000'. Process Stopped. Use Step or Run to continue. --------------------------- OK Help --------------------------- а жаль. придется, пожалуй динамические массивы использовать.
0
|
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
13.03.2012, 01:43 | 8 |
Это множественные ошибки при попытке доступа по нулевому адресу. Здесь надо разные участки кода проверять.
И ещё про размер стеков - если увеличен размер для отдельного стека (Min stack size), то может понадобиться увеличить и общий размер всех стеков (Max stack size). - Например, с расчётом на 10 стеков. --- Ещё раз повторюсь - в задаче, всё-таки, наверное, лучше перейти на динамические массивы.
0
|
13.03.2012, 01:43 | |
13.03.2012, 01:43 | |
Помогаю со студенческими работами здесь
8
Программный стек переполняется, улетая на орбиту Память переполняется не переполняется динамический массив Почему массив не переполняется? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |