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