以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  [C++]请教一个dll接口中,函数参数传递的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=138232)

--  作者:damoncles
--  发布时间:2016/8/18 16:56:06
--  [C++]请教一个dll接口中,函数参数传递的问题

请教下,Dll接口中,下面两种参数传递有什么区别啊?什么时候该用哪种方式


 const int   m_nNumParam;   // 调用参数数量
 const CALCPARAM* m_pCalcParam;   // 调用参数数组

 

 

const int   m_nParam1Start;   //参数1有效起始位置
 const float*  m_pfParam1;    //调用参数1 
 const float*  m_pfParam2;    //调用参数2
 const float*  m_pfParam3;    //调用参数3
 const float*  m_pfParam4;    //调用参数4


--  作者:damoncles
--  发布时间:2016/8/18 16:56:47
--  

typedef struct tagCALCPARAM
{
 union
 {
  float* m_pfParam;    //序列参数,指向一个浮点型数组 
  float m_fParam;    //数值参数 
 };
 int m_nParamStart;   //序列参数有效起始位置
}CALCPARAM;

 

 


--  作者:damoncles
--  发布时间:2016/8/18 17:00:20
--  

为什么参数传递进来,有时候是这样写的

__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
 if ( pData->m_pfParam1 &&    //参数1有效
   pData->m_nParam1Start<0 &&   //参数1为常数
   pData->m_pfParam2==NULL )   //仅有一个参数

 

有时候却是这样的

__declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
   pData->m_pCalcParam[1].m_nParamStart >= 0 &&
   pData->m_pCalcParam[2].m_nParamStart >= 0 &&
   pData->m_pCalcParam[3].m_nParamStart >= 0 )   //4个序列都含有效数值
 {
  //计算返回的序列的第一个有效值位置
  int nFirst = pData->m_pCalcParam[3].m_nParamStart;  //已知返回的序列的第一个有效值位置与第4个序列一致


--  作者:damoncles
--  发布时间:2016/8/18 17:01:31
--  
是不是参数数量小于等于4个,用第二种,大于4个用第一种?
--  作者:王锋
--  发布时间:2016/8/18 17:35:46
--  
以下是引用damoncles在2016-8-18 17:00:20的发言:

为什么参数传递进来,有时候是这样写的

__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
{
 if ( pData->m_pfParam1 &&    //参数1有效
   pData->m_nParam1Start<0 &&   //参数1为常数
   pData->m_pfParam2==NULL )   //仅有一个参数

 

有时候却是这样的

__declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData)
{
 if ( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
   pData->m_pCalcParam[1].m_nParamStart >= 0 &&
   pData->m_pCalcParam[2].m_nParamStart >= 0 &&
   pData->m_pCalcParam[3].m_nParamStart >= 0 )   //4个序列都含有效数值
 {
  //计算返回的序列的第一个有效值位置
  int nFirst = pData->m_pCalcParam[3].m_nParamStart;  //已知返回的序列的第一个有效值位置与第4个序列一致

 

这个主要取决于你在PEL中调用的方式来决定的,前面的是

"STOCKFUNC@MYMACLOSE"(5) 只有1个参数传递进去,所以只使用pData->m_pfParam1就可以了

 

后面的那个  MYBBI: "STOCKFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4); 使用了5个参数,因此要使用m_pCalcParam扩展的数组结构,因为第中参数结构只能最多传递4个参数进去,这些我们都在工程中做了详尽的说明了,这里再照抄如下

 

/*
注1:
 1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.
 2.当一个参数无效时,则其后的所有参数均无效.
  如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4也为NULL.
 3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.
 4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;
 5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组,
  数组大小为m_nNumData,数据有效范围为 m_nParam1Start 至 m_nNumData-1.
  在时间上m_pData[x] 与 m_pfParam1[x]是一致的

注2:
 1.该扩展结构使调用参数在技术上可以是无限数目的,且每个参数都为数值序列。
 2.CALCPARAM结构用于带入参数信息和实际数据,m_pCalcParam数组大小为m_nNumParam,数据有效范围为 0 至 m_nNumParam-1.
 3.按参数的顺序,m_pCalcParam[0]为第一个参数的数据,m_pCalcParam[1]为第二个参数的数据...,为了保持兼容,原m_nParam1Start、m_pfParam1等5个属性依然有赋值。
 4.取用m_pCalcParam[i].m_pfParam,数组大小为m_nNumData,数据有效范围为m_pCalcParam[i].m_nParamStart 至 m_nNumData-1. 若m_pCalcParam[i].m_nParamStart<0, 则此数组中无有效数据。
 5.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。

*/

 


--  作者:王锋
--  发布时间:2016/8/18 17:37:47
--  
另外需要提醒的是,由于金字塔进程不允许调试,如果你对接口数据某些东西不是很理解传递了什么进去,你可以使用txt日志记录的方式,运行时将你需要了解的数据项写文件进去,这样同样起到了调试效果
--  作者:damoncles
--  发布时间:2016/8/19 11:22:55
--  

哦,基本理解了,应该就是看参数传递进去是序列还是常数以及参数个数的区别了,谢谢哈


--  作者:分析者
--  发布时间:2017/2/9 15:43:19
--  
请问,可以一次返回多个数组吗?
--  作者:王锋
--  发布时间:2017/2/9 16:14:55
--  
不可以