VC 函数原型:
int Fit(char  *keyword,  double Abest[], double &q, int &kk, double &Sse0,double &Rsqrt,double *Xvector,double *Yvector, int nVector,double *W, int nMju, int nGNtimes, double GNer)
其中 *Xvector,*Yvector 是开辟的一片double型内存空间,大小为nVector*sizeof(double)(nVector 为int型变量)。
   Double Abest[5]:返回值之一,是一维的double型数组,大小为5。
目前我程序中声明的函数及赋值如下:
function Fit(var keyword: pchar; var Abest: array of double;
      var q: Pdouble; var kk: Pinteger; var Sse0, Rsqrt: Pdouble; Xvector:pdouble;
      Yvector:pdouble; nVector: Cardinal; W:pdouble; nMju,
      nGNtimes: Cardinal; GNer: Double): Integer;
其中
  Xvector,yvector: pDouble;
  GetMem(Xvector, sizeof(Double) * nVector);
  GetMem(yvector, sizeof(Double) * nVector);
  传值时传入的是Xvector,Yvector的首地址。
其他的 double型赋值操作为
    a := 0.5;
    b := @a ; (b为pdouble型)现在调用时总提示无效的浮点数操作。不知为何?比较急,先送100分,得到正确答案后再有200分送上,谢谢!

解决方案 »

  1.   

    var Abest: array of double其实也可以声明为pchar。给出你具体的调用例子看看
      

  2.   

    这都谁给翻的啊?一堆不该var的地方用了var,delphi的数组参数实际上是两个参数,不能随便瞎用,基本上就没几个翻对的
    char  *keyword  -> keyword: PAnsiChar
    double Abest[]  -> Abest: PDouble
    double &q       -> var q: Double
    int &kk         -> var kk: Integer
    double &Sse0    -> var Sse0: Double
    double &Rsqrt   -> var Rsqrt: Double
    double *Xvector -> Xvector: PDouble
    double *Yvector -> Yvector: PDouble
    int nVector     -> nVector: Integer
    double *W       -> W: PDouble
    int nMju        -> nMju: Integer
    int nGNtimes    -> nGNtimes: Integer;
    double GNer     -> GNer: Doublefunction Fit(...): Integer cdecl;另外这接口设计的也够烂的了,传这么多参数,也不说弄几个struct传进来。尤其还有浮点数这种在不同编译器之间可能会出现麻烦的参数
      

  3.   

    具体调用如下:
    procedure TForm1.Button2Click(Sender: TObject);
     var ptrx, ptrx2 : pDouble;
         ptry, ptry2 : ^double;
         pw,pw2:^double;
         i,rlt : integer;
    var keyword: Pchar;
    var Abest: array of double;
        q: ^double;
        kk: Pinteger;
        Sse0, Rsqrt: ^double;
        nVector: Integer;
        nMju,nGNtimes: Integer;
        GNer: Double;
    var tq,tSse0,tRsqrt:Double;
        tkk:Integer;begin
      tq := 0 ;
      q := @tq ;
      tkk := 0 ;
      kk := @tkk;
      tSse0 := 0 ;
      tRsqrt := 0 ;
      Sse0 := @tSse0 ;
      Rsqrt := @tRsqrt ;
      nVector := 5;
      keyword := Pchar('12345678');
      setLength(Abest,5);
      for i := 0 to 4 do
        Abest[i] := 0.0 ;
      GetMem(ptrx, sizeof(Double) * nVector);
      GetMem(ptry, sizeof(Double) * nVector);
      GetMem(pw, sizeof(Double) * nVector);
      Try
        ptrx2 := ptrx;
        ptrx^ := 1;
        Inc(ptrx);
        ptrx^ := 2;
        Inc(ptrx);
        ptrx^ := 3;
        Inc(ptrx);
        ptrx^ := 4;
        Inc(ptrx);
        ptrx^ := 5;
        ptry2 := ptry;
        ptry^ := 4;
        Inc(ptry);
        ptry^ := 2;
        Inc(ptry);
        ptry^ := 3;
        Inc(ptry);
        ptry^ := 1;
        Inc(ptry);
        ptry^ := 1;    pw2 := pw ;
        pw^ := 1;
        Inc(pw);
        pw^ := 1;
        Inc(pw);
        pw^ := 1;
        Inc(pw);
        pw^ := 1;
        Inc(pw);
        pw^ := 1;    nMju := 0 ;
        nGNtimes := 100 ;
        GNer := 100 ;  rlt := Fit(keyword,Abest[0],q,kk, Sse0, Rsqrt,ptrx2,ptry2,nVector,pw2,nMju,nGNtimes,GNer);
      showmessage(inttostr(rlt));
      Finally
        FreeMem(ptrx2);
        FreeMem(ptry2);
        FreeMem(pw2);
      End;
    end;
      

  4.   

    不好意思刚才自己在做测试,变量声明部分应是这样的(^Double 改为 pDouble)
    procedure TForm1.Button2Click(Sender: TObject);
     var ptrx, ptrx2 : pDouble;
         ptry, ptry2 : Pdouble;
         pw,pw2:Pdouble;
         i,rlt : integer;
    var keyword: Pchar;
    var Abest: array of double;
        q: Pdouble;
        kk: Pinteger;
        Sse0, Rsqrt: Pdouble;
        nVector: Integer;
        nMju,nGNtimes: Integer;
        GNer: Double;
    var tq,tSse0,tRsqrt:Double;
        tkk:Integer;
      

  5.   

    int Fit(char  *keyword,  double Abest[], double &q, int &kk, double &Sse0,double &Rsqrt,double *Xvector,double *Yvector, int nVector,double *W, int nMju, int nGNtimes, double GNer) 
    delphi声明Seamour老大已给出。keyword: string;
    Abest: array[0..4] of double;keyword := '12345678';rlt := Fit(@keyword[1],@Abest[0],q,kk, Sse0, Rsqrt,ptrx2,ptry2,nVector,pw2,nMju,nGNtimes,GNer); 
      

  6.   

    先谢谢各位朋友的关注。
    昨天参照两位大侠的意见,改动如下:
    声明:
      function BioFit(var keyword: pAnsichar; var Abest: pdouble;
          var q: double; var kk: integer; var Sse0, Rsqrt: double; Xvector:pdouble;
          Yvector:pdouble; nVector: Integer; W:pdouble; nMju,
          nGNtimes: Integer; GNer: Double): Integer cdecl; stdcall;external 'Ananlyse.dll';
    调用:
    procedure TFmmain.Button1Click(Sender: TObject);
    var keyword: pAnsichar;
        Abest: pdouble;
     //   best:Array[0..4] of Double;
        q:Double;
        kk:Integer;
        Sse0, Rsqrt: double;
        Xvector,Yvector:pdouble;
        nVector:Integer;
        w:pDouble;
        nMju,nGNtimes: Integer ;
        GNer:Double;
        i:Integer;
        x2,y2,w2,Abest2:Pdouble;
        Rlt:Integer;
    begin
      q := 0 ;
      kk := 0;
      Sse0 := 0;
      Rsqrt := 0 ;
      nVector := 5;
      keyword := Pchar('3518090857');
      GetMem(Xvector, sizeof(Double) * nVector);
      GetMem(Yvector, sizeof(Double) * nVector);
      GetMem(w, sizeof(Double) * nVector);
      GetMem(Abest, sizeof(Double) * nVector);
      Try
        x2 := Xvector;
        Y2 := Yvector;
        W2 := w ;
        Abest2 := Abest ;
        for i := 1 to 5 do
        begin
          Xvector^ := i ;
          Yvector^ := i*1000 ;
          w^ := 100 ;
          Abest^ := 0.0 ;
          Inc(Xvector);
          Inc(Yvector);
          Inc(w);
          Inc(Abest);    end;
        nMju := 0 ;
        nGNtimes := 100 ;
        GNer := 100 ;
        rlt := BioFit(keyword,Abest2,q,kk, Sse0, Rsqrt,X2,Y2,nVector,w2,nMju,nGNtimes,GNer);
        showmessage(inttostr(rlt));
      Finally
        FreeMem(Xvector);
        FreeMem(Yvector);
        FreeMem(w);
        FreeMem(Abest);
      End;
    end;
    运行提示 Access Vialation ,地址是 00000005。各位帮忙看看,有什么不妥的地方吗?
      

  7.   

    你这也叫改了?
    仔细瞅瞅我写的声明里头哪几个有var哪几个没有,你以为var也是随便加的啊?
      

  8.   

    疏忽了数组Abest前那个var 忘记去掉了。
    他c程序中自己的调用声明  int _stdcall BioFit(char *keyword, int *psdCheck, double *Abest,double &q, int &kk, double &Sse0, double &Rsqrt,double *Xvector1,double *Yvector1, int nVector1,double *W, int nMju, int nGNtimes, double GNer);
    这两个函数版本不同,这个版本多了一个参数 int *psdCheck,其余都一样。
    现在提示 无效的浮点型指针操作。郁闷。另外,特别感谢 semour 大侠!