| 查看: 1774 | 回复: 9 | |||
swustxxl金虫 (正式写手)
|
[交流]
【求助】VS2005数值计算程序调试【急求!!!!加金币】
|
|
数据拟合程序,运用现成的动态链接库LBFGS法(带约束的),操作平台是VS2005,将其引入MFC单文档错误迭出 我将算法程序编入了CLoginDlg.CPP中,点击button1,程序关闭对话框弹出单文档界面,后台同时完成运算。 void CLoginDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 _tmain(); CDialog::OnOK(); } 以上是Cbutton的代码,编译首先报错的是_tmain()位置,说的是不接受0个参数,这个公共函数的原型为 int _tmain(int argc, _TCHAR* argv[]) { ......... ......... return 0; } 我干脆直接对原函数做了改动,如下: int _tmain() { ......... ......... return 0; } 在解决方案中又添加了lbfgsb.lib文件,于是编译、链接都可通过,甚至可以运行,但点击button1,程序就会报错,弹出如下对话框: ![]() 算法的最初程序是正确的,可编译可链接可运行,结果正确;我可以新建一个WIN32控制台应用程序重现算法程序的效果。证明算法程序本身无误,应该是动态链接库在加载到MFC程序时出现了错误。 希望有高手能指点一下~~不胜感激 以下是我的MFC程序关于引入算法动态链接库和执行运算的片段,最后附上了WIN32算法程序和我自己的MFC程序: // LoginDlg.cpp : 实现文件 // #include "stdafx.h" #include "xxl_try2.h" #include "LoginDlg.h" //#include "stdafx.h" #include "iostream" #include "memory.h" #include "malloc.h" #include "windows.h" #include "math.h" using namespace std; // CLoginDlg 对话框 IMPLEMENT_DYNAMIC(CLoginDlg, CDialog) CLoginDlg::CLoginDlg(CWnd* pParent /*=NULL*/) : CDialog(CLoginDlg::IDD, pParent) { } CLoginDlg::~CLoginDlg() { } void CLoginDlg: oDataExchange(CDataExchange* pDX){ CDialog: oDataExchange(pDX);} BEGIN_MESSAGE_MAP(CLoginDlg, CDialog) ON_BN_CLICKED(IDC_BUTTON1, &CLoginDlg::OnBnClickedButton1) END_MESSAGE_MAP() // CLoginDlg 消息处理程序 // LBFGS.cpp : 定义控制台应用程序的入口点。 //计算梯度保存在g中,计算目标函数值保存在f中 //n是参数个数,x是参数向量 void fcn2(int n,double *x, double*t, double *y,double &f, double *g ){ f=0; g[0]=0; g[1]=0; g[2]=0; g[3]=0; g[4]=0; g[5]=0; for(int k=0;k double tmp=y[k]-(x[0]*t[k]*exp(x[1]*t[k])+x[2]*t[k]*exp(x[3]*t[k])+x[4]*t[k]*exp(x[5]*t[k])); f+=tmp*tmp; g[0]+=-2*tmp*t[k]*exp(x[1]*t[k]); g[1]+=-2*tmp*t[k]*x[0]*exp(x[1]*t[k])*t[k]; g[2]+=-2*tmp*t[k]*exp(x[3]*t[k]); g[3]+=-2*tmp*t[k]*x[2]*exp(x[3]*t[k])*t[k]; g[4]+=-2*tmp*t[k]*exp(x[5]*t[k]); g[5]+=-2*tmp*t[k]*x[4]*exp(x[5]*t[k])*t[k]; } return; } extern "C" void __declspec(dllimport) __stdcall lbfgsb(int n,int m,double *x, double *l, double *u, int *nbd, double f, double *g, double factr, double pgtol, double *wa, int *iwa,char *task, int iprint,char *csave,bool *lsave,int *isave, double *dsave); int main()//int argc, _TCHAR* argv[]) { const char dllPath[] = "lbfgsb.dll"; //加载动态库文件 HINSTANCE hLibrary = LoadLibraryA(dllPath); if(hLibrary == NULL){ int error =GetLastError (); cout<<"Error of LoadLibrary = "< cout<<"Can't find the dll file."< return -1; } /* (如果获得这个程序的句柄)获得正在运行程序的路径和文件名*/ bool exePathOut=true; if(exePathOut){ char exePath[1000] = "\0"; GetModuleFileNameA(hLibrary,exePath,sizeof(exePath)); cout< bool *lsave; char *task,*csave,*str; int n, m,iprint,*nbd,*iwa, *isave; double f, factr, pgtol,*x,*l,*u,*g,*wa,*dsave; double t[7]={1,1.5,2,2.5,3,3.5,5}; double y[7]={10.78,80.35,58.81,43.04,23.05,12.35,6.61}; iprint = 1; factr=1.0E+7; pgtol=1.0E-5; f=0.0; n=6; m=10; nbd=new int[n]; iwa=new int[3*n]; x=new double[n]; l=new double[n];//设置变量下限 u=new double[n];//设置变量上限 g=new double[n]; wa=new double[2*m*n+4*n+12*m*m+12*m]; dsave=new double[29]; isave=new int[44]; str=new char[60]; csave=new char[60]; task=new char[60]; lsave=new bool[16]; for(int i=0;i nbd=0; l=1.0; u=10; } for(int i=1;i nbd=0; l=1.0; u=10; } for(int i=0;i x=0.0E0; } sprintf(task,"%s","START" ;while(1){ lbfgsb(n,m,x,l,u,nbd,f,g,factr,pgtol,wa,iwa,task,iprint,csave,lsave,isave,dsave); strncpy(str,task,2); if (strncmp(str,"FG",2)==0) { fcn2(7, x,t,y,f, g ); continue; } strncpy(str,task,5); if(strncmp(str,"NEW_X",5)!=0) { for(int i=0;i cout<<"x["<< break; } } delete[] nbd; delete[] iwa; delete[] x; delete[] l; delete[] u; delete[] g; delete[] wa; delete[] lsave; delete[] task; delete[] csave; delete[] str; delete[] isave; delete[] dsave; system("pause" ;return 0; } void CLoginDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 main(); CDialog::OnOK(); } 这是程序 http://good.gd/767141.htm 这是算法的正确程序 http://good.gd/767144.htm [ Last edited by swustxxl on 2010-10-20 at 10:47 ] |
» 猜你喜欢
自荐读博
已经有8人回复
投稿Elsevier的杂志(返修),总是在选择OA和subscription界面被踢皮球
已经有8人回复
自然科学基金委宣布启动申请书“瘦身提质”行动
已经有4人回复
求个博导看看
已经有18人回复
» 本主题相关价值贴推荐,对您同样有帮助:
MATLAB用于三元回归参数
已经有3人回复
急! 关于Ms从Windows提交到Linux计算的问题?
已经有3人回复
通过衍射峰数值计算晶面间距并确定晶系?怎么算啊?求助~~
已经有7人回复
电脑装一个ubuntu系统做 数值计算?
已经有11人回复
大规模优化数值计算,梯度的计算方式讨论
已经有24人回复
【求助】VS2005添加引用的时候找不到Microsoft.Office.Tools.Excel怎么办啊?
已经有7人回复
【讨论】如何使用java进行数值计算编程
已经有10人回复
【求助】VC++数值算法集应用到MFC中报错,程序调试求助
已经有8人回复
【求助】计算方法与数值方法的区别
已经有9人回复
非线性方程组的迭代法(数值计算高手请进)
已经有7人回复
C数值算法程序大全
已经有7人回复
swustxxl
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1424.8
- 散金: 211
- 红花: 2
- 帖子: 398
- 在线: 126.8小时
- 虫号: 954876
- 注册: 2010-02-11
- 专业: 药物设计与药物信息
2楼2010-10-17 08:29:18

3楼2010-10-17 09:27:00

4楼2010-10-17 09:29:21
想飞的猪
木虫 (正式写手)
- 应助: 40 (小学生)
- 金币: 12225.4
- 散金: 1831
- 红花: 9
- 帖子: 584
- 在线: 156.7小时
- 虫号: 584434
- 注册: 2008-08-01
- 性别: GG
- 专业: 机器人学及机器人技术
5楼2010-10-17 14:25:12
swustxxl
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1424.8
- 散金: 211
- 红花: 2
- 帖子: 398
- 在线: 126.8小时
- 虫号: 954876
- 注册: 2010-02-11
- 专业: 药物设计与药物信息
ajian04:谢谢参与交流~ 2010-10-18 13:23:42
|
我在解决方案中添加了一个相关的.lib文件,还是不行。 我把所有的东西还原到了最原始的形态。那个正确的算法程序采用的是WIN32控制台应用程序,我新建了一个空的WIN32项目,只把算法的CPP和H文件添进去,把动态链接相关的文件拷贝到相关文件夹中,同样也添加了.lib文件,一切OK了。 应该是MFC程序和WIN32程序之间的差异导致的报错,请问现在该如何解决? 我的MFC程序是:MFC单文档,静态库,不使用UNCOIDE。希望能对你判断问题所在有所帮助。 [ Last edited by swustxxl on 2010-10-17 at 18:45 ] |
6楼2010-10-17 18:37:51
swustxxl
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1424.8
- 散金: 211
- 红花: 2
- 帖子: 398
- 在线: 126.8小时
- 虫号: 954876
- 注册: 2010-02-11
- 专业: 药物设计与药物信息
7楼2010-10-17 18:41:20
想飞的猪
木虫 (正式写手)
- 应助: 40 (小学生)
- 金币: 12225.4
- 散金: 1831
- 红花: 9
- 帖子: 584
- 在线: 156.7小时
- 虫号: 584434
- 注册: 2008-08-01
- 性别: GG
- 专业: 机器人学及机器人技术
8楼2010-10-17 20:50:06
|
1、你的问题,可以考虑去CSDN问问, 2、是否排除数据类型的问题? 3、也有可能是fortran编译器版本的问题,如:http://software.intel.com/en-us/forums/showthread.php?t=73197 一般情况,google比baidu好用, 以 Visual Fortran run-time error 和 fortl: severe (38): error during write 搜索,看英文的网页, 引起这个错误的因素较多, 可以一个个排除。 [ Last edited by gd88 on 2010-10-20 at 22:55 ] |
9楼2010-10-20 22:48:24
swustxxl
金虫 (正式写手)
- 应助: 0 (幼儿园)
- 金币: 1424.8
- 散金: 211
- 红花: 2
- 帖子: 398
- 在线: 126.8小时
- 虫号: 954876
- 注册: 2010-02-11
- 专业: 药物设计与药物信息
10楼2010-10-21 09:11:45








oDataExchange(CDataExchange* pDX)
;
回复此楼