计算化学公社

标题: 关于FORTRAN77写的代码求助 [打印本页]

作者
Author:
杜黎小松    时间: 2017-12-1 11:47
标题: 关于FORTRAN77写的代码求助
由于本人是从fortran95开始学习的,对于fortran的很多语句标号不清楚,无法了解下面代码的执行流程,想请教一下论坛的大神能否解释下流程
该流程是用于一组平衡组分热力学计算时赋初值代码,B(I,J)-化学矩阵,ACF(J)-化学式的下标:如CaHbOcNd,ACF(1)=a,ACF(2)=b... L-化学式中含有元素种类;x(J)-组分初值 ;LP1,vvv,z-中间变量,I,J-循环变量
PROGRAM main
......
        vvv=1.0
21   vvv=vvv*2.0
      DO 23  J=1,L
      Z=ACF(J)
     DO  22  I=LP1,N
     x(I)=1.3/vvv
22  Z=Z-B(I,J)*x(I)
      x(J)=Z
     IF(x(J))   21,21,23  ------此句话if语句后面的语句标号是什么意思,如果满足if条件,是跳出循环,还是继续循环?不懂这个写法,感觉像个递归过程。
23 continue
    前人写的代码,很不规范,goto满天飞,变量也不做解释,书写的代码很难看懂,需要能看懂人解释一下!不胜感激

作者
Author:
kyuu    时间: 2017-12-1 12:04
Arithmetic IF Statement
满足IF条件,执行label编号21,21,23
作者
Author:
sobereva    时间: 2017-12-1 12:48
IF(x(J))   21,21,23
意思是X(J)<0就goto 21,等于0也goto 21,>0就goto 23
作者
Author:
杜黎小松    时间: 2017-12-1 14:33
sobereva 发表于 2017-12-1 12:48
IF(x(J))   21,21,23
意思是X(J)0就goto 23

谢谢sob老师,终于明白了,原来跟C++的3目运算符有相似的地方。这下所有的流程就解释通了。
作者
Author:
杜黎小松    时间: 2017-12-19 19:44
sobereva 发表于 2017-12-1 12:48
IF(x(J))   21,21,23
意思是X(J)0就goto 23

sob老师,还想问你一个问题,就不发新帖占用空间了,
最近开发一个软件,老板要求有可视化界面,于是想到用MFC,而源程序用FORTRAN写好了,便将fortran代码打包为dll文件,供MFC调用,可是出现了如下问题:在我的编译的电脑上整个程序调用fortran的dll没问题,但是一将程序换到另外一个电脑上就始终出现加载dll文件失败的提示,程序的部分功能也就失效了,这是什么原因了,以下是我调用的代码:
FORTRAN接口:
   SUBROUTINE MONOPROPELLANT(molC,molH,molO,molN,Propellantname,NameLength,PropellantDensity,PropellantHf,Tc,Te,Isp,Cm,MolecularAvgMass,Qp,xc,xe)
!DEC$ ATTRIBUTES DLLEXPORT::MONOPROPELLANT
!DEC$ ATTRIBUTES REFERENCE::molC,molH,molO,molN,Propellantname,PropellantDensity,PropellantHf,Tc,Te,Isp,Cm,MolecularAvgMass,Qp,xc,xe
USE Constant
USE thermo
....
END SUBROUTINE MONOPROPELLANT
MFC中的C++代码:
   void CMonopropellant::OnBnClickedOk()
{
        UpdateData(TRUE);
        typedef void ( _cdecl* wndProc)(double& ,double& ,double& ,double& ,
                char* ,int& ,double& ,double& ,
                double& ,double& ,double& ,double& ,double& ,double&,
                double[],double[]);
        HINSTANCE hIns;
        hIns = LoadLibraryEx(_T("Monopropellant_dll.dll"),NULL,NULL);
        if(!hIns)
        {
                MessageBox(L"加载动态链接库:Monopropellant_dll.dll失败",L"ERROR",MB_OK);
                return;
        }
        wndProc propellant= (wndProc)GetProcAddress(hIns,"MONOPROPELLANT");
        if(!propellant)
        {
                MessageBox(L"加载函数失败",L"ERROR",MB_OK);
                ::FreeLibrary(hIns);
                return;
        }
        CString txt=_T(".txt");
        CString outputfilename;
        outputfilename.Format(_T("%s %s"),propellant_name,txt);
        wchar_t *p=outputfilename.GetBuffer(outputfilename.GetLength());
        outputfilename.ReleaseBuffer();
        int iSize;
        char *pName;
        iSize=WideCharToMultiByte(CP_ACP,0,p,-1,NULL,0,NULL,NULL);
        pName=(char*)malloc((iSize+1));
        WideCharToMultiByte(CP_ACP,0,p,-1,pName,iSize,NULL,NULL);
        int len=strlen(pName);
        double Tc,Te,Isp,Cm,MolecularAvgMass,Qp;
        double xc[25],xe[25];
        propellant(NumC,NumH,NumO,NumN,pName,len,propellant_density,propellant_Hf,Tc,Te,Isp,Cm,MolecularAvgMass,Qp,xc,xe);
        ::FreeLibrary(hIns);
        ...
}
很困扰,sob老师可否解答一下?   
作者
Author:
zjxitcc    时间: 2017-12-19 19:52
我说实话,我是比较反感一个老板让学生写可视化界面的。。。又不是专业设计GUI的,这种事应该请专门写GUI的码农或者社会上聘用相关人才来写。学生科研阶段,最多完善好比较好用的命令行参数和输入文件格式就可以了(像gjf)。学生写GUI又不额外给工资。
作者
Author:
sobereva    时间: 2017-12-19 19:55
zjxitcc 发表于 2017-12-19 19:52
我说实话,我是比较反感一个老板让学生写可视化界面的。。。又不是专业设计GUI的,这种事应该请专门写GUI的 ...

如果学生之后不打算继续搞科研,会写GUI出路倒是广得多
作者
Author:
sobereva    时间: 2017-12-19 19:56
杜黎小松 发表于 2017-12-19 19:44
sob老师,还想问你一个问题,就不发新帖占用空间了,
最近开发一个软件,老板要求有可视化界面,于是想到 ...

MFC我都10年没用了,基本忘光了...
其实Fortran程序加个图形界面,要求不高的话,用DISLIN库是个好的选择,Multiwfn就是这样,还能完美跨平台。
作者
Author:
zjxitcc    时间: 2017-12-19 20:00
sobereva 发表于 2017-12-19 19:55
如果学生之后不打算继续搞科研,会写GUI出路倒是广得多

那是
作者
Author:
杜黎小松    时间: 2017-12-19 20:10
zjxitcc 发表于 2017-12-19 19:52
我说实话,我是比较反感一个老板让学生写可视化界面的。。。又不是专业设计GUI的,这种事应该请专门写GUI的 ...

没法啊,老板要求一个简单的界面,
作者
Author:
杜黎小松    时间: 2017-12-19 20:12
sobereva 发表于 2017-12-19 19:56
MFC我都10年没用了,基本忘光了...
其实Fortran程序加个图形界面,要求不高的话,用DISLIN库是个好的选 ...

哦,那这样的话sob老师,国内哪个C++论坛比较好,我去找论坛上问一下,可能上面的人懂?DISLIN库还没听过,只知道IMSL库,我也去详细了解下.
作者
Author:
sobereva    时间: 2017-12-19 20:14
杜黎小松 发表于 2017-12-19 20:12
哦,那这样的话sob老师,国内哪个C++论坛比较好,我去找论坛上问一下,可能上面的人懂?DISLIN库还没听过 ...


http://www.mps.mpg.de/dislin
主页里面有一些DISLIN构建的图形界面程序的例子,如果觉得够用了,比起折腾MFC方便多了

作者
Author:
Daniel_Arndt    时间: 2017-12-20 21:08
本人迄今为止唯一一次用上GUI的,是大一时C语言课的大作业,根据老师的提示用了个EasyX(一个简单低幼至极点的图形库)。。。。。。之后就与GUI无缘了。。。。。。
作者
Author:
杜黎小松    时间: 2017-12-22 15:29
Daniel_Arndt 发表于 2017-12-20 21:08
本人迄今为止唯一一次用上GUI的,是大一时C语言课的大作业,根据老师的提示用了个EasyX(一个简单低幼至极 ...

哈哈,同乐




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3