fortran cycle中出现的错误

后使用快捷导航没有帐号?
扫一扫,访问微社区
只需一步,快速开始
只需一步, 快速开始
查看: 977|回复: 4
Fortran常见错误分析(转自Fcode研讨团队/)
在线时间 小时
登录后查看更多精彩内容~
才可以下载或查看,没有帐号?
FAQ之 常见错误 13:45:35& &来源:Fcode研讨团队& &评论:1 点击:2030本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。适合初学者阅读。首先应该明确:错误有哪几种?我们当前遇到的是何种错误?阐述这些问题前,我们先讨论一下常规的应用程序开发的过程:1&&编写代码,使用一个或多个源代码文件。2&&对第一步的每一个源代码文件执行编译操作。得到一个或若干个目标代码。3&&将目标代码,运行时库(Run-time Library)和其他使用到的函数库链接起来。得到一个可执行文件(EXE 或其他)4&&编写程序的说明书,必要的(输入)数据文件5&&将上述得到的结果发布给用户。(发布的方式可以是刻录成光盘,销售,放在网站上供别人下载,或者其他)6&&用户得到程序后,运行,输入数据,得到计算结果。
对于很多 Fortran 程序员来说,可能用户就是自己,也可能仅仅是自己教研室的同事同学。所以第4,5,6步骤很多时候不明显。而如果使用集成开发环境(IDE)进行开发,第1,2,3步骤又可以一键完成。因此,很多初学者就认为,写程序就是:输入代码,运行,得到结果。这样的理解太狭义。
不管我们面对什么使用者来写代码,程序开发应该是上述的过程。我们的编译器,编译环境,也是为这个过程而设计的。
于是,我们将错误分为四种:一. 编译错误(发生在第2步)
& & 编译错误,一般是源代码书写格式不正确,不符合语法要求。二. 链接错误(发生在第3步)
& & 链接错误,一般是源代码结构不完整,运行时库或函数库使用不合理。三. 运行时错误(发生在第6步)
& & 运行时错误,一般是执行代码时,遇到了事先未料及的错误。比如内存不足了,磁盘空间不够了,输入文件格式不对了,输出文件写入失败了等等。四. 计算结果不符合预期(程序代码不规范,或不符合你的设想)
& & 计算结果不符合预期,可能性就很多了。语法与你的想法不一致,超出函数库的适用范围,执行流程控制不当等等。
这四种错误,其排查难度依次增大。也就是,编译错误最容易排查和修改,而计算结果不正确,最让人头疼。
不管是阅读本文,还是在网络上求助,抑或是与其他程序员交流。首先一定要弄清楚,自己遇到的,是哪一种错误。如你使用的是 IDE 方式开发,具体不知道是第一种还是第二种错误,应该尝试手动编译代码,手动链接程序,看错误发生在哪一步。使用一键 Build 可能会让初学者搞不清楚。
对于前三种错误,一定要找到错误提示,这对于你解决问题至关重要!
另外需要说明的是,对于同样的错误,不同的编译器给出的提示可能也是不一样的。下面都以Compaq Visual Fortran 和 Intel Visual Fortran 举例。其他编译器提示应该类似。
一. 编译错误
编译错误经常让初学者感到恐怖,因为动辄几十几百乃至上千个错误。然而实际上,错误可能并没有那么多。这是因为编译器对代码进行构析,遇到错误后,会严重影响接下来的分析,导致将本来正确的写法认为是错误。
所以,对于编译错误,一定先解决第一个。然后重新编译,然后再解决新的第一个。直到顺利编译为止。
编译错误,在 IDE 环境下一般可通过双击切换到错误所在行。在命令行下也会显示错误所在的行数。
Q0001:【CVF】Severe: Invalid argument , Error executing df.exe编译错误提示类似于:f90: Severe: Invalid argument... file is 'C:\?D??\fcode.f90'Error executing df.exe原因:这是由于 Compaq Visual Fortran 不支持中文路径下的源代码文件。源代码文件名作为参数(argument)传递给编译器(df.exe)被认为是非法的(Invalid 因为含有中文)。解决:将源代码文件放入英文路径下重新编译。
Q0002:【CVF / IVF 】Error spawning df.exe 或 The Fortran compiler (ifort.exe) cannot be found.原因:这多半是由于编译器安装不合适造成的,或者安装时未设置合理的环境变量。执行编译器( df.exe 或 ifort.exe ) 失败或根本找不到。解决:重新安装编译器(win7/win8 下请不要使用 CVF),注意安装时如选择是否设置环境变量,选Yes。
Q0003:【CVF / IVF 】Unrecognized token '?' skipped原因:代码中出现了编译器无法识别的字符。解决:首先检查自己的源代码文件是否为 ANSI 编码,而不是Unicode编码或其他。然后检查错误行,是否存在特殊字符?包括除字符串常量和注释行之外的中文。尤其注意括号,逗号,冒号是否是半角?
Q0004:【CVF / IVF 】Syntax error原因:语法错误解决:语法错误的可能性很多,但凡违反语法规定的写法,都可能出这个错误。认真检查错误行,某些编译器可能会给出更详细的错误提示,翻译一下会更便于查找错误。
Q0005:【CVF / IVF 】Unbalanced parentheses原因:括号不成对出现,例如 a(3))解决:检查错误行的括号,确保成对出现。
Q0006:【CVF / IVF 】An unterminated block exists.原因:If 或 Do 等区块没有结束。解决:检查 If 是否有 EndIf 对应,Do 是否有 End Do 对应
Q0007:【CVF / IVF 】A specification statement cannot appear in the executable section.原因:声明语句出现在了执行语句中解决:所有声明语句必须在所有执行语句前面,即先声明所有变量,然后才有执行语句。调整这些语句的顺序既可。
Q0008:【CVF / IVF 】The type of the actual argument differs from the type of the dummy argument. [SOME].原因:SOME作为实参,它的的类型与对应的虚参不一致解决:我们建议所有实参与对应的虚参具有相同的类型,精度,大小和数组上下限。检查一下被提示的变量,其类型精度是否与虚参一致?尤其是没有使用 Implicit None 的程序单元,默认 IN 规则情况下,容易发生类型不一致。Q0009:【CVF / IVF 】 Cannot open include file '文件名.inc'原因:文件名.inc 做为被包含文件,无法打开解决:1.检查是否存在 文件名.inc; 2.检查 文件名.inc 是否在你的工程目录(文件夹);3.检查该文件是否被隐藏了扩展名,有时候我们看起来是 文件名.inc ,其实是 文件名.inc.txt,我建议取消隐藏扩展名设置。方法是 打开我的电脑,工具,文件夹选项,查看,取消“隐藏已知文件扩展名”;4.检查该文件是否是 ANSI 编码,用记事本打开,文件另存为时既可查看编码,请确保是 ANSI 的,而不是 unicode,utf-8 等;
Q0010:【CVF / IVF 】 Recommended relationship between field width 'W' and the number of fractional digits 'D' in this edit descriptor is 'W&=D+3'原因:浮点数格式输出符中,W & D+3。解决:由于浮点数输出时,需输出至少一位整数,一个小数点,(可能的)一个负号。所以,建议宽度 W 大于小数点后的 D + 3。比如 3.1415,格式为 F6.4,6只比4大2,如果遇到负数,就会无法输出负号。造成 ****** 出现。注意,这只是一个警告,如果你确定不会有负数,则可以无需干涉。
同理,对于科学计数法,会有 W&=D+7 的要求。比如 3.1415E+35,格式为 ES10.4,10只比4大6,遇到负号无法输出。
二. 链接错误
Q1001: unresolved external symbol _SOME&&/ 无法解析的外部符号 _SOME,该符号在函数 _MAIN__ 中被引用原因:找不到某些函数或子程序。如果这些函数或子程序在函数库中,没有正确被使用。如果 SOME 是数组,可能没有定义为数组,而被编译器误认为是函数。解决:找到这个函数并添加到工程内,或正确设置函数库并使用,或定义该数组。
Q1002: unresolved external symbol _MAIN__ / 无法解析的外部符号 _MAIN__,该符号在函数 _main 中被引用原因:找不到主程序。解决:补充主程序。
Q1003:unresolved external symbol _WinMain@16 / 无法解析的外部符号 _WinMain@16__,该符号在函数 _main 中被引用原因:找不到 WinMain 主程序。WinMain 是 WinGUI 界面工程所需的函数。解决:如果你不是刻意的开发windows界面程序,请重新选择 console 工程类型。否则,请补充 WinMain 函数。
Q1004: _MAIN__ already defined in main.obj / _MAIN__ 已经在 main.obj 中定义原因:MAIN 函数已经在 main.obj 文件中定义过。即,有多个文件中书写了相同名称的函数或主函数。解决:删除多余的同名函数,或者检查是否重复添加了相同的文件在工程中。
三. 运行时错误
请注意,某些编译器编译后的程序,在发生运行时错误时,会弹出VC++ Runtime Library 的警告框。这是因为这些编译器的 Runtime Library 部分使用了 VC++ 的运行时库。对于这个警告框,基本上得不到有用的信息。我们应该查看黑色 console 窗口上的错误提示。
另外,几乎没有程序员可以保证自己的程序一定没有运行时错误。因为运行时错误可能发生在某些特定的情况之下,而不一定是每次都会发生的。
例如:一个程序大多数时候跑得没有问题,突然有一天遇到内存占用很大,一块数组申请失败;或者忽然有一天,用户的磁盘满了;再或者,用户把一个具有只读属性的文件指定为输出文件;还有杀毒软件的一些拦截行为也可能导致某些操作意外失败。就计算程序来看,程序可能认为某个曲线是单调的,或者光滑可导的,某个数组的数据一点是大于 0 的,某个方程一定是有解的,但实际上用户输入的算例并不一定满足这些条件。
因为用户运行程序,是在未知的计算机环境,未知的算例进行的。因此,很多意外的运行时错误我们很难预料。即便是非常商业化的程序,如 QQ,迅雷,Internet Explorer,Visual Studio,甚至我们使用的编译器自身,出现运行时错误意外终止都不是新鲜事。
我们需要做的,恐怕只是尽量的避免运行时错误,使程序在绝大多数情况下可以正常运行计算出结果。此外,不是所有的运行时错误都需要修改代码,有些还需要调整输入文件,或者改变其他运行环境。(当然了,改变代码使得程序能更宽泛的适应多种特殊情况更好)Q2001: floating invalid / math error / DOMAIN error / Integer divide by zero原因:这是计算时最容易发生的错误,他表示浮点数错误,数学函数错误(如超出数学函数的定义域,负数开方,分母为零等等)。解决:对数据进行合理控制,判断是否在定义域内,如每个算例均出现,应进行 Debug 调试。
Q2002: Program Exception - array bounds exceeded / Subscript #1 of the array A has value 101 which is greater than the upper bound of 100原因:这是数组越界,即,数组引用的元素超出了定义它的范围。比如定义 a(50:100),如引用 a(49) 或 a(101) 则会越界。很多时候,这是循环对数组操作时,没控制好,比如 Do i = 50 , 100 然后引用了 a(i+1),当i=100时,i+1=101,就会越界。Intel Fortran 的数组越界会给出很详细的错误提示,包括具体越界的数组名,定义范围和引用角标。解决:检查越界数组,根据情况修改代码。
Q2003: End-of-file during read原因:这是读取文件时遇到了文件的结束。例如,代码要求数据有3行数据,而实际输入文件只有2行。在某些时候,甚至输入文件根本不存在或是空白文件。此外,数据文件缺失某些行某些列也是较大的可能。当然,也可能是循环读取文件时没控制住。比如想读100行,结果写错了,读了1000行。解决:补足数据文件,或者修改代码使得读取的数据与实际数据文件一致。
Q2004: File not found原因:这个就简单了,文件找不到。最大的可能是文件名写错了,路径(文件夹)放置不正确。解决:增加应有的文件,或放置到合适的路径下。
Q2005: Attempt to access non-existent record原因:一般针对直接读取文件,意思是读写了一个不存在的记录。例如文件只有2个记录,却视图读取第3个。也可能是记录长度的字节数设置不正确,使得应该在第2记录的字节超出了文件的字节。解决:修改代码或修改文件,使得记录长度与个数相匹配。
Q2006: Insufficient virtual memory原因:程序试图访问一个受保护或不存在的内存地址。多数为可分配数组,指针等动态内存引发的错误。解决:确保数组已经经过分配后才访问,确保指针指向可用的内容。
Q2007: Format syntax error at or near x x原因:在 x x 位置或附近的格式符 x 错误。因为使用了错误的输入输出格式符。解决:修改源代码中对应的格式符,或输入正确的可识别的格式符。
Q2008: List-directed I/O syntax error原因:输入数据不正确。例如从文件或字符串中读取整型或浮点数数据,而遇到非数字的符号,比如“abc”解决:这个问题多数需要修改输入文件。
Q2009: Stack overflow原因:堆栈溢出。可能性较多:堆栈不够;程序内局部变量太大或太多;递归调用终止失控。解决:首先尝试改大堆栈,在不同编译器上具体操作不同。VS 下可设置工程属性,如图:
命令行下增加链接开关 /STACK:,如果还是不足,可将大的局部数组改为可分配数组。如有递归调用函数,检查其终止条件是否设置合理。
Q2010: Program Exception - access violation原因:这个问题可能性很多,属于比较麻烦的运行时错误。表示程序尝试读写一个非法的内存地址。常见于可分配数组尚未分配就传入子程序使用,子程序中修改了虚参但对应的实参为常数。等等。解决:Debug 调试,检查错误所在位置。
Q2011:Formatted I/O to unit open for unformatted transfers / Unformatted I/O to unit open for formatted transfers原因:使用无格式打开的文件,但使用了有格式的输入输出。或反之。解决:使用匹配的格式打开和输入输出。
Q2012:Sequential-access I/O to unit open for direct access原因:使用直接读写方式打开的文件,但使用了顺序读取的输入输出。解决:使用匹配的读写方式打开和输入输出。
IVF 的运行时错误官方有专门的文档,大约有700多个。这里无法一一列举。如果你遇到运行时错误,请先尝试翻译它。然后尝试去解决。CVF和其他编译器的运行时错误与这些类似但不完全相同。
四. 计算结果不符合预期
这是最麻烦的错误了。编译器和操作系统已经无法帮助我们来检查和预知错误。需要我们自己进行 Debug 调试,检查计算结果从哪里开始与我们的预期开始不同了。
如果你的代码在其他编译器或其他操作系统上可以正常使用,但更换编译器以后计算结果不正确,也不要觉得奇怪。语法只是规定了一部分规则,还有很多语法中尚未规定的事情,不同编译器的处理就不一样,导致这种结果。这恰恰说明代码还有隐含的错误。
一段严谨的代码,会尽量避免上述情况。我们在书写代码时,也应该如此。不要让代码离开你的计算机就变成一堆垃圾。
如果你遇到了计算结果不符合预期的情况,耐心的检查吧,以下可能会是突破点:1.检查变量是否全部定义并给定了类型和精度。程序单元都使用了 Implicit None 语句。2.检查变量是否有尚未初始化就使用的情况?3.函数调用过程中,是否存在虚参实参的类型差异。4.变量的 Kind 值在不同编译器上的含义是否有差别?5.直接读取文件的 RecL 的值在不同编译器上含义是否一致?6.是否使用了依赖编译器的函数库,在更换系统后同样替代的函数,适用范围是否一样?
最后,强调一下,如果你使用的编译器不是 Compaq / Intel Visual Fortran 系列,他们的错误提示与本文的可能不同。请你首先尝试翻译错误提示,大多数情况错误提示会把问题描述得比较清楚。
给自己设置一个个性的签名吧~
在线时间 小时
不错,对于遇到的常见问题解释的很详细,之后希望能够再补充。
给自己设置一个个性的签名吧~
在线时间 小时
谢谢分享!!
给自己设置一个个性的签名吧~
在线时间 小时
谢谢分享,好东西
给自己设置一个个性的签名吧~
在线时间 小时
这下有救了
给自己设置一个个性的签名吧~用vs2008和ivf11进行c和fortran的混合编程,出现lnk2019错误
[问题点数:40分]
用vs2008和ivf11进行c和fortran的混合编程,出现lnk2019错误
[问题点数:40分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
2008年12月 Linux/Unix社区大版内专家分月排行榜第二
2009年3月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。学习使用MKL,出现error lnk209, 大神救命啊_fortran吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:2,111贴子:
学习使用MKL,出现error lnk209, 大神救命啊收藏
我用的是VS2013+Intel Composer XE 2013 SP1,想用MKL自带的blas,lapack。
设置了Project& Properties& Libraries& Use Intel Math Kernel Libraryand, 我选了 Parallel。
运行了一个dgemm_example.f (来自Intel® Math Kernel Library Tutorial)成功了
但我运行安装路径里的另一个example(C:\Program Files (x86)\Intel\Composer XE 2013 SP1\mkl\examples\examples_f95.zip\blas95\source)时,提示如下错误Error1 error LNK2019: unresolved external symbol _PRINTVECTORD referenced in function _MAIN__Source1.objError2 error LNK2019: unresolved external symbol _DASUM_MKL95 referenced in function _MAIN__Source1.obj具体程序如下:program DASUM_MAIN
use mkl95_precision, only: wp =& dp
use mkl95_blas, only: asum
implicit none
integer :: n
integer :: incx
integer :: nx, nx1, nx2
real(wp), allocatable :: x(:)
real(wp) :: sum
integer :: i!
Intrinsic Functions
intrinsic abs!
External Subroutines
external PrintVectorD!
Executable Statements
EXAMPLE PROGRAM'!
Read input data from input file
read*, n, incx
nx = 1+(n-1)*abs(incx)
allocate(x(n))
read*, (x(i),i=1,nx)!
Print input data
INPUT DATA'
print 100, n
call PrintVectorD(0,n,x,incx,'X ')!
Call DASUM subroutine
if (incx & 0) then
sum = ASUM(x(nx1:nx2:incx))
OUTPUT DATA'
print 101, sum
deallocate(x) 100
format(7x,'N=',i2) 101
format(10x,'DASUM = ',f8.3)
end刚接触fortran,求大神解答
登录百度帐号我的游戏推荐游戏
后查看最近玩过的游戏
为兴趣而生,贴吧更懂你。或【求助】运行fortran程序出现错误 : error LNK2019 怎么回事啊_百度知道
【求助】运行fortran程序出现错误 : error LNK2019 怎么回事啊
提问者采纳
------------------------------------------------------------------------1&amsa.obj : error LNK2019: 无法解析的外部符号 _MPI_INIT,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _MPI_COMM_RANK,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _MPI_COMM_SIZE,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _ZBQLINI,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _CPU_TIME_,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _ZBQLU01,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _ZBQLPOI,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _ZBQLNOR,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2019: 无法解析的外部符号 _MPI_FINALIZE,该符号在函数 _MAIN__ 中被引用1&amsa.obj : error LNK2001: 无法解析的外部符号 _MPI_NULL_COPY_FN1&amsa.obj : error LNK2001: 无法解析的外部符号 _MPI_NULL_DELETE_FN1&amsa.obj : error LNK2001: 无法解析的外部符号 _MPI_DUP_FN1&Debug\AMSA.exe : fatal error LNK1120: 12 个无法解析的外部命令1&1&Build log written to &file://E:\fortran\AMSA\AMSA\Debug\单敞厕缎丿等搽劝敞滑BuildLog.htm&1&AMSA - 13 error(s), 0 warning(s)========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个------------------------------------------------------------------------程序一开始有这样几行
其他类似问题
fortran的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁【求助】fortran程序未出错,但运行不出结果,中途中断! - 程序语言 - 小木虫 - 学术 科研 第一站
&& 查看话题
【求助】fortran程序未出错,但运行不出结果,中途中断!
各位请教下
& &我用“徐士良”,“积分一步的变步长龙格-库塔法”解常微分方程组,正常情况下解得t=0,p=1......t=399.99,p=0.50774,t=400,p=0.507614. 而当我改变常微方程组系数时,解到t=3.01,p=0.999047时,程序就好像卡在那了,运行很久也没反应,也没有显示“Press any key to continue”
& &&&同样的参数,我用MATLAB“ ode45”求解可以得到结果。
请问下有可能是哪方面的原因?
& &附件中位FORTRAN程序,能运行出结果,可以直接打开EXCEL,查看。
但把main.f90中的 rd=0.4*w0 改成 4*w0 运行一会就不运行了,打开EXCEL发现停在某个数值上了。一直等都没有结果,也没有任何出错信息。
& & 附件:http://good.gd/690578.htm
程序是不是陷入死循环了。你可以单步调试看看。 我可以确认没有陷入死循环,
& & 因为这个程序开始是可以运行,能出结果的,但我只把常微分方程组中某几项系数改变,循环没有变化。 给个能用 gfortran 编译的版本吗?呵呵…… Originally posted by snoopyzhao at
给个能用 gfortran 编译的版本吗?呵呵…… 你要在什么环境下运行呢?有代码可以自己编译的吧 就是你的代码用 gfortran 编译时出错,呵呵…… 我用的是 CVF&&IVF 我也分不清楚
&&不好意思,我没有你说的编译器。
var cpro_id = 'u1216994';
欢迎监督和反馈:本帖内容由
提供,小木虫为个人免费站点,仅提供交流平台,不对该内容负责。欢迎协助我们监督管理,共同维护互联网健康,如果您对该内容有异议,请立即发邮件到
联系通知管理员,也可以通过QQ周知,我们的QQ号为:8835100
我们保证在1个工作日内给予处理和答复,谢谢您的监督。
小木虫,学术科研第一站,为中国学术科研研究提供免费动力
欢迎监督,发现不妥请立即
E-mail: & QQ:8835100}

我要回帖

更多关于 fortran中parameter 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信