错误分析:floating point formats not linked
最近在编写结构体-链表程序时,出现floating point formats not linked这样的错误提示,开始以为是自己编程的问题,可仔细检查核对没有什么错误。简写程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
struct student
{
int num;
float score;
struct student *next;
};
void main()
{
struct student *p;
clrscr();
p=(struct student *)malloc(sizeof(struct student));
scanf("%d,%f",&p->num,&p->score);
printf("%d,%f",p->num,p->score);
free(p);
}
程序没什么问题,可编译运行后当输入101,98时就会出现#include<stdlib.h>
#include<conio.h>
struct student
{
int num;
float score;
struct student *next;
};
void main()
{
struct student *p;
clrscr();
p=(struct student *)malloc(sizeof(struct student));
scanf("%d,%f",&p->num,&p->score);
printf("%d,%f",p->num,p->score);
free(p);
}
scanf:floating point formats not linked
这样的错误,让人很郁闷。
后来上网查了一些资料,才知道这是Borland run-time error ,详细说明如下:
Why did my program bomb at run time with 'floating point formats not linked' or 'floating point not loaded'?
--------------------------------------------------------------------------------
Date: 5 Feb 2002 22:03:03 -0400
These messages look similar but have very different causes.
"Floating point not loaded" is Microsoft C's run-time message when the
code requires a numeric coprocessor but your computer doesn't have one
installed. If the program is yours, relink it using the xLIBCE or xLIBCA
library (where x is the memory model).
"Floating point formats not linked" is a Borland run-time error (Borland
C or C++, Turbo C or C++). Borland's compilers try to be smart and not
link in the floating- point (f-p) library unless you need it. Alas, they
all get the decision wrong. One common case is where you don't call any
f-p functions, but you have %f or other f-p formats in scanf() or
printf() calls. The cure is to call an f-p function, or at least force
one to be present in the link.
To do that, define this function somewhere in a source file but don't
call it:
static void forcefloat(float *p)
{
float f = *p;
forcefloat(&f);
}
It doesn't have to be in the module with the main program, as long as
it's in a module that will be included in the link.
If you have Borland C++ 3.0, the README file documents a slightly less
ugly work-around. Insert these statements in your program:
extern unsigned _floatconvert;
#pragma extref _floatconvert
解决办法:
只要在程序中加入任意红色部分就可以正常运行了。
但其中的原理还是没搞明白。
WHY?