这有点是我之前提出的问题的延续.本质上,我试图用一个基本的例子来测试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)
其中AInteger和ADouble类型是我的数组:
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:我该如何更改此代码?
在此先感谢您的帮助.
您可以使用这样的语法执行此操作.
像这样定义数组:
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)
| 归档时间: |
|
| 查看次数: |
1235 次 |
| 最近记录: |