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是存在这两个模块的,在它的使用帮助中,然后我在我的电脑开始搜索,最后找到了。
问题关键是我一开始遗漏了两个模块。