Я разрабатываю класс для представления особого вида матрицы:
type
DifRecord = record
Field: String;
Number: Byte;
Value: smallint;
end;
type
TData = array of array of MainModule.DataRecord;
type
TDifference = array of DifRecord;
type
TFogelMatrix = class
private
M: Byte;
N: Byte;
Data: ^TData;
DifVector: ^TDifference;
procedure init();
public
constructor Create(Rows, Cols: Byte);
destructor Destroy;
end;
Теперь в конструкторе мне нужно зарезервировать память для членов классов Data и DifVector. Как видите, я использую указатели на массив записей. Итак, главный вопрос - как правильно зарезервировать память? Полагаю, я не могу использовать что-то подобное: new(Data);
потому что я теряю основную идею - зарезервировать пространство памяти, сколько я хочу, во время выполнения. Спасибо за комментарии.
new(DifVector);





Поскольку вы используете динамические массивы, array of, вам следует использовать SetLength, чтобы указать длину массива, что может быть выполнено динамически.
т.е. нравится:
SetLength(Data, 100);
Это не зарезервирует 100 байтов, но зарезервирует достаточно места для хранения 100 элементов любого типа, хранящегося в массиве.
Измените свои объявления массивов на простые массивы:
Data: TData;
DifVector: TDifference;
и используйте его с SetLength, он должен помочь.
Также обратите внимание, что в Delphi переменные типа динамического массива хранятся как указатель (на языке DotNet вы бы назвали это ссылочным типом).
Если вы не приведете эту переменную к указателю, компилятор не позволит вам выполнить распределение самостоятельно. Вы должны использовать SetLength () как уже упоминавшийся lassevk.
С многомерным массивом (например, TData) вы можете установить оба измерения за один раз, установив все измерения одним вызовом SetLength (). В результате получается структура, подобная кубу (каждое измерение имеет одинаковую длину). Но также можно присвоить каждому индексу в одном измерении длину, отличную от его следующего измерения. С двухмерным массивом его иногда называют «зубчатым» массивом.
Для этого вы должны написать это так:
SetLength(Data, SizeOfFirstDimension);
for i = 0 to SizeOfFirstDimension - 1 do
SetLength(Data[i], SizeOfSecondDimensionPerIndex(i));
В этом примере я использую функцию под названием «SizeOfSecondDimensionPerIndex», чтобы определить размер каждого массива во 2-м измерении, но вы можете определить этот размер любым удобным для вас способом.
В качестве примечания я бы посоветовал вам использовать префикс «R» для определений типов записей. Я не знаю этого ни в одном из основных руководств по стилю кодирования, но если вы посмотрите на префиксы P для указателей, префиксы I'для интерфейсов, префиксы F для полей классов, префиксы a для аргументов, префиксов «C» для констант, префиксов «S» для строк ресурса вы можете следовать этой логике и использовать префикс «R» для записей. Я знаю, что это помогло мне лучше понять мой код!
Удачи!
а что насчет данных? Это матрица, поэтому мне нужно использовать 2 параметра? <code> SetLength (Data, M, N)? </code>