首页 > 解决方案 > 使用指针数学通过指针访问二维数组:需要数组类型 [Delphi]

问题描述

我完全同意Delphi中的指针数学应该特别小心使用,但我仍然不明白我在哪里错了。让我们看一下下面的类型定义:

program Project26;
{$POINTERMATH ON}

type
  TCalibrationTable = array [0 .. 3] of byte;
  PCalibrationTable = ^TCalibrationTable;

现在我需要 2 个数组,每个数组都有 3 个元素TCalibrationTable(最终它们是二维的 3 × 4 数组)。并且还需要一个指向一对这样的数组对象的标题。

var
  table0: array [0 .. 2] of TCalibrationTable;
  table1: array [0 .. 2] of TCalibrationTable;

  header: array [0 .. 1] of PCalibrationTable;

让我们初始化标头:通过指针访问数组最舒适的方法是为其分配第一个元素的地址,然后简单地索引指针以获取任意元素。

begin
  header[0] := @table0[0];
  header[1] := @table1[0];

现在,header[0]作为 a PCalibrationTable,我可以使用它来索引它,以便TCalibrationTable从数组中获取任意类型的元素。这样header[0][2] SHOULD BE a TCalibrationTable,即 4 个元素的数组byte

但是下面的赋值会产生一个构建错误:Array type required

  header[0][2][3] := 100;
end.

为什么?

标签: arraysdelphipointer-arithmetic

解决方案


如果您从标头中删除指针间接,您会得到:

type
  TCalibrationTable = array [0 .. 3] of byte;
  PCalibrationTable = ^TCalibrationTable;
var
  header: array [0 .. 1] of PCalibrationTable;

变成

type
  TCalibrationTable = array [0 .. 3] of byte;
var
  header: array [0 .. 1] of TCalibrationTable;

或者

var
  header: array [0 .. 1] of array [0 .. 3] of byte;

或者

var
  header: array [0 .. 1,0 .. 3] of byte;

换句话说,一个二维数组。

你需要的是这样的:

type
  TCalibrationTable = array [0 .. 3] of byte;
  TCalibrationArr = ARRAY[0..2] OF TCalibrationTable;
  PCalibrationArr = ^TCalibrationArr;

var
  table0: TCalibrationArr;
  table1: TCalibrationArr;

  header: array [0 .. 1] of PCalibrationArr;

然后你可以做

header[0] := @table0;
header[1] := @table1;
header[0][1][2]:=123;

推荐阅读