2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 00:34 
Добрый день!
Пишу программу в Delphi, попытался создать двумерный массив 1000x1000 элементов (даже не Real, а Single). Программа компилируется, но при попытке присвоить какое-нибудь значение элементу массива выдаётся сообщение "Stack overflow"... Вроде размер не такой большой - миллион элементов, если тип Single, то каждый - 4 байта, а максимальный размер до 2 Gb, насколько я знаю. Или миллион элементов в массиве - это слишком много?
Кроме того, мне дальше придётся работать с трёхмерными массивами 1000x1000x1000, но тут я понимаю вообще шансов на успех нет?

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 01:38 
Не знаю, как это в Дельфи, но часто на размер стека есть гораздо более строгое ограничение, и обойти его можно, например, выделив массив в куче (heap) через New().

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 02:49 
Maxxxu

Размер стека можно задать в опциях компилятора (он выделяется в процессе компановки).

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 11:56 
Аватара пользователя
Можно и в коде программы указать опцию компилятора:
{$MAXSTACKSIZE сколько надо, с запасом}
Имейте в виду, что памяти на стеке может понадобиться вдвое больше, если Вы, например, передаёте массив из одной функции в другую по значению (без слов var и const), а то и ещё больше.

-- Вт ноя 30, 2010 14:10:24 --

Но лучше, как посоветовал venco, использовать динамическое выделение памяти. Например, так:
код: [ скачать ] [ спрятать ]
Используется синтаксис Delphi
type
  PArray = ^TArray;
  TArray = array[0..999, 0..999] of Double;

var
  pA: PArray;
begin
  GetMem(pA, SizeOf(TArray));
  try
    // Работаем с массивом
    pA^[999,999] := 1.0;
    // В функции можно передавать pA, не опасаясь переполнения стека
  finally
    FreeMem(pA, SizeOf(TArray));
  end;
end;
или используя динамические массивы:
Используется синтаксис Delphi
type
  TDynArray = array of array of Double;

var
  A: TDynArray;
begin
  SetLength(A, 1000);
  for i := 0 to 999 do
    SetLength(A[i], 1000);
  A[999,999] := 1.0;
  // В функции можно передавать A, не опасаясь переполнения стека,
  // т.к. память будет выделяться в куче
  // Кроме того, в функциях можно будет менять размеры массива
  // (если передавать его как var-параметр)
end;

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение01.12.2010, 00:47 
venco, dvorkin_sacha, worm2 - огромное вам спасибо за помощь! С двумерным случаем всё получилось, а вот с трёхмерным придётся саму программу как-то менять, с массивом 1000x1000x1000 наверное в принципе работать нельзя.

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение01.12.2010, 02:21 
Maxxxu в сообщении #382242 писал(а):
С двумерным случаем всё получилось, а вот с трёхмерным придётся саму программу как-то менять, с массивом 1000x1000x1000 наверное в принципе работать нельзя.
А может, не нужно весь массив в памяти держать? По частям, например, обрабатывать...

 
 
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение01.12.2010, 19:39 
File Mapping ?

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group