如何在 delphi 中正确地转换和传递参数
How to cast and pass an argument properly in delphi
我有一个非常简单的代码片段,您可以在此处查看:
type
TMatrix = array of array of Byte;
PMatrix = ^TMatrix;
const
testarray:array [0..2,0..2] of Byte=(
(1,2,3), (4,5,6), (7,8,9));
function PickValue(input:PMatrix):Byte;
begin
Result:=input^[1,3];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(inttostr(PickValue(@testarray)));
end;
end.
如何正确转换 testarray 以将其传递给 PickValue 函数?上面的代码以其当前形式崩溃。我正在使用 delphi 2007。
提前致谢!
您不能将该静态数组转换为动态数组。这些类型根本不兼容。静态数组位于一个连续的内存块中。动态数组在每个维度上都间接指向可变大小的数组。实际上,可以将其视为具有额外编译器管理和元数据的 ^^Byte
。没有多少铸造可以帮助你。
您至少有以下选择:
- 将静态数组的内容复制到动态数组。然后将该动态数组传递给您的函数。
- 将您的静态数组切换为动态数组,这样就不需要转换了。
- 安排您的函数接受静态数组而不是动态数组,再次避免需要转换。
- 让函数接受指向第一个元素和内部维度的指针。然后手动执行索引。
i,j
元素处于线性偏移 i*innerDim + j
。
您的指针类型 PMatrix
可能不需要。动态数组已经实现为指针。这似乎是一种过分的间接性。
当然,当数组索引仅上升到 2 时要求元素 3 是不正确的,但目前这是您关注的次要问题。请记住,动态数组是从零开始的,并且您已经为静态数组指定了从零开始。
我很难推荐哪种解决方案是最好的,因为根据此处提供的简化示例,我不了解您的真正目标和用法。
我有一个非常简单的代码片段,您可以在此处查看:
type
TMatrix = array of array of Byte;
PMatrix = ^TMatrix;
const
testarray:array [0..2,0..2] of Byte=(
(1,2,3), (4,5,6), (7,8,9));
function PickValue(input:PMatrix):Byte;
begin
Result:=input^[1,3];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(inttostr(PickValue(@testarray)));
end;
end.
如何正确转换 testarray 以将其传递给 PickValue 函数?上面的代码以其当前形式崩溃。我正在使用 delphi 2007。
提前致谢!
您不能将该静态数组转换为动态数组。这些类型根本不兼容。静态数组位于一个连续的内存块中。动态数组在每个维度上都间接指向可变大小的数组。实际上,可以将其视为具有额外编译器管理和元数据的 ^^Byte
。没有多少铸造可以帮助你。
您至少有以下选择:
- 将静态数组的内容复制到动态数组。然后将该动态数组传递给您的函数。
- 将您的静态数组切换为动态数组,这样就不需要转换了。
- 安排您的函数接受静态数组而不是动态数组,再次避免需要转换。
- 让函数接受指向第一个元素和内部维度的指针。然后手动执行索引。
i,j
元素处于线性偏移i*innerDim + j
。
您的指针类型 PMatrix
可能不需要。动态数组已经实现为指针。这似乎是一种过分的间接性。
当然,当数组索引仅上升到 2 时要求元素 3 是不正确的,但目前这是您关注的次要问题。请记住,动态数组是从零开始的,并且您已经为静态数组指定了从零开始。
我很难推荐哪种解决方案是最好的,因为根据此处提供的简化示例,我不了解您的真正目标和用法。