0%

Fortran应用及常见问题

Fortran出现stack overflow

stack就是堆栈,Heap就是堆。每个线程都有自己的stack用来保存局部变量和函数调用信息,根据编译器不同,通常大小1~4MB之间,如果用完了就会出现stack overflow exception。 一般Fortran编译器默认情况是allocatable array放在堆里, Automatic Array放在栈里。 栈的缺省设置一般为1048576 Byte = 1MB。
如果采用的是Microsoft Visual Studio和Intel Fortran编译器,可以在项目属性->Linker->System中Stack Reserve Size中设置栈的大小。

1
2
3
4
5
6
 1MB:    1048576 Byte 
 10MB:   10485760 Byte 
 64MB:   67108864 Byte 
100MB:  104857600 Byte 
128MB:  134217728 Byte 
256MB:  268435456 Byte (MAX)

Kernel32.Lib无法打开问题

在电脑中找到Kernel32.Lib(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib),并将它拷入到C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib

Fortran调用脚本命令和exe的语句

1
Result=SYSTEMQQ('脚本命令')

要使用上述语句,需要加上use IFPORT,表示利用这个库文件,此外对result需要进行整型变量的定义

1
call system("Filterdriver.exe")

Fortran死循环问题

在Kriging子程序中发现了一处死循环

有时候编译器会对代码进行优化提速,这可能会导致死循环问题,如果后续遇到代码没有问题,调试之后总是出现反常现象,甚至添加几句输出代码bug就没有了,这可以考虑是这个问题引起的。可以在项目属性->Fortran->Floating Point->Floating Point Model设置Strict (/fp:strict)

读入多个文件并对文件编号

利用adjustl和adjustr对齐,trim截去空格

1
File=‘first’//trim(adjustl(character))

连续写入文件的定义方法

1
open(unit=1,file=FileOut6,position='append')

VS2013编译时rc.exe not found

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools路径下缺少rc.exe文件,可以在系统盘中查找文件,然后将文件拷入对应的路径下类似的话,对于缺失其他应用程序,也可以利用同样的方法。

动态链接和静态链接

  • 动态链接:
    当使用动态链接时,编译得到程序需要在dll文件的链接下才能正常运行。优势是编译后的程序较小,能够实行可以模块化的处理。
  • 静态链接:
    在编译时使用静态链接,编译后的程序可以独立于链接的库运行,程序没有依赖,相当于程序中包含了原先库文件的内容。优势:依赖较小,缺点:编译后的文件较大

Fortran中调用window函数编程

当不使用Intel Fortran进行程序编写时,有时需要调用Windows函数来杀死进程之类的。在Intel Fortran中直接use dfwin和use dfwinty.f90,在别的编译器中,可以找对应的库文件或代码。
复盘:

  • 在做代码迁移时,为在codeblocks编译,我将use dfwin和use dfwinty删除了;经过很长时间,再回头来解决问题时,我已经忘记了我之前的操作,导致了我没有第一时间去搜在codeblocks怎么使用dfwin等模块,而去了解其中各个函数。
  • 我一直企图找到怎么配置各个函数可以在gfortran使用的或是怎样找到源码,思路并没有错,但显然这是事倍功半
  • 关键信息就是使用的两个模块,结果显然,直接搜在codeblocks怎么使用dfwin等模块,我并没有获得我想要的答案。我需要寻找这两个模块的替代品,然而直接搜关键字信息几乎没有。
  • 从网上的信息,我判断出来我可能要找到lib或者mod文件,就像数学库的调用一样
  • 紧跟着,我知道company visual Fortran是存在这两个模块的,在它的使用帮助中,然后我在我的电脑开始搜索,最后找到了。
    问题关键是我一开始遗漏了两个模块。

如何传递动态数组

MKL数学库的调用