Borland C++“浮点格式未链接”错误的官方解释 (2007-06-13 00:34:08)
scanf结构体中的浮点数数组时报错"Floating point formats not linked"
可程序语法没错,原来报这种错误有时是类型的错误,比如%f一个long,这次很怪表明没有任何语法的错误。
属于其中的第3点,加入函数定义如下就ok了,不调用
static void force_fpf()
{
float x, *y; /* Just declares two variables */
y = &x; /* Forces linkage of FP formats */
x = *y; /* Suppress warning message about x */
}
原文如下
问题描述:
此文档将解释程序错误“浮点格式未链接:异常程序中止(FLOATING POINT FORMATS NOT LINKED: ABNORMAL PROGRAM TERMINATION)”产生的原因,并指引你如何解决此问题。除非有特别说明,这个问题及相应的解决方法适用于所有版本的Turbo C、Turbo C++、Borland C++。
什么是浮点格式?
浮点格式是一个格式化信息的集合,该集合使得一些运行时库函数(runtime library function)可以操作浮点数,比如scanf()和atof()。
该问题何时会被修复?
我们并没有计划修复此问题,因为这并不是一个BUG。编译器的原意是在不需要的时候不链接浮点格式,以节约1KB内存。作为交换,程序员必须明确地在那些隐晦地操作浮点数的程序中说明自己的需要。
我该如何去除该错误消息?
因为有多种可能均可引发该问题,检查下列每个潜在的原因并找到解决该问题的方法。以下列出最普遍的引发该问题的原因:
1、原因:将浮点选项设为None。要操作浮点数,必须将编译器的浮点选项设为Emulation或80x87。
解决方法:将浮点选项设为Emulation或80x87。在集成开发环境(IDE)中,这个选项可能在Options &line; Compiler &line; Advanced Code Generation或者Options &line; Compiler &line; Code Generation &line; More中,这与你所使用的编译器有关。如果使用的是命令行编译器,请使用合适的-f开关。
2、原因:执行TLINK时,库的顺序错误(Cx.LIB在EMU.LIB之前列出时将导致此问题。)
解决方法:这个错误通常发生在使用命令行编译器,并将TLINK和BCC(TCC)分开执行时发生。当执行TLINK时,将库的顺序改变为:
[用户库] [GRAPHICS.LIB] EMU.LIB MATHx.LIB Cx.LIB
(在中括号中的库是可选的。)
注:在《Borland C++ Tools & Utilities Guide》一书的第58页存在一处印刷错误,其中的TLINK命令行中列出的库顺序有误。那个错误的顺序正会导致浮点格式未链接。
3、原因:可能是编译器过度优化了程序,或你的程序操作浮点数时十分有限,并且采用了特殊的方式。在一些隐蔽的场合,编译器会忽略scanf()中使用的浮点数(例如,试图读取结构体(structure)中浮点型数组的一个元素时)。
解决方法:如果你使用的是Borland C++或Turbo C++ 3.0以后的版本,请阅读A部分。如果使用的是Borland C++ 2.0、Turbo C++ 2.0或任何版本的Turbo C编译器,请阅读B部分。(译者注:此处与原文不同,原文认为任何版本的Turbo C++都必须使用B部分述及的方法,但实际上Turbo C++ 3.0及以后的版本可以使用A部分的方法解决该问题。)
A部分(BC/TC++ 3.0或以后的版本):
在某一源代码模块中加入:
extern _floatconvert;
#pragma extref _floatconvert
在Borland C++ 3.0的README和HELPME!.DOC文档中,不正确地指出只需在源码中加入
#pragma extref _floatconvert
来解决FPFNL错误。如果你不加入“extern _floatconvert;”这一行,你会得到“未定义符号 _floatconvert。(Undefined symbol _floatconvert.)”错误。如果你将两行代码的顺序颠倒,也会得到同样的错误消息。请注意“#pragma”一行的末尾没有分号。如果你加上了分号,将得到“错误的pragma指示语法(Bad pragma directive syntax)”错误。
在Borland C++ 3.1的README文档中指出下面的方法:
extern void _floatconvert();
#pragma extref _floatconvert
也可以解决问题。事实上,_floatconvert是一个变量抑或函数无关紧要,只要链接器可以识别该符号即可。
在BC++ 3.1的HELPME!.DOC文档中,已经改正了需要加入的这两行代码的错误。
B部分(BC/TC++ 2.0或TC):
加入源码模块中下面的force_fpf()函数。你不用调用此函数,只需将其包含在某个源码模块中。
static void force_fpf()
{
float x, *y; /* Just declares two variables */
y = &x; /* Forces linkage of FP formats */
x = *y; /* Suppress warning message about x */
}
(译者注:代码中注释的意义为:定义两个变量,强制使用浮点格式链接,使用变量x以防止产生警告信息。)
4、原因:在使用scanf()时忘记在变量表达式前加取址符“&”。例如:
float foo;
scanf("%f", foo);
解决方法:修改代码,在需要的地方加上取址符“&”。例如,上面的代码应改为:
float foo;
scanf("%f", foo);
5、原因:Turbo C 2.0在使用scanf()时存在一个BUG。
解决方法:获取并安装TC2PAT.ARC中的补丁。这个文件可以在DLBBS(408-439-9096)中的Languages / C++ / Patches部分下载到。
6、原因:Turbo C 2.01在使用atoof()和strtod()时存在一个BUG。
解决方法:获取并安装TC21PT.ARC中的补丁。这个文件可以在DLBBS(408-439-9096)中的Languages / C++ / Patches部分下载到。
7、原因:试图在IDE中创建一个Phar Lap DOS Extender应用程序。
解决方法:Phar Lap随其DOS Extender提供了一个名为BCC286.EXE的可执行文件。这个程序可以调用Borland的命令行编译器(BCC)和命令行链接器(TLINK)。因为在IDE和命令行下的链接器有所不同,所以你不能在IDE中创建Phar Lap DOS Extender应用程序,让它们正确运行。如果你试图那样做,就可能得到浮点类型未链接的错误消息。解决的方法就是使用命令行工具,BCC和TLINK,而不使用IDE。
(译者注:DOS Extender是创建DOS保护模式接口(DOS Protected Mode Interface)应用程序的工具,保护模式对应于默认的实模式(Real Mode),它使得DOS应用程序可以使用更多的内存。在实模式下,应用程序最多只能和DOS分享640KB的基本内存。)
本文详细介绍了在使用Borland C++编译器时遇到的“浮点格式未链接”错误及其解决方案。文章列举了可能导致此错误的多种情况,并针对每种情况提供了具体的解决办法。
8912

被折叠的 条评论
为什么被折叠?



