Проблема с выделением памяти для двухмерного массивы
От: Аноним  
Дата: 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: Проблема с выделением памяти для двухмерного массивы
От: Hruks Россия www.hruks.com
Дата: 13.02.14 08:44
Оценка:
А>И тут у меня вылетает программа: проблема с памятью.
А>Можете подсказать, что я еще забыл для выделения памяти?

Демони... динамические массивы нумеруются с нуля.
Re[2]: Спасибо, но всё равно не работает
От: Аноним  
Дата: 13.02.14 10:08
Оценка:
Здравствуйте, Hruks, Вы писали:

А>>И тут у меня вылетает программа: проблема с памятью.

А>>Можете подсказать, что я еще забыл для выделения памяти?

H>Демони... динамические массивы нумеруются с нуля.


Спасибо большое Hruks. Это помогло обращаться
к матрице. Но когда я пытаюсь инициировать матрицу
числами 0.0, то опять вылетает.
В среднем моя матрица имеет размеры: 2050 на 60
и это всё типа real. То есть где-то 105000 значений.

Может не хватает RAM? Или в Delphi есть
какие-то ограничения? И что можно с етим делать?
Re[3]: Спасибо, но всё равно не работает
От: BlackEric http://black-eric.lj.ru
Дата: 13.02.14 10:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>к матрице. Но когда я пытаюсь инициировать матрицу

А>числами 0.0, то опять вылетает.
А>В среднем моя матрица имеет размеры: 2050 на 60
А>и это всё типа real. То есть где-то 105000 значений.

А>Может не хватает RAM? Или в Delphi есть

А>какие-то ограничения? И что можно с етим делать?

Ошибка какая?
https://github.com/BlackEric001
Re[4]: Ошибка
От: Аноним  
Дата: 13.02.14 10:22
Оценка:
Ошибка:
Программа бла-бла.exe raised exception class EAccessVolatation with message
Access Volatation at address 0046072 in modul бла-бла.exe. Write of
address 00000008. Process stopped
Re[5]: Ошибка
От: BlackEric http://black-eric.lj.ru
Дата: 13.02.14 10:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Ошибка:

А>Программа бла-бла.exe raised exception class EAccessVolatation with message
А>Access Volatation at address 0046072 in modul бла-бла.exe. Write of
А>address 00000008. Process stopped

А код показать? Где-то по nil падает
https://github.com/BlackEric001
Re: Проблема с выделением памяти для двухмерного массивы
От: Pavel Dvorkin Россия  
Дата: 13.02.14 10:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>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:');

iDataAnzPos := AnsiPos(#9, hs);
strDataAnz := Copy(hs, iDataAnzPos + 1, Length(hs));

iMRGDataAnz := StrToInt(strDataAnz);

// Dimentions of Matrix
iElemCounter := 0;
readln(tfMRG, hs);
strTmpHs := hs;
repeat
iTabPos := AnsiPos(#9, strTmpHs);
strTmpHs := Copy(strTmpHs, iTabPos+1, Length(strTmpHs));
iElemCounter := iElemCounter + 1;
until iTabPos = 0;
iElemCounter := iElemCounter + 1;



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?
Re: Сооснователь летает в облаках
От: DesWind  
Дата: 13.02.14 10:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте!

А>У меня проблема. Мне нужно считать данные из текстового файла
А>в двухмерный массив. Т. к. колличество данных в текстовом
А>файле может быть разным, то и массив должен быть динамическим.
А>Числа в массиве должны быть типа 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[2]: Сооснователь летает в облаках
От: DesWind  
Дата: 13.02.14 11:09
Оценка:
Индексы помоему перепутаны местами.
Re[3]: Сооснователь летает в облаках
От: BlackEric http://black-eric.lj.ru
Дата: 13.02.14 11:15
Оценка:
Здравствуйте, DesWind, Вы писали:


DW>Индексы помоему перепутаны местами.


Точнее нужно так

for i := 0 to iElemCounter - 1 do
for j := 0 to iMRGDataAnz - 1 do
https://github.com/BlackEric001
Re[4]: Большое спасибо.
От: Аноним  
Дата: 13.02.14 14:50
Оценка:
Большое спасибо.
Да, проблема была в индексах.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.