使用指针数学通过指针访问二维数组:需要数组类型[DDelphi]



我非常清楚Delphi中的指针数学应该特别小心地使用,但我仍然不明白我错在哪里。让我们来看看以下类型定义:

program Project26;
{$POINTERMATH ON}
type
TCalibrationTable = array [0 .. 3] of byte;
PCalibrationTable = ^TCalibrationTable;

现在我需要2个数组,每个数组都有3个TCalibrationTable元素(最终它们是2维的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]PCalibrationTable,我可以用它来索引它,以便从数组中获得任意TCalibrationTable类型的元素。这样,header[0][2]应该是TCalibrationTable,即byte的4个元素的数组。

但是下面的赋值将给出一个构建错误:需要数组类型

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

为什么?

如果从标头中删除指针间接,则会得到以下内容:

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;

最新更新