【发布时间】:2014-05-22 19:30:38
【问题描述】:
我目前正在将一个 C 项目从 linux 移植到 windows,在此期间我遇到了一个奇怪的错误。在源文件中有这两行:
fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0);
printf("%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0);
需要明确的是,文件是以二进制模式“wb”打开的。 文件中的输出为:
18 0.000000 0.000000 166818935138251830000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000
而命令行中的输出是:
18 0.000000 0.000000 0.000000
命令行版本正确。 但是在 linux 下,文件和命令行都会给出正确的输出。我无法像尝试简单代码一样制作可重现的代码:
int a = 18;
fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", a, 0, 0, 0);
它将给出预期的输出。我也不能上传原始文件,因为它有千行长。但它通过编译没有错误,顺便说一句。
此时我真的很困惑,打印0怎么会导致错误?任何有关错误来源的提示将不胜感激。
更新 1:
问题似乎与 Gtk 库有关。这个程序有两个版本,一个是命令行,另一个是用 Gtk+2 编写的 GUI。两个版本都使用包含上述代码的同一个文件,但只有 GUI 版本会出现此错误。
那么这似乎是与Gtk库有关的问题,但我不知道进一步调试。
更新 2:
我尝试了以下两个修复方法
fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, 0.0);
fprintf(fp, "%4d %11.6f %11.6f %11.6f\n", cell->total_atom_no, 0, 0, (float)0);
错误仍然存在。 我可以毫无问题地将这些零打印为 srings,但我需要知道出了什么问题。
【问题讨论】:
-
可能与您将整数打印为双精度浮点值有关。
-
@JoachimPileborg 不是。正如我提到的,一个简单的例子将给出正确的结果。而且我从来没有遇到过使用 %f 打印整数的问题。
-
undefined behavior 就是这样,即使它看起来有效,但它是不正确的。至于您的编辑,请记住
printf(and family) 中的"%f"格式需要double作为参数,而不是float。 -
@JoachimPileborg 你是对的。我试图将所有三个零都加倍,并且行为恢复正常。非常感谢!你能回答我吗?