Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с выделением памяти под большой массив


-Mouse- ©   (2007-09-27 20:23:00) 

Добрый день ув. мастера. Столкнулся с такой проблемой:
При запуске кода с такой строчкой
ResIndexes : array [1 .. 2000] of array [1 .. 3500] of Integer;
пишет:
Project Test.exe raised exception class EStackOverflow with message 'Stack OverFlow'.

Попытка указать (Project->Options->Linker->MaxStackSize) большее количество используемой памяти приводит к сообщению:
Max stack size must be an Integer between 65536 and 16777216

А мне получается под массив надо 28 метров памяти. Подскажите пожалуйста как заставить работать такую программу?
Заранее спасибо.


Kolan   (2007-09-28 16:11:00) [1]

> Кстати если врубиться в суть

В суть я врубаюсь.

Не обратил внимание на:
for i:= 0to   100do
   SetLength(a[i],3500);

for i:= 1000to   1100do
   SetLength(a[i],3500);


Anatoly Podgoretsky   (2007-09-28 15:23:00) [2]

> Anatoly Podgoretsky  (28.09.2007 15:22:11)  [11]

Кстати если врубиться в суть, то окажется что это не массив, массив как раз одномерный, а каждый элемент массива содержит в себе другой массив. Мозги сразу прояснятся.


Anatoly Podgoretsky   (2007-09-28 15:22:00) [3]

> Kolan  (28.09.2007 15:13:10)  [10]

Значить не прямоугольный, а ровно столько, сколько нужно в данной строке массива.


Kolan   (2007-09-28 15:13:00) [4]

> В этом случае создается плотный двумерный массив (not rectangular)
> , в отличии от SetLength(a,M,N).

Что значит плотный массив?


Jeer   (2007-09-28 14:28:00) [5]


> vpbar ©   (27.09.07 20:49) [4]


Справку всегда полезно читать, тем более что твой вариант тоже может быть полезен:

var a:array of array of integer;
//
 SetLength(a,2000);

 for i:=0 to  100 do
    SetLength(a[i],3500);

 for i:=1000 to  1100 do
    SetLength(a[i],3500);

В этом случае создается плотный двумерный массив (not rectangular), в отличии от SetLength(a,M,N).


Anatoly Podgoretsky   (2007-09-27 23:23:00) [6]

> vpbar  (27.09.2007 22:36:07)  [7]

На конкретный код могу сказать конкретно - в данном случае массив размещен на стеке.
Нечего делать большим объектам в стеке.
Понимай не передавай через стек относится и к размещению.


vpbar   (2007-09-27 22:36:00) [7]

>>Anatoly Podgoretsky ©   (27.09.07 21:23) [6]
А при чем тут ПЕРЕДАЧА через стек? Вот в этом коде передачи вроде нет, а переполнение есть.
procedure TForm1.Button1Click(Sender: TObject);
var a:array[0..2000] of array[0..4000] of integer;
begin
a[1000,1000]:=10;
end;
Тогда уж такой совет "не размещай на стеке";

ЗЫ Как то непривычно спорить с таким мастаком. Кажется что я не прав, но всеже .... истина дороже.


Anatoly Podgoretsky   (2007-09-27 21:23:00) [8]

> -Mouse-  (27.09.2007 20:23:00)  [0]

Не передавай через стек, или ссылка на массив, или динамический массив, что и будет ссылкой.


-Mouse-   (2007-09-27 21:13:00) [9]

Большое спасибо.


vpbar   (2007-09-27 20:49:00) [10]

хм. незнал. во как полезно справку всю читать


Kolan   (2007-09-27 20:46:00) [11]

> SetLength(a,2000);

SetLength(a,2000,3500);


vpbar   (2007-09-27 20:38:00) [12]

var a:array of array of integer;
   i:integer;
begin
SetLength(a,2000);
for i:=Low(a) to  High(a) do    SetLength(a[i],3500);
a[1000,3000]:=100; // test
end


vpbar   (2007-09-27 20:33:00) [13]

создайте массив динамически


Наверх

Титульная страница Поиск, карта сайта Написать письмо