ma1:= ma(c,5);
ma2: ma(ma1,5);
ma3: "STOCKFUNC@XX"(c,5);
ma4: "STOCKFUNC@XX"(ma1,5);
如上 系统的ma函数 能用close作为输入,也能用ma计算后的数据作为输入
然而用外部dll("STOCKFUNC@XX"为外部函数,用c肯定有输出结果) ma3有输出结果,但是ma4一直为0
这是为什么
说下详细的情况
金字塔的函数能多次嵌套
比如上面的ma1 ma2
经过测试 “STOCKFUNC@XX”(c,5) 的输出 能再经过ma 获得结果
“STOCKFUNC@XX”的输出 不能再次经过“STOCKFUNC@XX”获得结果
ma(c,5)的输出 也不能再次经过“STOCKFUNC@XX”获得结果
想到可能的情况 dll的外部函数 只支持序列数据,不支持数组
“STOCKFUNC@XX” 用close序列数据作为输入时,能输出数组结果。 但用数组数据输入时就没有结果,如ma(c,5)的输出也是数组。
而金字塔内部函数同时支持序列数据和数组
请问如何解决
请详细说明XMA的算法和使用方法
StockFunc.h 中的申明,用来让金字塔使用 实际函数为"STOCKFUNC@JJMA"(输入,参数1,参数2);
__declspec(dllexport) int WINAPI JJMA(CALCINFO* pData);
StockFunc.cpp 中的内容
//调用外部dll的申明
extern "C" __declspec(dllimport) int WINAPI JMA(int iSize,double *pdSignal,double dSmooth,double dPhase,double *pdFilter);
//实际的调用函数
__declspec(dllexport) int WINAPI JJMA(CALCINFO* pData)
{
if ( pData->m_pCalcParam[2].m_nParamStart >= 0)
{
int Length=(int)pData->m_pCalcParam[1].m_pfParam[0];
int Phase=(int)pData->m_pCalcParam[2].m_pfParam[0];
int count=pData->m_nNumData;
const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
double *input=new double[count];
double *output=new double[count];
for (int i=0;i<count;i++)
{ input[i]=(double)pValue1[i]; }
int cond=JMA(count,input,Length,Phase,output);
if (cond==0)
{
for (int i=0;i<count;i++)
{
pData->m_pResultBuf[i]=(float)output[i];
}
}
delete []input;
delete []output;
return 1;
}
return -1;
}
自定义的DLL函数最好不要嵌套调用
这句话不是解决问题的说法吧。。。
而且首要问题是金字塔函数的输出(比如ma)也没法用
主要在这一句
const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
m_pfParam 是close的时候 能转换成 float的数组
但是 m_pfParam 为金字塔函数的输出时,到底是什么,其实就是这篇帖子的题目
金字塔函数的输出时,根据返回值类型了,如果是序列数据依然是float数组,如果是常数,则这里会是只是一个float字的数字,请楼主仔细看看Stockfun.h文件上的说明解释
注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]是一致的
楼主的意思是
ma4: "STOCKFUNC@XX"(ma1,5);
这个没有输出了?
如果那样的话,请把你的DLL代码上传网盘,然后贴连接过来我们帮你看看
对
ma4: "STOCKFUNC@XX"(ma1,5); 没有输出
ma3: "STOCKFUNC@XX"(c,5); 有输出
ma5: "STOCKFUNC@XX"(ma3,5); 没有输出
就是这个意思
"STOCKFUNC@JJMA"(c,5,0);
ma1:=ma(c,5);
"STOCKFUNC@JJMA"(ma1,5,0);
如上
第一句能执行 所以上面注的5条都不是问题
那ma1的输出是什么,用variable 申明过数组用来存放ma1 看起来确实是数组
但ma1和 variable申明的数组 都没法用在 "STOCKFUNC@JJMA"中
DLL的申明已经很清楚了
extern "C" __declspec(dllimport) int WINAPI JMA(int iSize,double *pdSignal,double dSmooth,double dPhase,double *pdFilter);
5个参数
数组的长度,输入double数组的指针,参数1,参数2,输出double的指针
const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
double *input=new double[count];
double *output=new double[count];
for (int i=0;i<count;i++)
{ input[i]=(double)pValue1[i]; }
这一段就是申明输入输出数组 然后把金字塔的数据存入 double数组 input作为 JMA的输入数据
dll包是蛮有名的jma