Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/47: Рейтинг темы: голосов - 47, средняя оценка - 4.70
37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
1

Стек переполняется и переполняется...

10.03.2012, 18:33. Показов 8594. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Короче говоря, в ходе написания программы наткнулся на то, что все время вылетает ошибка о том, что стек переполнен:
---------------------------
Debugger Exception Notification
---------------------------
Project Modeling.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Опытным путем заметил, что возникает вот в этом месте:
Delphi
1
2
3
4
for j:=1 to ColCount-1 do
    for m:=1 To n do
     if (mas[j]>=xmin+deltax*(m-1)) and (mas[j]<xmin+deltax*m) then
       stan[j,m]:=1;
помогите кто чем может... уже полдня парюсь...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2012, 18:33
Ответы с готовыми решениями:

Стек и очередь. Задачи никогда не попадают в стек
Условие: Система состоит из двух процессоров P1 и P2 и двух очередей F1, F2 и стека S. В систему...

Дан стек символов. Преобразовать стек, оставив в нем из группы подряд идущих символов только один
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics,...

Переполняется стек
Вот код: #include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;algorithm&gt; using namespace std; ...

Почему переполняется стек
Написал программу, но не пойму почему переполняется стек. Суть программы - возведение в степень ч/з...

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
Цитата Сообщение от RobertMenus Посмотреть сообщение
помогите кто чем может... уже полдня парюсь...
Покажи хотя бы всю процедуру, или лучше весь проект.
Цитата Сообщение от RobertMenus Посмотреть сообщение
for j:=1 to ColCount-1 do
* * for m:=1 To n do
* * *if (mas[j]>=xmin+deltax*(m-1)) and (mas[j]<xmin+deltax*m) then
* * * *stan[j,m]:=1;
Ту вроде все в порядке.
Вопрос откуда берется n?
0
37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
11.03.2012, 23:15  [ТС] 4
полностью оно выглядит так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
procedure TForm1.btn1Click(Sender: TObject);
var mas:array [1..10000] of Integer; //масив строк
    stan:array [1..10000,1..10000] of Integer;  //масив состояний
    I,j:Integer;     
    k,l:Integer;     
    m: Integer;
    c,c2:Integer;  
    deltax:Integer;
    n: Integer;     //количество состояний
    xmax,xmin:Integer;
begin
 
with strngrd1 do
for i:=1 to RowCount-1 do
 begin
 
   for j:=1 to ColCount-1 do
   mas[j]:=StrToInt(Cells[j,i]);
 
   for k:=1 to ColCount-1 do
   begin
    c2:=k;
    for l:=k+1 to ColCount-1 do
     if mas[c2]>mas[l] then c2:=l;
     c:=mas[k];mas[k]:=mas[c2];mas[c2]:=c;
   end;
   
   xmax:=mas[ColCount-1];
   xmin:=mas[1];
   if Trim(edt1.Text)='' then edt1.Text:='10';
   deltax:=StrToInt(edt1.Text);
   n:=Trunc((xmax-xmin)/deltax)+1;
   for j:=1 to 10000 do
   for m:=1 to 10000 do
    stan[j,m]:=0;
   for j:=1 to ColCount-1 do
    for m:=1 To n do
     if (mas[j]>=xmin+deltax*(m-1)) and (mas[j]<xmin+deltax*m) then
       stan[j,m]:=1;
    mmo1.Lines.Add('------------------------');
 end;
end;
я уже и с динамическими масивами пробовал, и со статическими...
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 Килобайт - конечно же будет переполнение стека.
---
Причём, менеджер памяти выделяет память для статических массивов по мере его (массива) использования. - С помощью механизма виртуализации адресов. Например, если объявить метод так:
Delphi
1
2
3
4
5
6
7
8
procedure TForm1.btn1Click(Sender: TObject);
const
  M = 10000;
var
  stan : array[1..M,1..M] of Integer;
  i, j : Integer;
begin
end;
то при выполнении метода переполнения стека не будет - потому что нет обращений к элементам массива и, соответственно, для массива память не выделяется.
Если же в этом методе задать цикл по элементам массива, например, так:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure TForm1.btn1Click(Sender: TObject);
const
  M = 10000;
var
  stan : array[1..M,1..M] of Integer;
  i, j : Integer;
begin
  for i := 1 to M do
  for j := 1 to M do Stan[i, j] := 1;
end;
то получим ошибку переполнения стека.
---
Вывод такой - надо использовать динамические массивы (array of array of Integer). Либо в опциях компановщика (Linker) задать очень большой размер для стека. Но лучше, конечно, динамические массивы использовать.
2
37 / 36 / 4
Регистрация: 08.12.2010
Сообщений: 206
12.03.2012, 17:38  [ТС] 7
при попытке увеличить размер стека в 10 раз и уменьшить массив до
Delphi
1
stan:array [1..100,1..100] of Integer;
получил
---------------------------
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
Цитата Сообщение от RobertMenus Посмотреть сообщение
raised too many consecutive exceptions: 'access violation at 0x00000000: read of address 0x00000000'.
Это множественные ошибки при попытке доступа по нулевому адресу. Здесь надо разные участки кода проверять.
И ещё про размер стеков - если увеличен размер для отдельного стека (Min stack size), то может понадобиться увеличить и общий размер всех стеков (Max stack size). - Например, с расчётом на 10 стеков.
---
Ещё раз повторюсь - в задаче, всё-таки, наверное, лучше перейти на динамические массивы.
0
13.03.2012, 01:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2012, 01:43
Помогаю со студенческими работами здесь

Программный стек переполняется, улетая на орбиту
Работаю с рекурсией впервые, при выполнении программы выдает ошибку переполнения стека: Var...

Память переполняется
Вот код. Не могу понять. Все равно память переполняется и прога не работает. protected void...

не переполняется динамический массив
Заметил странную штуку: при заполнении динамического массива в цикле, когда счётчик становится...

Почему массив не переполняется?
Вот в одной книге есть задание создать вектор и скопировать элементы в массив. Почему массив не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru