函数的声明是这样的:
function H5Screate_simple(rank:Integer;const dims:array of LongInt;const maxdims:
array of LongInt):Integer;cdecl;调用的时候是这样调用的:
dataspace := H5Screate_simple(2, dim, nil);然后报错:
[Pascal Error] Project1.dpr(227): E2192 Constants cannot be used as open array arguments好像是nil参数除了问题了,请问为什么这样会错啊?在VC中这样就没有问题,并且请问该怎样该呢?
function H5Screate_simple(rank:Integer;const dims:array of LongInt;const maxdims:
array of LongInt):Integer;cdecl;调用的时候是这样调用的:
dataspace := H5Screate_simple(2, dim, nil);然后报错:
[Pascal Error] Project1.dpr(227): E2192 Constants cannot be used as open array arguments好像是nil参数除了问题了,请问为什么这样会错啊?在VC中这样就没有问题,并且请问该怎样该呢?
另外,delphi 里的数组参数也不是真正的数组,有它的特殊处理。举例来说:procedure foo(const X: array of Integer);
begin
// 这里能用 High(X) / Length(X) 获得“数组”参数长度
end;procedure bar;
var
x, y: Integer;
begin
foo(x);
foo([x, y]);
end;bar 里两个调用都是合法的。另外,看你声明成 cdecl 了,不知道是不是想用它和 c/c++ 做接口。由于这个声明有隐含参数,我可以很负责任的告诉你它和 long* 不匹配。可以用 PInteger 或者 PIntegerArray 作参数,无非调用时多敲点儿而已。
其实类似动态数组作为变参数的,应该声明一个动态数组的类型,传入的声明的类型的变量就行,其实是一个指针。
下面是一个大概的用法。
unit UDateTime;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TDynArr = array of Integer; TForm1 = class(TForm)
btn2: TButton;
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
{$R *.dfm}procedure TForm1.btn2Click(Sender: TObject);
var
d1, d2: TDynArr;
i: Integer;
procedure ShowResult(const dyn1, dyn2: TDynArr);
var
j: Integer;
sum: Integer;
begin
sum := 0;
for j := Low(dyn1) to High(dyn1) do
sum := sum + dyn1[j];
for j := Low(dyn2) to High(dyn2) do
Sum := sum + dyn2[j];
ShowMessage(IntToStr(sum));
end;
begin
SetLength(d1, 10);
SetLength(d2, 10);
for i := Low(d1) to High(d1) do
d1[i] := 1;
for i := Low(d1) to High(d1) do
d2[i] := 2;
ShowResult(d1, d2);
end;end.
end.