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分送上,谢谢!
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分送上,谢谢!
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传进来。尤其还有浮点数这种在不同编译器之间可能会出现麻烦的参数
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;
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;
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);
昨天参照两位大侠的意见,改动如下:
声明:
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。各位帮忙看看,有什么不妥的地方吗?
仔细瞅瞅我写的声明里头哪几个有var哪几个没有,你以为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 大侠!