请教下,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
typedef struct tagCALCPARAM
{
union
{
float* m_pfParam; //序列参数,指向一个浮点型数组
float m_fParam; //数值参数
};
int m_nParamStart; //序列参数有效起始位置
}CALCPARAM;
为什么参数传递进来,有时候是这样写的
__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个序列一致
为什么参数传递进来,有时候是这样写的
__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.由于可以调用多个序列,许多序列的计算可以先在公式中进行,然后作为调用的参数即可。
*/
哦,基本理解了,应该就是看参数传递进去是序列还是常数以及参数个数的区别了,谢谢哈