Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.16;
Скачать: CL | DM;

Вниз

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

 
-Mouse-   (2007-09-27 20:23) [0]

Добрый день ув. мастера. Столкнулся с такой проблемой:
При запуске кода с такой строчкой
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 метров памяти. Подскажите пожалуйста как заставить работать такую программу?
Заранее спасибо.


 
vpbar ©   (2007-09-27 20:33) [1]

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


 
vpbar ©   (2007-09-27 20:38) [2]

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


 
Kolan ©   (2007-09-27 20:46) [3]

> SetLength(a,2000);

SetLength(a,2000,3500);


 
vpbar ©   (2007-09-27 20:49) [4]

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


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

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


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

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

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


 
vpbar ©   (2007-09-27 22:36) [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 23:23) [8]

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

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


 
Jeer ©   (2007-09-28 14:28) [9]


> 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).


 
Kolan ©   (2007-09-28 15:13) [10]

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

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


 
Anatoly Podgoretsky ©   (2007-09-28 15:22) [11]

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

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


 
Anatoly Podgoretsky ©   (2007-09-28 15:23) [12]

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

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


 
Kolan ©   (2007-09-28 16:11) [13]

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

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

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.12.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
11-1181309742
heilong
2007-06-08 17:35
2007.12.16
проблема с LVItemHeight в TKOLListView


15-1195416112
Torry
2007-11-18 23:01
2007.12.16
www.torry.net - 11 лет


15-1195090718
Riply
2007-11-15 04:38
2007.12.16
Разделы на CD/DVD - диске.


15-1195126234
БарЛог
2007-11-15 14:30
2007.12.16
Домен контроллер на windows 2003


4-1180611760
MiHoY
2007-05-31 15:42
2007.12.16
декодер сигналов ДУ