我从网上找了个叫做winGsl的dll,里面有很多科学计算方法。
我想用delphi调用其中的方法,但是不成功。
具体举例:
WINGSLDLL_API double gsl_stats_mean (const double data[], const size_t stride, const size_t n);
我在delphi里这样调用
function gsl_stats_mean(const data:array of double; const stride:DWORD; const n:DWORD):double;stdcall;External 'WinGsl.dll';
不行。加不加stdcall都不行。
请指教应该如何调用啊?

解决方案 »

  1.   

    报什么错?External 'WinGsl.dll',不能用中文符号
      

  2.   

    楼主是要说一下报什么错!
    1.有可能是声明函数写的有问题。
    2.要用工具,看看那个dll的函数接口声明函数是不是开放了,就是,能被第三方软件调用。
      

  3.   

    另外就是,看dll的调用约定,有的是stdcall,有的是cdecl,楼主需要注意。
      

  4.   

    要看WINGSLDLL_API的原型是什么. 然后根据相应的类型作修饰.
      

  5.   

    按照cdecl调用就能通过了。但是
    procedure TForm1.Button2Click(Sender: TObject);
    var
      td:array of double;
      s:string;
    begin
      setlength(td,5);
      td[0]:=1;
      td[1]:=6.235;
      td[2]:=1;
      td[3]:=2;
      td[4]:=1;
      s:=floattostr(gsl_stats_mean(td,1,5));
      edit2.Text:=s;
    end;
    所得的返回值怎么是1啊?我又试了试求gsl_stats_max,返回的也是1.我还是什么地方没写对吧?
    我对c不大了解,看网上说cdel要调用者自己负责清栈,那么delphi里还应该做哪些额外的工作么?
    我是从这个网址下载的dll
    http://www6.in.tum.de/~kiss/WinGsl.htm
    我下的是1.4.02版本。vc++编译的。
      

  6.   

    const data:array of double这里不要用Array,换用指针,比如const data:PDouble
      

  7.   

    如果第一个参数是数组的话,有两种情况。
    一种就是delphi 传的是数组指针,一种就是传的是0元素指针。
    搂主可以多测试几次,应该能得到正确结果的。
      

  8.   

    的确,换用0元素指针做参数就算对了。谢谢大家。
    不过我又找到了一个用pascal写的数学库,叫什么tpmath
    对比了一下tpmath和wingsl的运算速度,算平均数c写的wingsl还不如tpmath呢。
    供其它童子参考吧。