Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2010, 09:35   #1
Jor1k
Пользователь
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию Out of memory в динамическом массиве

Решается система из 6 дифуров, результаты записываются в динамический массив TResarray=array of array of extended. Решение прогоняется в цикле 3 раза для различных исходных данных и результаты записываются в массив типа Tresultat=array [0..2] of TResarray. Проблема заключается в переполнении массива out of memory при увеличении шага до 1000000.Программа начинает дико жрать оперативу. На утечку проверял, вроде нет ее. Каким образом можно избежать переполнения?

Затем массив типа TResultat необходимо передать в 3 stringgrid, это делается с помощью указателей или как-то иначе?

Код:
unit Variables_U;

interface
type

        TVarsArray = array of Extended; // вектор переменных включая независимую
        TInitArray = array of Extended; // вектор начальных значений
        TFunArray = array of function(var i:integer;VarsArray: TVarsArray ):Extended;
        // вектор функций
        TResArray = array of array of Extended; // матрица результатов
        TCoefsArray = array of Extended; // вектор коэффициетов метода
        TResult = array[0..2] of TResArray;
        TFunczi = array [0..2] of TFunArray;
 var
 Result: TResult; // матрица результатов включая независ. переменную


Function Runge_Kutt(  // метод Рунге-Кутта
        z:integer;
        Funczi:TFunczi; // массив функций
        First: Extended; // начальная точка по независимой координате
        Last: Extended; // конечная точка по независимой координате
        Steps: Integer; // число шагов по независимой координате
        InitArray: TInitArray; // вектор начальных значений
        var Res: TResArray // матрица результатов включая независ. переменную
         ):Word; // возвращаемое значение - код ошибки
var
        Num: Word; // число уравнений
        NumInit: Word; // число начальных условий
        Delt: Extended; // шаг разбиения
        Vars: TVarsArray; // вектор переменных включая независимую
        Vars2,Vars3,Vars4: TVarsArray; // значения перем. для 2-4 коэф.
        Coefs1: TCoefsArray; // вектор 1-ыx коэффициентов в методе
        Coefs2: TCoefsArray; // вектор 2 коэффициентов в методе
        Coefs3: TCoefsArray; // вектор 3 коэффициентов в методе
        Coefs4: TCoefsArray; // вектор 4 коэффициентов в методе
        I: Integer; // счетчик цикла по итерациям
        J: Word; // индекс коэфф метода
        K: Integer; // счетчик прочих циклов
begin
 Num:=Length(Funczi[0]); // узнаем число уравнений
 NumInit:=Length(InitArray); // узнаем число начальных условий
 If NumInit<>Num then
   begin
     Result:=100; // код ошибки 100: число уравнений не равно числу нач. усл.
     Exit;
   end;
 Delt:=(Last-First)/Steps; // находим величину шага разбиений
 SetLength(Res,Num+1,Steps+1); // задаем размер матрицы ответов с незав. перем.
 SetLength(Vars,Num+1); // число переменных включая независимую
 SetLength(Vars2,Num+1); // число переменных для 2-го коэф. включая независимую
 SetLength(Vars3,Num+1); // число переменных для 3-го коэф. включая независимую
 SetLength(Vars4,Num+1); // число переменных для 4-го коэф. включая независимую
 SetLength(Coefs1,Num); // число 1-ыx коэф. метода по числу уравнений
 SetLength(Coefs2,Num); // число 2-ыx коэф. метода по числу уравнений
 SetLength(Coefs3,Num); // число 3-иx коэф. метода по числу уравнений
 SetLength(Coefs4,Num); // число 4-ыx коэф. метода по числу уравнений
 // Начальные значения переменных:
 Vars[0]:=First;
 For K:=0 to NumInit-1 do Vars[K+1]:=InitArray[K];
 For J:=0 to Num do Res[J,0]:=Vars[J]; // первая точка результата
 For I:=0 to Steps-1 do // начало цикла иттераций
        begin
           For J:=0 to Num-1 do Coefs1[J]:=Funczi[z,J](z,Vars)*delt; // 1-й коэфф.
           // Находим значения переменных для второго коэф.
           Vars2[0]:=Vars[0]+delt/2;
           For K:=1 to Num do Vars2[K]:=Vars[K]+Coefs1[K-1]/2;
           For J:=0 to Num-1 do Coefs2[J]:=Funczi[z,J](z,Vars2)*delt; // 2-й коэф.
           // Находим значения переменных для третьго коэф.
           Vars3[0]:=Vars[0]+delt/2;
           For K:=1 to Num do Vars3[K]:=Vars[K]+Coefs2[K-1]/2;
           For J:=0 to Num-1 do Coefs3[J]:=Funczi[z,J](z,Vars3)*delt; // 3 коэфф.
           // Находим значения переменных для 4 коэф.
           Vars4[0]:=Vars[0]+delt;
           For K:=1 to Num do Vars4[K]:=Vars[K]+Coefs3[K-1];
           For J:=0 to Num-1 do Coefs4[J]:=Funczi[z,J](z,Vars4)*delt; // 4 коэфф.
           // Находим новые значения переменных включая независимую
           Vars[0]:=Vars[0]+delt;
           For K:=1 to Num do
           Vars[K]:=Vars[K]+(1/6)*(Coefs1[K-1]+2*(Coefs2[K-1]+Coefs3[K-1])+Coefs4[K-1]);
           // Результат  иттерации:
           For J:=0 to Num do Res[J,I+1]:=Vars[J];
        end; // конец итераций
 Result:=0; // код ошибки 0 - нет ошибок
end;
На форме при нажатии клавиши
for z := 0 to 2 do
  I:=Runge_Kutt(z,Funczi, First, Last, Steps, InitArray, Result[z]);

  ShowMessage('Код ошибки = '+IntToStr(I));

Последний раз редактировалось Stilet; 27.10.2010 в 16:58.
Jor1k вне форума Ответить с цитированием
Старый 27.10.2010, 11:58   #2
Gambler
Игрок
Форумчанин
 
Аватар для Gambler
 
Регистрация: 29.10.2006
Сообщений: 367
По умолчанию

если честно не вникал в код, но раз уж не хватает памяти - запроси побольше. Или в настройках проекта размер стека увеличь или в начале проги напиши {$M 10000000} вроде так
Жизнь всегда игра. Но смерть - не всегда поражение.

#define true (Math.random()>0.5) //Удачной отладки
Gambler вне форума Ответить с цитированием
Старый 27.10.2010, 12:38   #3
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

а через F7 не отследить? да и темку не правильно оформили
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 27.10.2010, 13:09   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

1'000'000 * 10 * 8 = 80'000'000 байт или 80 Мб.

Вроде должно хватать.

Ещё в программе SetLength есть? Для TResult, например?.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 27.10.2010, 16:54   #5
Jor1k
Пользователь
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

получается, что массив результатов состоит из 3 массивов размером (7 столбцов на 10000000 строк) элемент которых extended=10байт, следовательно занимает 3*7*10.000.000*10байт=2.100.000.000 байт=1,96Гб. Какой максимальный объем массива может быть для 32-битной оси. И можно ли использовать что-то другое, чтобы избавиться от ограничений по занимаемой памяти и не грузить это в оперативную память? Место под массив выделяется из оперативной памяти ведь так?
Jor1k вне форума Ответить с цитированием
Старый 27.10.2010, 16:55   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Ещё неплохо бы тег CODE юзать.А то нечитабельно.
_-Re@l-_ вне форума Ответить с цитированием
Старый 27.10.2010, 17:02   #7
Jor1k
Пользователь
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от _-Re@l-_ Посмотреть сообщение
Ещё неплохо бы тег CODE юзать.А то нечитабельно.
Виноват, первый раз писал, НЕ РАЗОБРАЛСЯ еще(
Jor1k вне форума Ответить с цитированием
Старый 27.10.2010, 17:26   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

скорее всего дело в том что массив выделяется в куче. надо использовать все пространство процесса. или же скидывать лишнее в файл . а вообще вопрос. вам нужен Extended? или можно взять поменьше тип?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 27.10.2010, 17:31   #9
Jor1k
Пользователь
 
Регистрация: 27.10.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
вам нужен Extended?
На самом деле можно и реал взять.А как часть скидывать в файл?чтобы все на оперативке не висело?Спасибо за помощь)
Jor1k вне форума Ответить с цитированием
Старый 27.10.2010, 17:40   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а вы как вычисляете. сразу по максимуму? все данные в память?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не разбираюсь динамическом программировании. sirex Паскаль, Turbo Pascal, PascalABC.NET 2 22.09.2010 21:58
Где мой кося в динамическом массиве? Utkin Общие вопросы Delphi 9 09.07.2010 15:35
C++ указатель в динамическом двумерном масие TheZvir Помощь студентам 3 26.03.2010 00:03
Переопределение события OnClick в динамическом объекте-компоненте CyberJohn Общие вопросы Delphi 8 06.01.2010 15:56
Количество элементов в динамическом массиве lytkin Общие вопросы Delphi 8 21.02.2007 14:50