【发布时间】:2011-08-20 20:38:15
【问题描述】:
我是 C 的新手。我尝试为 Vector 编写函数,但一定有什么问题。
代码如下:
/* Defines maths for particles. */
#include <math.h>
#include <stdio.h>
/* The vector struct. */
typedef struct {
long double x, y, z;
} Vector;
Vector Vector_InitDoubleXYZ(double x, double y, double z) {
Vector v;
v.x = (long double) x;
v.y = (long double) y;
v.z = (long double) z;
return v;
}
Vector Vector_InitDoubleAll(double all) {
Vector v;
v.x = v.y = v.z = (long double) all;
return v;
}
Vector Vector_InitLongDXYZ(long double x, long double y, long double z) {
Vector v;
v.x = x;
v.y = y;
v.z = z;
return v;
}
Vector Vector_InitLongDAll(long double all) {
Vector v;
v.x = v.y = v.z = all;
return v;
}
Vector Vector_AddVector(Vector *v1, Vector *v2) {
Vector v3;
v3.x = v1->x + v2->x;
v3.y = v1->y + v2->y;
v3.z = v1->z + v2->z;
return v3;
}
Vector Vector_AddDouble(Vector *v1, double other) {
Vector v2;
v2.x = v1->x + other;
v2.y = v1->y + other;
v2.z = v1->z + other;
return v2;
}
Vector Vector_AddLongD(Vector *v1, long double other) {
Vector v2;
v2.x = v1->x + other;
v2.y = v1->y + other;
v2.z = v1->z + other;
return v2;
}
void Vector_Print(Vector *v) {
printf("X: %Lf, Y: %Lf, Z: %Lf\n", v->x, v->y, v->z); //Before edit: used %ld
}
double Vector_Length(Vector *v) {
return pow(pow(v->x, 2) + pow(v->y, 2) + pow(v->z, 2), 0.5);
}
int main() {
Vector v = Vector_InitDoubleXYZ(2.0, 1.0, 7.0); //Before edit: (2.0d, 1.0d, 7.0d);
Vector_Print(&v);
}
我正在使用 gcc 进行编译。在命令行中运行 vector.exe 会得到以下输出:
X:0,Y:-2147483648,Z:9650176
我不明白为什么会这样。
感谢任何提示(即使是关于我的编码风格或任何可以在代码中做得更好的提示)。
谢谢,
更新:使用 MSVC 编译器工作正常,这似乎是 gcc 的问题。你知道为什么会这样吗?
【问题讨论】:
-
一旦我在
printf中使用%Lg(或%Lf)而不是%ld,就可以正常工作(gcc 4.5.2)。 (不,%d不是“双”的意思;它的意思是“整数”。看图。)您的原始代码未定义。如果它适用于 MSVC,那是因为 MSVC 正在做一些超出标准的事情。 -
很抱歉,它在 MSVC 中与
%Lf一起工作,但与%d不兼容,没有更正它。但这仍然不适用于 gcc。 -
Niklas:那么您需要发布您现在提供给 GCC 的 exact 代码,并指出您正在使用的 GCC 版本和 C 库。我告诉你,我将你的三个
%lds 更改为%Lf并且效果很好。 (我怀疑你改变了其他东西。) -
@Nemo 是否按照现在的代码为您工作?
-
是的,它工作正常。它看起来也很好,编译时没有警告。它打印
X: 2.000000, Y: 1.000000, Z: 7.000000。你确定你真的在编译和运行新代码吗?