Проблема с выделением памяти для двухмерного массивы
От:
Аноним
Дата:
13.02.14 08:33
Оценка:
Здравствуйте!
У меня проблема. Мне нужно считать данные из текстового файла
в двухмерный массив. Т. к. колличество данных в текстовом
файле может быть разным, то и массив должен быть динамическим.
Числа в массиве должны быть типа real.
Я объявил массив так (он у меня глобальный):
rDynamischeMatrix : array of array of real;
а когда он мне нужен, я отвожу ему место:
SetLength(rDynamischeMatrix, iAnzahlAgilenElem + iAnzahlPostnovaElem + 1, iMRGDataAnz);
Теперь я хочу его инициализировать:
for i := 1 to iMRGDataAnz do
for j := 1 to iAnzahlAgilenElem + iAnzahlPostnovaElem + 1 do
rDynamischeMatrix[i, j] := 0.0;
И тут у меня вылетает программа: проблема с памятью.
Можете подсказать, что я еще забыл для выделения памяти?
Re: Проблема с выделением памяти для двухмерного массивы
А>И тут у меня вылетает программа: проблема с памятью. А>Можете подсказать, что я еще забыл для выделения памяти?
Демони... динамические массивы нумеруются с нуля.
Re[2]: Спасибо, но всё равно не работает
От:
Аноним
Дата:
13.02.14 10:08
Оценка:
Здравствуйте, Hruks, Вы писали:
А>>И тут у меня вылетает программа: проблема с памятью. А>>Можете подсказать, что я еще забыл для выделения памяти?
H>Демони... динамические массивы нумеруются с нуля.
Спасибо большое Hruks. Это помогло обращаться
к матрице. Но когда я пытаюсь инициировать матрицу
числами 0.0, то опять вылетает.
В среднем моя матрица имеет размеры: 2050 на 60
и это всё типа real. То есть где-то 105000 значений.
Может не хватает RAM? Или в Delphi есть
какие-то ограничения? И что можно с етим делать?
Здравствуйте, Аноним, Вы писали:
А>к матрице. Но когда я пытаюсь инициировать матрицу А>числами 0.0, то опять вылетает. А>В среднем моя матрица имеет размеры: 2050 на 60 А>и это всё типа real. То есть где-то 105000 значений.
А>Может не хватает RAM? Или в Delphi есть А>какие-то ограничения? И что можно с етим делать?
Ошибка:
Программа бла-бла.exe raised exception class EAccessVolatation with message
Access Volatation at address 0046072 in modul бла-бла.exe. Write of
address 00000008. Process stopped
Здравствуйте, Аноним, Вы писали:
А>Ошибка: А>Программа бла-бла.exe raised exception class EAccessVolatation with message А>Access Volatation at address 0046072 in modul бла-бла.exe. Write of А>address 00000008. Process stopped
Здравствуйте, Аноним, Вы писали:
А>rDynamischeMatrix : array of array of real;
А>а когда он мне нужен, я отвожу ему место: А>SetLength(rDynamischeMatrix, iAnzahlAgilenElem + iAnzahlPostnovaElem + 1, iMRGDataAnz);
Это ты инициализировал array of (array of real). Теперь можешь иметь в нем iAnzahlAgilenElem + iAnzahlPostnovaElem + 1 элементов, каждый из которых есть array of real, который надо инициализировать таким же способом, поскольку он тоже динамический.
for j := 1 to iAnzahlAgilenElem + iAnzahlPostnovaElem + 1 do
SetLength(rDynamischeMatrix[j],iMRGDataAnz);
и после этого только он готов к употреблению.
P.S. Сначала инициализируем на число строк, потом столбцов. Я не уверен, что то, что я написал, есть то, что ты хочешь.
With best regards
Pavel Dvorkin
Re[6]: Код вот он
От:
Аноним
Дата:
13.02.14 10:48
Оценка:
Код вот он:
AssignFile(tfMRG, FileNameMRG);
reset(tfMRG);
repeat
readln(tfMRG, hs);
until AnsiContainsStr(hs, 'DataAnz:');
SetLength(rDynamischeMatrix, iElemCounter, iMRGDataAnz);
GlobalMemoryStatus(M);
Memo1.Lines.Add(IntToStr(M.dwAvailVirtual div 1024) + #13#10 + IntToStr(M.dwTotalPhys div 1024) + #13#10 + IntToStr(M.dwAvailPhys div 1024) + #13#10);
// Dynamische Matrix initialisation
iGesammtToTest := 0;
for i := 0 to iMRGDataAnz-1 do
for j := 0 to iElemCounter — 1 do
begin
rDynamischeMatrix[i, j] := 0.0;
iGesammtToTest := iGesammtToTest + 1;
if iGesammtToTest = 10000 then
begin
showmessage('Pochti!');
end;
end;
Падает еще до Pochti! Инизиализирует ... инициализирует,
а потом бац и падает. В интернете стоит, что я какой-то
Create забыл. Но я думаю SetLength(rDynamischeMatrix, iElemCounter, iMRGDataAnz);
уже более-менее Create?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте! А>У меня проблема. Мне нужно считать данные из текстового файла А>в двухмерный массив. Т. к. колличество данных в текстовом А>файле может быть разным, то и массив должен быть динамическим. А>Числа в массиве должны быть типа real.
А>Я объявил массив так (он у меня глобальный): А>rDynamischeMatrix : array of array of real;
А>а когда он мне нужен, я отвожу ему место: А>SetLength(rDynamischeMatrix, iAnzahlAgilenElem + iAnzahlPostnovaElem + 1, iMRGDataAnz);
А>Теперь я хочу его инициализировать: А> for i := 1 to iMRGDataAnz do А> for j := 1 to iAnzahlAgilenElem + iAnzahlPostnovaElem + 1 do А> rDynamischeMatrix[i, j] := 0.0;
А>И тут у меня вылетает программа: проблема с памятью. А>Можете подсказать, что я еще забыл для выделения памяти?