C++Builder指针参数转换为delphi指针参数

49 篇文章 0 订阅
15 篇文章 0 订阅

在BCB中,一DLL定义如下:

//波形参数
typedef struct
      {
    unsigned int  mDots;       //波形点数
    double  mDacclk;     //时钟
    double  mWaveData[2*262144]; //波形数据
    double  mNoise[2*262144];
    double  mGenWave[2*262144];
   }WavePara;

 

//计算规则波形的波形数据:如时钟,波形点数
void __stdcall LAI300_CacuWavePara(
                                  int WaveType,
                                  int xCycles,
                                  int yCycles,
                                  double Frequency,
                                  double Amplitude,
                                  double Offset,
                                  double Duty,
                                  unsigned int *mDots,
                                  double *mDacclk,
                                  double *mWaveData,
                                  double kr,
                                  double kf,
                                  double phase
                                 
                                  );

其调用:

 

      WavePara CH[1];          // 卡波形参数

      //计算规则波形的波形数据
      LAI300_CacuWavePara(
     mType,           //波类型
     mNumber,         //个数
                          0,
                          mFreq,           //频率
                          mAmplitude,      //幅度
                          mOffset,         //偏移
                          mDuty,           //占空比
                          &CH[0].mDots,    //波形点数
                          &CH[0].mDacclk,  //时钟
                          CH[0].mWaveData, //波形数据
                          mKr/100,         //上升时间
                          mKf/100,         //下降时间
                          mPhase           //相位
                          );

 

在Delphi中定义如下:刚开始定义成下列样子始终通不过,连Application.Initialize都通不过,更不用说去看堆栈哪里出错了,又没查到BCB指针

 

参数在Delphi中的定义方法,

 

 //计算规则波形的波形数据:如时钟,波形点数
procedure LAI300_CacuWavePara(
                                  WaveType:integer;
                                  xCycles:integer;
                                  yCycles:integer;
                                  Frequency:double;
                                  Amplitude:double;
                                  Offset:double;
                                  Duty:double;
                                  mDots:PLongWord;
                                  mDacclk:PDouble;
                                  mWaveData:array of double;
                                  kr:Double;
                                  kf:Double;
                                  phase:Double
                                 
                                  )stdcall

 

在人家的Blog 中看到这样的讨论:

 

vc,dll中的函数原型为int f1(int ch, BYTE* aa),在vb中怎样声明,如何调用

 

declare function f1 lib "vc.dll" (byval ch as long,byref aa as byte) as long

sub main()dim n as byte
   
dim lRet as long
    lRet
= f1(1, n)
end sub

 

 

而VB中byref aa as byte转换为delphi中就是var aa:byte,也就是说vc中定义的double *mWaveData,其实用var mWaveData:double

 

就行,很少见到用mWaveData:PDouble这样的定义,但如果要传一个数组的首地址进去,用PDouble这种方法很方便,通过下面的程序证明我这

 

个推断是正确的.

 

 

 定义:

//波形参数
type
  WavePara=record
    mDots:LongWord;       //波形点数
    mDacclk:Double;     //时钟
    mWaveData:array [0..2*262144-1]of double; //波形数据
    mNoise:array[0..2*262144-1]of double;
    mGenWave:array[0..2*262144-1]of double;
  end;

 

procedure LAI300_CacuWavePara(
                                  WaveType:integer;
                                  xCycles:integer;
                                  yCycles:integer;
                                  Frequency:double;
                                  Amplitude:double;
                                  Offset:double;
                                  Duty:double;
                                  var mDots:LongWord;
                                  var mDacclk:Double;
                                  mWaveData:PDouble;
                                  kr:Double;
                                  kf:Double;
                                  phase:Double
                                 
                                  )stdcall;

调用:

var
  CH:array[0..1]of WavePara;

       //计算规则波形的波形数据
      LAI300_CacuWavePara(
     mType,           //波类型
     mNumber,         //个数
                          0,
                          mFreq,           //频率
                          mAmplitude,      //幅度
                          mOffset,         //偏移
                          mDuty,           //占空比
                          CH[0].mDots,    //波形点数
                          CH[0].mDacclk,  //时钟
                          @CH[0].mWaveData, //波形数据
                          mKr/100,         //上升时间
                          mKf/100,         //下降时间
                          mPhase           //相位
                          );

 

其参数中用var 就表示传变量地址

 

还有,在函数定义中,如果要求传数组首地址参数,最好是用Data:Pdouble指针形式,这样,不用但心堆栈溢出,否则,如果用动态数组做为参数,

 

如果定义的数组过大,传进去可能发生堆栈溢出,出现函数调用失败

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值