Главная страница
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.019 c
15-1195087241
Саунд
2007-11-15 03:40
2007.12.16
асм в делфи


2-1195315615
X-Man
2007-11-17 19:06
2007.12.16
Клиент-Сервер тестирующая программа


15-1194973607
Cerberus
2007-11-13 20:06
2007.12.16
Статья или Исходник про архивацию в формате zip.


2-1195560917
_ant_
2007-11-20 15:15
2007.12.16
проблема с большими числами


15-1194877121
Игорь Шевченко
2007-11-12 17:18
2007.12.16
Новости CodeGear, ноябрь 2007