当前位置:编程学习 > C#/ASP.NET >>

【求助】MFC单文档引入FORTRAN动态链接库报错

我想将一个fortran编写的动态链接库文件引入到我的程序中。此链接库为一个算法程序,如果用WIN32程序调用它一切正常,可编译可链接可运行,结果正确;但我将其写入我的MFC程序时,可编译可链接甚至可运行,但一旦激发就会报错,弹出一个我从没见过的对话框,示意程序出错。

我的MFC单文档含一个对话框,此对话框有一个按键(BUTTON1),如果一切正常,点击它会关闭对话框显示单文档界面。但我点击它却会弹出如下报错。希望有高手能给予帮助



我所有的调用动态链接库的代码都写在这个对话框的CPP文件中,如下:

// 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::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(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<n;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 __stdcall main()//int argc, _TCHAR* argv[])
{
const char dllPath[] = "lbfgsb.dll";

//加载动态库文件
HINSTANCE hLibrary = LoadLibraryA(dllPath); 
if(hLibrary == NULL){
int error =GetLastError ();
cout<<"Error of LoadLibrary = "<<error<<endl;

cout<<"Can't find the dll file."<<endl;
FreeLibrary(hLibrary); 
return -1;
}

/* (如果获得这个程序的句柄)获得正在运行程序的路径和文件名*/
bool exePathOut=true;

if(exePathOut){
char exePath[1000] = "\0";
GetModuleFileNameA(hLibrary,exePath,sizeof(exePath));
cout<<exePath<<endl;
}

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];

//
//c         nbd(i)=0 if x(i) is unbounded,
//c                1 if x(i) has only a lower bound,
//c                2 if x(i) has both lower and upper bounds, and
//c                3 if x(i) has only an upper bound. 

for(int i=0;i<n;i+=2)
{
nbd[i]=0;
l[i]=1.0;
u[i]=10;
}

for(int i=1;i<n;i+=2)
{
nbd[i]=0;
l[i]=1.0;
u[i]=10;
}

for(int i=0;i<n;i++)
{
x[i]=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<n;i++)
{
cout<<"x["<<i<<"]="<<x[i]<<endl;
}
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;




//FreeLibrary(hLibrary); 

system("pause");
return 0;
}
void CLoginDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
main();
CDialog::OnOK();

}
--------------------编程问答-------------------- --------------------编程问答-------------------- 没人回答啊~~~急求啊!!!
补充:.NET技术 ,  VC.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,