Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Массив из 5 и выше млн. элементов типа single-переполнение стека [D6, WinXP]


Страницы:   1 2

alexander_ua ©   (2005-07-21 18:11:00) 

В процедуре объявляю массив типа single, размерность - 5 млн. элементов. Программа компилируется, запускается. При попытке работать с массивом дает ошибку "Переполнение стека". Размер стека сделал максимально возможным, но это ничего не дало. Как лечить?


Anatoly Podgoretsky   (2005-07-22 12:02:00) [21]

alexander_ua   (22.07.05 11:55) [15]
Всего 72 мегабайта


evvcom   (2005-07-22 11:59:00) [22]


> Это почему же жуткая???

Флейм развел, а на вопросы по теме так и не ответил. Или ответы уже не нужны?


alexander_ua   (2005-07-22 11:55:00) [23]

2 evvcom
Это почему же жуткая??? 3000 тысячи неизвестных, соответственно и размерность получается 3000*3000


evvcom   (2005-07-22 11:42:00) [24]

Значит жуткая система. Для решения одного единственного уравнения? Одной единственной размерности? Или все же универсальная какая-то программа для решения таких уравнений различных размерностей?


alexander_ua   (2005-07-22 11:33:00) [25]

2 Гаврила
Массив совсем не жуткий - матрица 3000*3000 для решения системы линейных алгебраических уравнений.


Гаврила   (2005-07-21 19:16:00) [26]

Что за жуткий размер массива?
"С запасом" чтоли сразу выделаешь?


Юрий Зотов   (2005-07-21 18:28:00) [27]

> alexander_ua   (21.07.05 18:20) [7]

А что более предпочтительно? Глобальное обьявление или динамический массив?

Если важнее скорость, то предпочтительнее глобальный статический массив (тогда не будет тратиться время на операции по выделению и освобождению памяти). Если же важнее память, то предпочтительнее локальный динамический массив (он будет существовать только во время выполнения процедуры, где он объявлен).


alexander_ua   (2005-07-21 18:23:00) [28]

ОК, спасибо за советы, будем пробовать.
Ох, люблю я этот форум, всегда умные люди быстро и качественно ответят и подскажут.
Спасибо!


Fay   (2005-07-21 18:22:00) [29]

2 alexander_ua   (21.07.05 18:20) [7]
Объявлять нужно там, где используется.


Юрий Зотов   (2005-07-21 18:22:00) [30]

> alexander_ua   (21.07.05 18:18) [4]

> И ограничений на размер уже не будет?

Переменная типа "динамический массив" - это, по сути, указатель. Он и будет храниться в стеке - то есть, всего 4 байта. Сам же массив после SetLength будет размещен уже не в стеке, а в динамической памяти. Ограничения на него, конечно, все равно есть, но они уже совсем другие - 2 гигабайта на всю программу.


alexander_ua   (2005-07-21 18:20:00) [31]

А что более предпочтительно? Глобальное обьявление или динамический массив?


Fay   (2005-07-21 18:19:00) [32]

2 alexander_ua   (21.07.05 18:11)
type
 PYourArray = ^TYourAray;
 TYourArray = packed array[0..0] of Single;
var
 p : PYourArray;
 i : Integer;
begin
 GetMem(p, SizeOf(Single) * 5000000);
 for i := 0 to 4999999 do
   p^[i] := 1.234;
 FreeMem(p);
end;


vrem   (2005-07-21 18:18:00) [33]

объявлять глобально, а не в функции


alexander_ua   (2005-07-21 18:18:00) [34]

2 Юрий Зотов
И ограничений на размер уже не будет?


alexander_ua   (2005-07-21 18:17:00) [35]

В смысле исправление? Переполнение стека возникает как только я начинаю обращаться к массиву, ну т.е. как только дело доходит к примеру до a[1]:=1; - переполнение стека.


Stakan   (2005-07-21 18:16:00) [36]

Вносить справления в код работы с массивом.


Юрий Зотов   (2005-07-21 18:16:00) [37]

Сделать массив динамическим.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо