24小时热门版块排行榜    

查看: 2336  |  回复: 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."<                 FreeLibrary(hLibrary);
                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 ]
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

swustxxl

金虫 (正式写手)

怎么没人回答啊
2楼2010-10-17 08:29:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

magic7004

金虫 (职业作家)


余泽成(金币+1):谢谢参与应助! 2010-10-18 10:32:55
直接调用DLL中的函数,需要DLL的头文件(.h)和库文件(.lib)
流氓不可怕,可怕的是流氓有文化,有文化又BH的流氓无敌~~!
3楼2010-10-17 09:27:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

magic7004

金虫 (职业作家)


余泽成(金币+1):谢谢参与应助! 2010-10-18 10:33:02
另外,C++编译器会对函数改名的。楼主可以用loadlibrary和getprocaddress来调用DLL中的函数。
流氓不可怕,可怕的是流氓有文化,有文化又BH的流氓无敌~~!
4楼2010-10-17 09:29:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

想飞的猪

木虫 (正式写手)


余泽成(金币+1):谢谢参与应助! 2010-10-18 10:33:11
我知道一个数值计算类库《VC++数值计算类库》不错!你可以试试!还有就是你可以连接Matlab!
5楼2010-10-17 14:25:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

swustxxl

金虫 (正式写手)

ajian04:谢谢参与交流~ 2010-10-18 13:23:42
引用回帖:
Originally posted by magic7004 at 2010-10-17 09:27:00:
直接调用DLL中的函数,需要DLL的头文件(.h)和库文件(.lib)

我在解决方案中添加了一个相关的.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
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

swustxxl

金虫 (正式写手)

ajian04:欢迎交流~ 2010-10-18 13:23:48
引用回帖:
Originally posted by 想飞的猪 at 2010-10-17 14:25:12:
我知道一个数值计算类库《VC++数值计算类库》不错!你可以试试!还有就是你可以连接Matlab!

我是编写应用程序给用户使用的,本身程序只有几兆,不可能还让用户额外装个几百兆的MATLAB支持吧。你推荐的书我会去查阅一下,多谢了
7楼2010-10-17 18:41:20
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

想飞的猪

木虫 (正式写手)

ajian04:欢迎交流~ 2010-10-18 13:23:53
引用回帖:
Originally posted by swustxxl at 2010-10-17 18:41:20:





我是编写应用程序给用户使用的,本身程序只有几兆,不可能还让用户额外装个几百兆的MATLAB支持吧。你推荐的书我会去查阅一下,多谢了

好像你说的不对吧?最后编译完了以后程序就可以脱离Matlab实际没多大!
8楼2010-10-17 20:50:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gd88

金虫 (小有名气)

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
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

swustxxl

金虫 (正式写手)

引用回帖:
Originally posted by gd88 at 2010-10-20 22:48:24:
1、你的问题,可以考虑去CSDN问问,
2、是否排除数据类型的问题?
3、也有可能是fortran编译器版本的问题,如:http://software.intel.com/en-us/forums/showthread.php?t=73197

一般情况,googl ...

我问过CSDN,现在还没人回帖

我其实不是做FORTRAN的,甚至不是专业做程序的,现在手头上的程序要处理相关背景下的数据拟合,需要用到这个动态链接库,结果碰到这个问题,是束手无策。我试过VS2005和VC6,都会出现同样的情况,问过好几个老师也都没解决。
10楼2010-10-21 09:11:45
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 swustxxl 的主题更新
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 有没有仍没收到信息的 +3 德尚中行 2026-08-27 3/150 2026-08-28 15:24 by rongshuxia
[教师之家] 导师吐槽:我怎么摊上了这么个极品研究生! +8 苏东坡二世 2026-08-23 8/400 2026-08-28 14:41 by lkforward
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 怎么查啊 +6 huang1991js 2026-08-26 6/300 2026-08-28 08:42 by winsaint
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[文学芳草园] 梦想 +3 myrtle 2026-08-26 3/150 2026-08-27 10:01 by angelyueyi
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 我不理解! +15 Edward_pc 2026-08-26 23/1150 2026-08-26 20:34 by zzuzxg
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +7 process2012 2026-08-23 10/500 2026-08-26 19:23 by hmhminy
[基金申请] 系统查不到 +10 董八千 2026-08-26 10/500 2026-08-26 16:30 by Equinoxhua
[基金申请] 范进中举一文的中心思想 +9 炎黄贵胄 2026-08-22 10/500 2026-08-26 15:40 by semaglutide
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 能否退出参与的面上项目解除限项 +23 koalala 2026-08-24 26/1300 2026-08-26 14:29 by 宝贝虫子
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 在坚冰还盖着北海的时候,我看到了怒放的梅花。 (金币+10) +6 ziyangfang 2026-08-25 9/450 2026-08-25 20:26 by huagongfeihu
[基金申请] 明天应该可查了!? +6 chengyan1220 2026-08-23 6/300 2026-08-25 19:45 by zfd97
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
[基金申请] 如果此刻你正在为国基感到焦虑,不妨来听听这首《基金之外》 +8 scalable 2026-08-24 8/400 2026-08-25 12:52 by jnhyjjm
信息提示
请填处理意见