Вы переносите массив внутри записи.
type
TMyArray = record
private
FData: array of integer;
.....
public
class function New(Size1, Size2: cardinal): TMyArray; static;
function Free; //only needed if you utilize GetMem.
property Item[x, y: integer]: integer read GetItem write SetItem; default;
end;
В функции New
вы используете SetLength для инициализации массива.
SetLength(Result.FData, SizeX*SizeY)
.
в GetItem
/SetItem
пары вы добавляете 3 к x
индексу/вычесть 1 из индекса y
и, таким образом, получить доступ к реальному массиву, который начинается с 0.
GetMem
Другим способом заключается в использовании GetMem выделить блок памяти.
Обратите внимание, что GetMem не нулевой памяти, поэтому, если вы хотите инициализировать нулевой массив, вам нужно позвонить ZeroMemory
, чтобы очистить буфер. GetItem
тогда выглядит следующим образом:
{$pointermath on}
TMyArray = record
private
FData: PInteger;
FSizeX, FSizeY: cardinal; //The size of the array.
.....
//You can use the same code for dynarray and GetMem.
function TMyArray.GetItem(x,y: integer): integer;
begin
//Inc(x,3); Dec(y,1);
Result := FData[(x+3)+(y-1)*FSizeX];
end;
Поскольку Item
является свойством по умолчанию, вы можете просто написать i := MyArray[-3,2];
Cleanup
При использовании динамических массивов будет Delphi очистки памяти для вас автоматически, когда запись выходит за рамки.
Если вы используете GetMem
, вам придется выполнять свою очистку.
Однако вы можете добавить автоматическую очистку/деструктор, используя интерфейс в трюке записи, см. here и here.
Выделите динамический массив нужного размера и оберните его в код, который выполняет вычисления индекса. Или просто используйте GetMem, чтобы он стал еще проще. –
Эта декларация придерживается правила постоянного выражения (см. Документы). –