如何使用multidimensional(2D, 3D, 4D)和GetMem创建PointerMath数组
发布于 2015-10-07 11:29:33
这是更好的没有额外的变量。
var
I, J: Integer;
A: PInteger;
begin
GetMem(A, 10 * 10 * SizeOf(Integer));
for I := 0 to 10 - 1 do
for J := 0 to 10 - 1 do
PInteger(@A[I * 10])[J] := Random(10);
for I := 0 to 10 - 1 do
for J := 0 to 10 - 1 do
WriteLn(I,',',J,':',PInteger(@A[I * 10])[J]);发布于 2015-10-05 22:18:54
GetMem()只知道一维内存--如果指定一个字节计数,它就会分配那么多字节.句号。您将不得不将该内存划分为子部分,以便将它们作为多维数组处理,例如:
{$POINTERMATH ON}
var
numCols, numRows, iRow, iCol: Integer;
arr, pRow: PInteger; // an array of integers, for example
begin
numCols := ...;
numRows := ...;
GetMem(arr, (numCols * numRows) * SizeOf(Integer));
try
for iRow := 0 to numRows-1 do
begin
pRow := @arr[iRow * numCols];
for iCol := 0 to numCols-1 do
begin
// use pRow[iCol] as needed...
end;
end;
finally
FreeMem(arr);
end;
end;要将其扩展到3D、4D等,只需将初始分配乘以附加维度,然后根据需要将其索引到相关部分,例如:
{$POINTERMATH ON}
var
numX, numY, numZ, iX, iY, iZ: Integer;
arr, pX, pY: PInteger;
begin
numX := ...;
numY := ...;
numZ := ...;
GetMem(arr, (numX * numY * numZ) * SizeOf(Integer));
try
for iY := 0 to numY-1 do
begin
pY := @arr[iY * (numX * numZ)];
for iX := 0 to numX-1 do
begin
pX := @pY[iX * numZ];
for iZ := 0 to numZ-1 do
begin
// use pX[iZ] as needed...
end;
end;
end;
finally
FreeMem(arr);
end;
end;https://stackoverflow.com/questions/32957977
复制相似问题