| 10 | 1/1 | 返回列表 |
| 查看: 1952 | 回復(fù): 9 | |||
swustxxl金蟲 (正式寫手)
|
[交流]
【求助】VS2005數(shù)值計(jì)算程序調(diào)試【急求。。!加金幣】
|
|
數(shù)據(jù)擬合程序,運(yùn)用現(xiàn)成的動(dòng)態(tài)鏈接庫LBFGS法(帶約束的),操作平臺(tái)是VS2005,將其引入MFC單文檔錯(cuò)誤迭出 我將算法程序編入了CLoginDlg.CPP中,點(diǎn)擊button1,程序關(guān)閉對(duì)話框彈出單文檔界面,后臺(tái)同時(shí)完成運(yùn)算。 void CLoginDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知處理程序代碼 _tmain(); CDialog::OnOK(); } 以上是Cbutton的代碼,編譯首先報(bào)錯(cuò)的是_tmain()位置,說的是不接受0個(gè)參數(shù),這個(gè)公共函數(shù)的原型為 int _tmain(int argc, _TCHAR* argv[]) { ......... ......... return 0; } 我干脆直接對(duì)原函數(shù)做了改動(dòng),如下: int _tmain() { ......... ......... return 0; } 在解決方案中又添加了lbfgsb.lib文件,于是編譯、鏈接都可通過,甚至可以運(yùn)行,但點(diǎn)擊button1,程序就會(huì)報(bào)錯(cuò),彈出如下對(duì)話框: ![]() 算法的最初程序是正確的,可編譯可鏈接可運(yùn)行,結(jié)果正確;我可以新建一個(gè)WIN32控制臺(tái)應(yīng)用程序重現(xiàn)算法程序的效果。證明算法程序本身無誤,應(yīng)該是動(dòng)態(tài)鏈接庫在加載到MFC程序時(shí)出現(xiàn)了錯(cuò)誤。 希望有高手能指點(diǎn)一下~~不勝感激 以下是我的MFC程序關(guān)于引入算法動(dòng)態(tài)鏈接庫和執(zhí)行運(yùn)算的片段,最后附上了WIN32算法程序和我自己的MFC程序: // LoginDlg.cpp : 實(shí)現(xiàn)文件 // #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 對(duì)話框 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 : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。 //計(jì)算梯度保存在g中,計(jì)算目標(biāo)函數(shù)值保存在f中 //n是參數(shù)個(gè)數(shù),x是參數(shù)向量 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"; //加載動(dòng)態(tài)庫文件 HINSTANCE hLibrary = LoadLibraryA(dllPath); if(hLibrary == NULL){ int error =GetLastError (); cout<<"Error of LoadLibrary = "< cout<<"Can't find the dll file."< return -1; } /* (如果獲得這個(gè)程序的句柄)獲得正在運(yùn)行程序的路徑和文件名*/ 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];//設(shè)置變量下限 u=new double[n];//設(shè)置變量上限 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 ] |
金蟲 (正式寫手)
金蟲 (職業(yè)作家)

金蟲 (職業(yè)作家)

木蟲 (正式寫手)
金蟲 (正式寫手)
|
我在解決方案中添加了一個(gè)相關(guān)的.lib文件,還是不行。 我把所有的東西還原到了最原始的形態(tài)。那個(gè)正確的算法程序采用的是WIN32控制臺(tái)應(yīng)用程序,我新建了一個(gè)空的WIN32項(xiàng)目,只把算法的CPP和H文件添進(jìn)去,把動(dòng)態(tài)鏈接相關(guān)的文件拷貝到相關(guān)文件夾中,同樣也添加了.lib文件,一切OK了。 應(yīng)該是MFC程序和WIN32程序之間的差異導(dǎo)致的報(bào)錯(cuò),請(qǐng)問現(xiàn)在該如何解決? 我的MFC程序是:MFC單文檔,靜態(tài)庫,不使用UNCOIDE。希望能對(duì)你判斷問題所在有所幫助。 [ Last edited by swustxxl on 2010-10-17 at 18:45 ] |
金蟲 (正式寫手)
木蟲 (正式寫手)
金蟲 (小有名氣)
|
1、你的問題,可以考慮去CSDN問問, 2、是否排除數(shù)據(jù)類型的問題? 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 搜索,看英文的網(wǎng)頁, 引起這個(gè)錯(cuò)誤的因素較多, 可以一個(gè)個(gè)排除。 [ Last edited by gd88 on 2010-10-20 at 22:55 ] |
金蟲 (正式寫手)
| 10 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 294分080500材料科學(xué)與工程求調(diào)劑 +11 | 柳溪邊 2026-03-26 | 12/600 |
|
|---|---|---|---|---|
|
[考研] 材料科學(xué)與工程求調(diào)劑 +13 | 深V宿舍吧 2026-03-29 | 13/650 |
|
|
[考研] 070300化學(xué)354求調(diào)劑 +15 | 101次希望 2026-03-28 | 15/750 |
|
|
[考研] 346求調(diào)劑 一志愿070303有機(jī)化學(xué) +11 | 蘿卜燉青菜 2026-03-28 | 12/600 |
|
|
[考研] 085601 329分調(diào)劑 +6 | yzsa12 2026-03-31 | 6/300 |
|
|
[考研] 化學(xué)工程085602 305分求調(diào)劑 +28 | RichLi_ 2026-03-25 | 36/1800 |
|
|
[考研] 0703化學(xué) +20 | 妮妮ninicgb 2026-03-27 | 20/1000 |
|
|
[考研] 調(diào)劑310 +13 | 溫柔的晚安 2026-03-25 | 14/700 |
|
|
[考研] 調(diào)劑求院校招收 +7 | 鶴鯨鴿 2026-03-28 | 7/350 |
|
|
[考研] 313求調(diào)劑 +6 | 賣個(gè)關(guān)子吧 2026-03-31 | 6/300 |
|
|
[考研] 279求調(diào)劑 +12 | j的立方 2026-03-29 | 12/600 |
|
|
[考研] 一志愿南昌大學(xué)324求調(diào)劑 +9 | hanamiko 2026-03-27 | 9/450 |
|
|
[考研] 0703 化學(xué) 求調(diào)劑,一志愿山東大學(xué) 342 分 +7 | Shern—- 2026-03-28 | 7/350 |
|
|
[考研] 085602 化學(xué)工程專碩 340分求調(diào)劑 +4 | qianbai11 2026-03-29 | 4/200 |
|
|
[考研] 279求調(diào)劑 +4 | 蝶舞輕繞 2026-03-29 | 4/200 |
|
|
[考研] 0856求調(diào)劑 +13 | zhn03 2026-03-25 | 14/700 |
|
|
[考研] 調(diào)劑考研 +3 | 王杰一 2026-03-29 | 3/150 |
|
|
[考研] 085701環(huán)境工程,267求調(diào)劑 +16 | minht 2026-03-26 | 16/800 |
|
|
[論文投稿] Journal of Mechanical Science and Technology +3 | Russ_ss 2026-03-25 | 5/250 |
|
|
[考研] 機(jī)械學(xué)碩310分,數(shù)一英一,一志愿211本科雙非找調(diào)劑信息 +3 | @357 2026-03-25 | 3/150 |
|