错误分析: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时就会出现
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?
posted @ 2007-05-01 14:59  齐心  Views(2965)  Comments(1Edit  收藏  举报