我非常清楚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;