首页 > 教程 > 正文

阅读排行

FAQ之 常见错误
2014-02-02 13:45:35   来源:Fcode研讨团队   评论:0 点击:

本文从编译错误,链接错误,运行时错误,计算结果错误等四个方面介绍了常见的错误及解决思路。适合初学者阅读。

首先应该明确:错误有哪几种?我们当前遇到的是何种错误?

阐述这些问题前,我们先讨论一下常规的应用程序开发的过程:

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,遇到负号无法输出。

Q0011:【CVF / IVF 】 The statement label ?? is referenced but not defined in this scope.
原因:某语句标号的语句被使用了,但没有定义。比如 goto 100,但没有 100 这句标号的语句。
解决:补齐语句标号语句,或者取消对该标号语句的使用。

二. 链接错误

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++ 的运行时库。对于这个警告框,基本上得不到有用的信息

相关热词搜索:Fortran常见错误

上一篇:FAQ之 Console程序一闪而过
下一篇:Code::blocks + GFortran开发环境设置方法

分享到: 收藏