我是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);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用gcc进行编译.vector.exe在命令行中运行 会给我以下输出:
X:0,Y:-2147483648,Z:9650176
我不明白为什么会这样.
我欣赏任何提示(甚至关于我的编码风格或代码中可以做得更好的任何提示).
谢谢,
Mic*_*urr 13
问题(在使用整数说明符进行浮点格式化之后解决各种问题之后)是您将GCC类型与不理解它们的MSVC运行时混合.
首先,MinGW是一个GCC编译器,但它使用MSVC运行时来获得大部分运行时支持.这对于printf()函数族来说意味着只有msvcrt.dll支持的格式说明符才有效,只有支持的类型才msvcrt.dll有效.但是GCC对此一无所知,所以它会传递自己的类型,当然,格式说明符是你在格式字符串中传递的任何内容(尽管GCC可能会发出不适用于这种msvcrt.dll情况的警告) .对于基于64位整数的一些示例,请参阅Strange"unsigned long long int"行为(我认为较新版本msvcrt.dll可能修复了部分或全部64位int问题).
您遇到的这个问题的另一部分是long doubleGCC中的类型与long doubleMSVC中的类型不同.GCC long double在x86或x64目标上使用96位或128位类型(请参阅http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html).然而,使用MSVC 64位型-基本上long double是完全一样double对msvcrt.dll(http://msdn.microsoft.com/en-us/library/9cx8xs15.aspx):
以前的16位版本的Microsoft C/C++和Microsoft Visual C++支持长双精度,80位精度数据类型.但是,在Win32编程中,long double数据类型映射到双精度64位精度数据类型.Microsoft运行时库提供数学函数的长双精度版本,仅用于向后兼容.长双精度原型与双精度原型相同,只是long double数据类型取代了double数据类型.不应在新代码中使用这些函数的长双精度版本.
所以归结为GCC/MinGW long double类型与格式化的I/O完全不兼容msvcrt.dll.切换到使用doubleMinGW,或者如果您需要使用,long double您必须将值转换(double)为格式化I/O或提出自己的格式化例程.
另一个选择可能是在Cygwin下使用GCC编译器,我认为这将避免依赖于msvcrt.dllI/O格式化(以依赖Cygwin环境为代价).
| 归档时间: |
|
| 查看次数: |
9850 次 |
| 最近记录: |