Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > тройной массив - stack overflow


Автор: pegorov 1.6.2009, 10:43
Есть сверхпримитивный код.
Код

procedure TForm1.Button1Click(Sender: TObject);
var
    cntr: array [0..255] of array [0..255] of array [0..255] of longint;
      i,j,k: byte;
begin
  for i:=0 to 255 do for j:=0 to 255 do for k:=0 to 255 do cntr[i][j][k]:=0;
end;

При выполнении ругается на переполнение стека. Из-за чего так может быть, я мозг уже сломал =)

Автор: Frees 1.6.2009, 10:52
потомучто cntr это стековая переменная и места в стеке ей не хватило

Код

var
    cntr: array [0..255] of array [0..255] of array [0..255] of longint;
procedure TForm1.Button1Click(Sender: TObject);
      i,j,k: byte;
begin
  for i:=0 to 255 do for j:=0 to 255 do for k:=0 to 255 do cntr[i][j][k]:=0;
end;

Автор: pegorov 1.6.2009, 10:58
Гран мерси, в понедельник утром башка не варит вообще =)

Автор: GN1 1.6.2009, 11:29
Проверил у себя на D09:
Код

procedure TForm1.btn1Click(Sender: TObject);
const
  a = 62;

var
  cntr: array [0..a] of array [0..a] of array [0..a] of longint;
  i,j,k: byte;
  b: UInt32; // longint

begin
  b := 1;        
  for i:=0 to a do
    for j:=0 to a do
      for k:=0 to a do
      begin
        b := b + 1;
        cntr[i][j][k] := 0;
      end;
  ShowMessage(IntToStr(b * 4));
end;


В настройках компилятора стоит "Максимальный размер стека"- 1048580 байт

Переменная UInt32 (longint) занимает в памяти 4 байта, т.е.:
62 - 1000192
63 - 1048580 (> 1048576)

Компилятор тебе русским языком и говорит, что стек переполнен smile

Кста, как правильно на русском: стек, стэк или стёк?

Добавлено через 51 секунду
Опоздал   smile 

Автор: Alexeis 1.6.2009, 11:38
256 * 256 * 256 * 4 = 64 Мб. В принципе, можно в настройках проекта увеличить размер стека. 

Автор: CodeMonkey 1.6.2009, 11:45
Цитата
В принципе, можно в настройках проекта увеличить размер стека.

В данном случае можно, но не нужно. А то так можно дойти до...   был тут один орех, которому всё было мало. Так вместо того, чтобы использовать динамические массивы, он вписал минимальный размер стека в 50 Гб (не, в окошке "плохая" Delphi не дала - так он директивой вписал в код, причём в каждом модуле) и удивлялся: а чего это его программа на Vista не работает? Не иначе как Билл Гейтс виноват!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)