Delphi数组初始化

Ken*_*nne 3 delphi delphi-xe3

这有点是我之前提出的问题的延续.本质上,我试图用一个基本的例子来测试dll /函数,但是我得到' E2010 - 不兼容的类型:AInteger/ADouble和Set '和' E1012 - 常量表达式违反了我的数组上的子范围边界 '错误.我(有点)得到它想说的,但无法弄清楚我应该修复什么.例如:

var
  n: Integer; 
  Ap, Ai: AInteger;
  Ax, b: ADouble;

begin
  // Initializations
  n := 5;
  Ap := [0, 2, 5, 9, 10, 12]; <- E2010
  Ai := [0, 1, 0, 2, 4, 1, 2, 3, 4, 2, 1, 4]; <- E2010
  Ax := [2, 3, 3, -1, 4, 4, -3, 1, 2, 2, 6, 1]; <- E2010 and E1012
  b := [8, 45, -3, 3, 19]; <- E1012
Run Code Online (Sandbox Code Playgroud)

其中AIntegerADouble类型是我的数组:

ADouble = array[0..High(Integer) div SizeOf(Double) - 1] of Double;
AInteger = array[0..High(Integer) div SizeOf(Integer) - 1] of Integer;
Run Code Online (Sandbox Code Playgroud)

并且应该以这种方式初始化(​​根据Rudy的Delphi页面和其他C-to-Pascal源代码),因为它们是用double Ax[]C 编写的.我确信有一些简单的我做错了或者可以为了测试我而改变dll,但也许我谷歌搜索错误,因为我找不到一个示例/解决方案.所以,问题形式:

Q1:E1012是指

"如果你做这些[AInteger和ADouble]这样的事情,请确保不要过于接近High(整数),因为编译器可能会抱怨数据结构太大." (引自鲁迪的页面)

Q2:我该如何更改此代码?

在此先感谢您的帮助.

Arn*_*hez 8

您可以使用这样的语法执行此操作.

像这样定义数组:

ADouble = array[0..High(Integer) div SizeOf(Double) - 1] of Double;
Run Code Online (Sandbox Code Playgroud)

将初始化整个32位RAM大小的整数数组!您永远无法分配这样的变量(仅在Win64上,但您将使用4 GB的RAM仅存储6个整数)!:)

您的数组需要是动态的,即在运行时具有不断变化的大小.所以你必须这样定义它:

type
  AInteger =  array of integer;
Run Code Online (Sandbox Code Playgroud)

在语言的当前状态AFAIR中,不能直接分配这样的数组.

所以你需要编写这样一个函数:

procedure SetArray(var dest: AInteger; const values: array of integer);
begin
  SetLength(dest,Length(values));
  move(values[0],dest[0],length(values)*sizeof(integer));
end;
Run Code Online (Sandbox Code Playgroud)

您可以使用常量数组作为源:

const
  C: array[0..5] of Integer = (0, 2, 5, 9, 10, 12);
var
  Ap: AInteger;
begin
  SetArray(Ap,C);
Run Code Online (Sandbox Code Playgroud)

或者使用开放数组参数:

var
  Ai: AInteger;
begin
  SetArray(Ai,[0, 2, 5, 9, 10, 12]);
Run Code Online (Sandbox Code Playgroud)

当然,第二种解决方案听起来更接近你的期望.

更新:对于较新的版本,您当然可以使用动态数组构造函数,如下所示:

var
  Ai: AInteger;
begin
  Ai := AInteger.Create(0,2,5,9,10,12);
Run Code Online (Sandbox Code Playgroud)

  • 你可以直接创建一个动态数组,`Ai:= AInteger.Create(0,2,5,9,10,12);` (6认同)