|
楼主 |
发表于 2006-6-16 01:21
|
显示全部楼层
是编译器的问题:
引用自:
http://www.stu-shop.com/post/c-scanf.html
问题一: 程序编译通过,但运行错误提示如下:
scanf : floating point formats not linked
Abnormal program termination
出错示例程序:
- #include <stdio.h>
- int main(void)
- {
- int i,j ;
- float s[3][3];
- /*这里*/
- for(i=0;i<3;i++)
- for(j=0;j<3;j++)
- scanf("%f",&s[i][j]);
- for(i=0;i<3;i++)
- for(j=0;j<3;j++)
- printf("%f",s[i][j]);
- }
复制代码
这实际上是个与本文主题无关的问题,也是与scanf()函数无关,是编译器的问题。
原因很明确:没有链接浮点库。早期系统内存资源紧张,多维浮点数组占用内存量大(一维浮点数组就没有此问题),因此TC在编译时尽量不加入无关的部分,在没发现需要浮点转换程序时,就不在可执行程序中安装这个部分。而有时TC又不能正确识别实际上确实需要做浮点转换,因此就会出现上面错误。
解决的方法:告诉TC需要做浮点数的输入转换。将以下语句加入上面程序中标有/*这里*/处。
方法一:
方法二:
也就是说,编译器只要有浮点转换的线索,TC就会把浮点转换连上,所以一般大一点的程序里的就会有浮点变量反而没有此问题。
但问题到此并没结束,我在上面有句“一维浮点数组就没有此问题”,那么我们来看看这样行不行:
- #include <stdio.h>
- int main(void)
- {
- int i,j ;
- float s[3][3],*ptr;
- ptr=&s[0][0];
- for(i=0;i<3;i++)
- for(j=0;j<3;j++)
- scanf("%f",ptr+i*3+j);
- for(i=0;i<3;i++)
- for(j=0;j<3;j++)
- printf("%7.2f\n",s[i][j]);
- }
复制代码
这样我们就把多维浮点数组降为一维浮点数组来处理,调试一下,程序运行正常。这说明TC编译器仅在处理多维浮点数组(结构体)有此“未链接浮点库”的问题。
[ 本帖最后由 iptton 于 2006-6-16 01:23 编辑 ] |
|