首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用GetMem分配多维阵列

利用GetMem分配多维阵列
EN

Stack Overflow用户
提问于 2015-10-05 21:11:57
回答 2查看 794关注 0票数 0

如何使用multidimensional(2D, 3D, 4D)和GetMem创建PointerMath数组

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-07 11:29:33

这是更好的没有额外的变量。

代码语言:javascript
复制
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]);
票数 0
EN

Stack Overflow用户

发布于 2015-10-05 22:18:54

GetMem()只知道一维内存--如果指定一个字节计数,它就会分配那么多字节.句号。您将不得不将该内存划分为子部分,以便将它们作为多维数组处理,例如:

代码语言:javascript
复制
{$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等,只需将初始分配乘以附加维度,然后根据需要将其索引到相关部分,例如:

代码语言:javascript
复制
{$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;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32957977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档