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

来源:互联网 发布:啥软件可以看余罪 编辑:程序博客网 时间:2024/05/16 08:56

在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指针形式,这样,不用但心堆栈溢出,否则,如果用动态数组做为参数,

 

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

 

 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕晚期脸过敏怎么办 吃芒果脸过敏怎么办 脸上老反复过敏怎么办 用什么都过敏怎么办 脸上起过敏湿疹怎么办 脸上发湿疹过敏怎么办 感冒流鼻涕有痰怎么办 咳嗽流清水鼻涕怎么办 脸最近老是过敏怎么办 鼻炎脸特别疼怎么办 宝宝感冒一直流鼻涕怎么办 经常过敏的体质怎么办 一边鼻子堵了怎么办 鼻炎流清水鼻涕怎么办 鼻子总感觉堵塞怎么办 半边鼻子不通气怎么办 鼻炎感冒了鼻塞怎么办 左边鼻子不通气怎么办 婴儿鼻塞不通气怎么办 过敏性鼻炎一直打喷嚏怎么办 一只鼻子流鼻涕怎么办 一个鼻子不通气怎么办 夏天鼻子堵了怎么办 做完鼻子感冒了怎么办 鼻子不通流鼻涕打喷嚏怎么办 一岁半宝宝流鼻涕鼻塞怎么办 没有感昌流鼻涕怎么办 婴儿感冒咳嗽流鼻涕怎么办 小孩经常流鼻子怎么办 5岁宝宝流鼻涕怎么办 小孩鼻涕一直流怎么办 二岁宝宝流鼻涕怎么办 小婴儿有点鼻塞怎么办 宝宝流鼻涕总不好怎么办 孩子鼻炎睡不好怎么办 鼻炎清鼻涕不止怎么办 宝宝持续低烧流鼻涕怎么办 孩子鼻塞不通气怎么办 2月婴儿感冒怎么办 长期流黄鼻涕怎么办 孩子流清水鼻涕怎么办