管理员能否看看 一下代码有什么问题吗
----------------------------------------------------------------------------
int mRSX(double Buffer[],int Lengh,double JRSX_Bufer[])
{
//---暂时省略xx
return 0;
}
__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData)
{
if ( pData->m_pCalcParam[1].m_nParamStart >= 0)
{
int Length=(int)pData->m_pCalcParam[1].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=mRSX(input,Length,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中的C++代码提供一下,我们本地做一下测试
stockfunc.h 部分
__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData);
------------------------------------------------------------------------
stockfunc.cpp 部分
int mRSX(double Buffer[],int Lengh,double JRSX_Bufer[])
{
int shift,r,w,k,Tnew,counted_bars,T0,T1;
double v4,v8,v10,v14,v18,v20,v0C,v1C,v8A;
double F28,F30,F38,F40,F48,F50,F58,F60,F68,F70,F78,F80;
double f0,f28,f30,f38,f40,f48,f50,f58,f60,f68,f70,f78,f80,Kg,Hg;
if (Lengh-1>=5)w=Lengh-1;else w=5; Kg=3/(Lengh+2.0); Hg=1.0-Kg;
for (shift=0;shift<sizeof(Buffer);shift++)
{
if (r==0)
{
r = 1; k = 0;
}
else
{
if (r>=w) r=w+1; else r=r+1;
v8 = Buffer[shift]-Buffer[shift-1]; v8A=abs(v8);
f28 = Hg * f28 + Kg * v8;
f30 = Kg * f28 + Hg * f30;
v0C = 1.5 * f28 - 0.5 * f30;
f38 = Hg * f38 + Kg * v0C;
f40 = Kg * f38 + Hg * f40;
v10 = 1.5 * f38 - 0.5 * f40;
f48 = Hg * f48 + Kg * v10;
f50 = Kg * f48 + Hg * f50;
v14 = 1.5 * f48 - 0.5 * f50;
f58 = Hg * f58 + Kg * v8A;
f60 = Kg * f58 + Hg * f60;
v18 = 1.5 * f58 - 0.5 * f60;
f68 = Hg * f68 + Kg * v18;
f70 = Kg * f68 + Hg * f70;
v1C = 1.5 * f68 - 0.5 * f70;
f78 = Hg * f78 + Kg * v1C;
f80 = Kg * f78 + Hg * f80;
v20 = 1.5 * f78 - 0.5 * f80;
if ((r <= w) && (v8!= 0)) k = 1;
if ((r == w) && (k == 0)) r = 0;
}
if ((r > w) &&(v20 > 0.0000000001 ))
{
v4 = (v14/v20+1.0)*50.0; if(v4>100.0)v4=100.0; if(v4<0.0)v4=0.0;
}
else v4 = 50.0;
JRSX_Bufer[shift]=v4;
}
return 0;
}
__declspec(dllexport) int WINAPI MJRSX(CALCINFO* pData)
{
if ( pData->m_pCalcParam[1].m_nParamStart >= 0)
{
int Length=(int)pData->m_pCalcParam[1].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=mRSX(input,Length,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代码,由于原理复杂很难理解其中的内容,但是初步分析来看应该与你的内部使用的数据行情有关,建议多在DLL内加日志输出,逐步排除到底是哪个位置原因,附上我们经常使用的调试输出日志的C++代码类:
#if !defined(AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_)
#define AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <stdio.h> // 文件相关操作的头文件
#include <tchar.h> // TCHAR的头文件
//! UNICODE格式文件头的常量定义
const unsigned short int gc_uUnicodeFileHeader = 0xFEFF;
/**
* @brief 记录日志类
*
* 使用本模块的“LOG_DEBUG_INFO”宏,即可生成即时日志。具体特性如下:
* @n 1.) 在"Debug"编译模式下,或在"Release"编译模式下在工程设置中定义了"_LOG"选项,
* 产生日志文件;
* @n 2.) 支持UNICODE编码的日志信息;
* @n 3.) 支持UNICODE编码的文件格式;
* @n 4.) 自动添加产生日志信息的细化到毫秒级别的当前时间信息;
* @n 5.) 自动在日志信息后添加回车换行;
* @n 6.) 用C/C++类库函数操作文件,提升代码的可移植性;
* @n 7.) 支持可变参数的日志信息;
* @n 8.) 返璞归真,恢复对TCHAR和SEH的使用。
*
*/
class CLogInfo
{
//-----------------------------------------------------------------------
// 公共的成员变量 :
//-----------------------------------------------------------------------
public:
/**
* @brief 记录日志信息
*
* 本函数可生成即时日志。具体特性如下:
* @n 1.) 在"Debug"编译模式下,或在"Release"编译模式下在工程设置中定义了"_LOG"选项,
* 产生日志文件;
* @n 2.) 支持UNICODE编码的日志信息;
* @n 3.) 支持UNICODE编码的文件格式;
* @n 4.) 自动添加产生日志信息的细化到毫秒级别的当前时间信息;
* @n 5.) 自动在日志信息后添加回车换行;
* @n 6.) 用C/C++类库函数操作文件,提升代码的可移植性;
* @n 7.) 支持可变参数的日志信息;
* @n 8.) 返璞归真,恢复对TCHAR和SEH的使用。
*
* @param szLogFileName[] 日志文件名字符串
* @param szFormat[] 日志信息格式字符串
* @param ... 可变日志信息
* @return static void
*/
static void LogInfo( const TCHAR szLogFileName[], const TCHAR szFormat[], ... )
{
//若文件大小超过500K,则转移文件
CFileStatus status;
if(CFile::GetStatus(szLogFileName,status))
{
if(status.m_size >= 500*1024)
{
CTime time = CTime::GetCurrentTime();
CString strFileName = szLogFileName + time.Format("%Y-%m-%d %H#%M#%S.txt");
::CopyFile(szLogFileName, strFileName, FALSE);
RemoveFiles(szLogFileName);
}
}
// 待记录的日志信息
TCHAR szLogInfo[1024];
// 临时信息
TCHAR szTemp[1024];
// 当前本机时间的结构实例
SYSTEMTIME stuSystemTime;
// 日志文件指针
FILE * pFile = NULL;
try
{
// 获取当前的本机系统时间
::GetLocalTime( &stuSystemTime );
// 按照传入的格式,格式化日志信息 :
va_list ap;
va_start( ap, szFormat );
::_vsntprintf( szTemp, 1024, szFormat, ap );
va_end( ap );
// 结束 ( 按照传入的格式,格式化日志信息 )
// 在日志信息前添加当前时间信息,并在信息尾添加换行信息 :
::_stprintf( szLogInfo,
_T( "%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d %s\r\n" ),
stuSystemTime.wYear,
stuSystemTime.wMonth,
stuSystemTime.wDay,
stuSystemTime.wHour,
stuSystemTime.wMinute,
stuSystemTime.wSecond,
stuSystemTime.wMilliseconds,
szTemp );
// 结束 ( 在日志信息前添加当前时间信息,并在信息尾添加换行信息 )
}
catch (...)
{
return;
}
// 打开日志信息文件
pFile = ::_tfopen( szLogFileName, _T( "a+b" ) );
if ( pFile )
{
try
{
// 偏移到文件尾
::fseek( pFile, 0, SEEK_END );
#ifdef _UNICODE
// 文件大小
long lFileSize = 0;
// 获取文件大小
lFileSize = ::ftell( pFile );
// 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 :
if( lFileSize == 0 )
{
::fwrite( &gc_uUnicodeFileHeader,
sizeof( unsigned short int ),
1,
pFile );
}
#endif
// 结束 ( 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 )
// 向文件写入日志信息数据
::fwrite( szLogInfo,
::_tcslen( szLogInfo ) * sizeof( TCHAR ),
1,
pFile );
// 关闭文件 :
::fclose( pFile );
// 结束 。
}
catch(...)
{
}
}
}
static void LogInfo2( const TCHAR szLogFileName[], const TCHAR szFormat[], ... )
{
//若文件大小超过500K,则转移文件
CFileStatus status;
if(CFile::GetStatus(szLogFileName,status))
{
if(status.m_size >= 500*1024)
{
CTime time = CTime::GetCurrentTime();
CString strFileName = szLogFileName + time.Format("%Y-%m-%d %H#%M#%S");
::CopyFile(szLogFileName, strFileName, FALSE);
RemoveFiles(szLogFileName);
}
}
// 待记录的日志信息
TCHAR szLogInfo[1024];
// 临时信息
TCHAR szTemp[1024];
// 当前本机时间的结构实例
SYSTEMTIME stuSystemTime;
// 日志文件指针
FILE * pFile = NULL;
try
{
// 获取当前的本机系统时间
::GetLocalTime( &stuSystemTime );
// 按照传入的格式,格式化日志信息 :
va_list ap;
va_start( ap, szFormat );
::_vsntprintf( szTemp, 1024, szFormat, ap );
va_end( ap );
// 结束 ( 按照传入的格式,格式化日志信息 )
// 在日志信息前添加当前时间信息,并在信息尾添加换行信息 :
::_stprintf( szLogInfo,
_T( "%s\r\n" ),
szTemp );
// 结束 ( 在日志信息前添加当前时间信息,并在信息尾添加换行信息 )
}
catch (...)
{
return;
}
// 打开日志信息文件
pFile = ::_tfopen( szLogFileName, _T( "a+b" ) );
if ( pFile )
{
try
{
// 偏移到文件尾
::fseek( pFile, 0, SEEK_END );
#ifdef _UNICODE
// 文件大小
long lFileSize = 0;
// 获取文件大小
lFileSize = ::ftell( pFile );
// 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 :
if( lFileSize == 0 )
{
::fwrite( &gc_uUnicodeFileHeader,
sizeof( unsigned short int ),
1,
pFile );
}
#endif
// 结束 ( 若当前为UNICODE模式,且当前为新文件,则写入UNICODE格式文件头 )
// 向文件写入日志信息数据
::fwrite( szLogInfo,
::_tcslen( szLogInfo ) * sizeof( TCHAR ),
1,
pFile );
// 关闭文件 :
::fclose( pFile );
// 结束 。
}
catch(...)
{
}
}
}
};
#define LOG_DEBUG_INFO CLogInfo::LogInfo
#define LOG_DEBUG_INFO2 CLogInfo::LogInfo2
#endif // !defined(AFX_LOGINFO_H__9EABF931_9C07_4EC9_9FF4_CA90E9F59C5D__INCLUDED_)
似乎也很复杂啊
谢谢~