函数的声明是这样的:
  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中这样就没有问题,并且请问该怎样该呢?

解决方案 »

  1.   

    c/c++ 里没有真正的数组参数,所有数组参数都退化成指针了,你这个比较是没意义的。
    另外,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 作参数,无非调用时多敲点儿而已。
      

  2.   

    是调用VC生成的动态链接库。在VC中本身是unsigned long long 类型的数组,直接定义成PInteger会不会不对啊?
      

  3.   

    当然不对啊,是你写的 LongInt,我哪猜得出其实应该是 UInt64
      

  4.   

    错误明明提示常量不能用作开放数组的参数,这说明你传入的参数错了。
    其实类似动态数组作为变参数的,应该声明一个动态数组的类型,传入的声明的类型的变量就行,其实是一个指针。
    下面是一个大概的用法。
    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.