![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с выделением памяти под большой массив
-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]создайте массив динамически