2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 00:34 


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

 Профиль  
                  
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 01:38 
Заслуженный участник


04/05/09
4593
Не знаю, как это в Дельфи, но часто на размер стека есть гораздо более строгое ограничение, и обойти его можно, например, выделив массив в куче (heap) через New().

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


04/11/10

141
Maxxxu

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

 Профиль  
                  
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение30.11.2010, 11:56 
Заслуженный участник
Аватара пользователя


01/08/06
3139
Уфа
Можно и в коде программы указать опцию компилятора:
{$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 


07/12/08
32
venco, dvorkin_sacha, worm2 - огромное вам спасибо за помощь! С двумерным случаем всё получилось, а вот с трёхмерным придётся саму программу как-то менять, с массивом 1000x1000x1000 наверное в принципе работать нельзя.

 Профиль  
                  
 
 Re: [Delphi/Pascal] Слишком большой массив?
Сообщение01.12.2010, 02:21 
Заслуженный участник


04/05/09
4593
Maxxxu в сообщении #382242 писал(а):
С двумерным случаем всё получилось, а вот с трёхмерным придётся саму программу как-то менять, с массивом 1000x1000x1000 наверное в принципе работать нельзя.
А может, не нужно весь массив в памяти держать? По частям, например, обрабатывать...

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


03/10/06
826
File Mapping ?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group