电脑爱好者,提供IT资讯信息及各类编程知识文章介绍,欢迎大家来本站学习电脑知识。 最近更新 | 联系我们 RSS订阅本站最新文章
电脑爱好者
站内搜索: 
当前位置:首页>> delphi技术>>求助:Delphi怎样声明并调用C编写函数中的数组指针参数:

求助:Delphi怎样声明并调用C编写函数中的数组指针参数

来源:远方网络 | 2005-12-29 14:15:32 | (有6907人读过)

我想用Delphi调用C语言编写的DLL,但DLL中的函数中有 数组指针 参数。

我希望能用Delphi声明并调用数组指针,但作了几个程序包括下边这个都不能的到正确结果。

希望各位高手指点迷津。


DLL中

C语言函数声明如下:

long ASmpe ( long *idnum,

long demo,

long *stateIO,

long updateIO,

long ledOn,

long numChannels,

long *channels,

long *gains,

long disableCal,

long *overVoltage,

float *voltages )




gains,Channels ,voltages,为数组指针,各有四个单元。即指向的数组长度为四。

其余各参数可是固定值,分别为0或1。





我用Delphi 作驱动程序该函数声名如下:


unit driver;

interface

uses windows;



function AISample(var idnum:integer;demo:integer;var

stateIO:integer;updateIO:integer;

ledOn:integer;numChannels:integer;var MAIchannels:array of integer;

var MAIgains:array of integer;disableCal:integer;var overVoltage:integer;

var MAIvoltages:array of single):integer;stdcall;


implementation



function AISample; external 'ljackuw.dll';




在主程序timer 组件中调用此函数(有返回值):



procedure TForm1.Timer1Timer(Sender: TObject);

var

idnum,demo,stateIO,updateIO,ledOn,numChannels,disableCal,overvoltage:integer;



MAIchannel: array of integer;

MAIgain: array of integer;

MAIvoltage: array of single;


begin

(设定动态数组长度)

setlength(MAIchannel,4);

setlength(MAIgain,4);

setlength(MAIvoltage,4);


(初始化动态数组)

MAIchannel[0]:=channel1.ItemIndex;

MAIchannel[1]:=channel2.ItemIndex;

MAIchannel[2]:=channel3.ItemIndex;

MAIchannel[3]:=channel4.ItemIndex;


MAIgain[0]:=gain1.ItemIndex;

MAIgain[1]:=gain2.ItemIndex;

MAIgain[2]:=gain3.ItemIndex;

MAIgain[3]:=gain4.ItemIndex;


{其余各参数各设为0 或1}


rc:=AISample(idnum,demo,stateIO,updateIO,ledOn,numChannels,MAIchannel,

MAIgain,disableCal,overVoltage,MAIvoltage);


(返回值)

voltage1.text:=floattostr(MAIvoltage[0]);

voltage2.Text:=floattostr(MAIvoltage[1]);

voltage3.text:=floattostr(MAIvoltage[2]);

voltage4.Text:=floattostr(MAIvoltage[3]);



end;
------------------------------------------------------------------------------------
答复:
把:
rc:=AISample(idnum, demo, stateIO, updateIO, ledOn, numChannels, MAIchannel, MAIgain, disableCal, overVoltage, MAIvoltage);

改为:
rc:=AISample(idnum, demo, stateIO, updateIO, ledOn, numChannels, MAIchannel[0], MAIgain[0], disableCal, overVoltage, MAIvoltage[0]);

当然,最好不要用动态数组,我比较倾向于这样用:
var
MAIchannel : array[0..3] of Cardinal;

(长度为4时才可以).
另外,Delphi里的Integer是与C里的long不同的,建议用Cardinal

---------------------------------------------------------------------------------
多谢版主指点



只是我改了程序,运行后还是不能得到正确的输出电压值。



是不是我用Delphi 声明C语言数组指针参数的格式不对。



例如:C编的函数中参数 long *voltage 为数组指针



Delphi 中声明该参数用 var voltage array of cardinal 是否正确


delphi技术热门文章排行
网站赞助商
购买此位置

 

关于我们 | 网站地图 | 文档一览 | 友情链接| 联系我们

Copyright © 2003-2024 电脑爱好者 版权所有 备案号:鲁ICP备09059398号