如何在delphi中正确地转换和传递参数

unk*_*wn1 2 arrays delphi pointers casting delphi-2007

我有一个非常简单的代码片段,您可以在此处查看:

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.
Run Code Online (Sandbox Code Playgroud)

如何正确地投射testarray以将其传递给PickValue函数?上面的代码以当前形式崩溃.我正在使用delphi 2007.

提前致谢!

Dav*_*nan 7

您不能将该静态数组转换为动态数组.这些类型根本不兼容.静态数组布局在一个连续的内存块中.动态数组在每个维度都间接到可变大小的数组.实际上,将其视为^^Byte额外的编译器管理和元数据.没有多少铸件可以帮助你.

您至少有以下选项:

  1. 将静态数组的内容复制到动态数组.然后将该动态数组传递给您的函数.
  2. 将静态数组切换为动态数组,以便不需要转换.
  3. 安排你的函数接受静态数组而不是动态数组,再次避免需要转换.
  4. 让函数接受指向第一个元素和内部维度的指针.然后手动执行索引.所述i,j元件在线性偏移i*innerDim + j.

您的指针类型PMatrix可能不需要.动态数组已经实现为指针.这似乎是一个间接的程度太远了.

当然,当数组索引仅达到2时要求元素3是不对的,但这是目前你担心的较少.请记住,动态数组是基于零的,并且您已根据静态数组指定了零.

我很难能够推荐哪种解决方案最好,因为根据此处提供的简化示例,我不了解您的真实目标和用法.