Форум: "Основная";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
ВнизПроблема с выделением памяти под большой массив Найти похожие ветки
← →
-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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c