好的,我在这里写c。在mingw gcc中编译。
我正在尝试做一些非常简单的事情。创建一个包含3个浮点数x,y,z的向量结构。
然后我希望能够和他们一起做数学。
这是我的简短测试计划:
#ifndef _PHYSICS_C_
#define _PHYSICS_C_
#define SUCCESS 0
#define FAILURE 1
typedef struct {
float x;
float y;
float z;
}vector;
int add ( vector* a, vector* b, vector* destination ){
(*destination).x = (float)( ((*a).x) + ((*b).x) );
(*destination).y = (float)( ((*a).y) + ((*b).y) );
(*destination).z = (float)( ((*a).z) + ((*b).z) );
return SUCCESS;
}
int main(int argc, char** argv){
printf("creating vectors\n\n");
vector a = {1.0f,5.0f,3.0f};
vector b = {2.0f,3.0f,6.0f};
vector destination;
printf("adding vectors\n\n");
if(add(&a, &b, &destination) == SUCCESS){
printf("result: (%d, %d, %d)\n\n",destination.x,destination.y,destination.z);
} else {
printf("the program failed somehow...\n\n");
}
printf("Press any key to continue...\n");
getchar();
return SUCCESS;
}
#endif
当我编译并运行它时,它应该返回(3,8,9)向量a和b的总和。
而是返回(0,1074266112,0)......
我无法弄清楚出了什么问题。
出于某种原因,我认为我必须以某种方式写出我不应该写的内存。
答案 0 :(得分:4)
x,y,z是浮点数,但您尝试将它们打印为整数。
尝试:
printf("result: (%f, %f, %f)\n\n",destination.x,destination.y,destination.z);
检查man printf
或您的文档以查看printf的所有说明符。
答案 1 :(得分:0)
%d
期待int
。使用%f
或%g
表示浮动/双打。
答案 2 :(得分:0)
您正在使用格式说明符float
打印%d
,该格式说明符适用于signed int
。请改用%f
或%g
或%e
。
另外,你为什么不这样做:
destination->x = a->x + b->x;
眼睛更容易。 (虽然不是问题)。
答案 3 :(得分:0)
保留以下划线后跟大写字母开头的标识符;不要在你自己的代码中使用它们。
包含防护(#ifndef _PHYSICS_C_ ...
)用于头文件,而不用于.c
个文件。
printf
需要#include <stdio.h>
。
您从SUCCESS
返回值main()
。没关系,因为SUCCESS
恰好是0,但使用EXIT_SUCCESS
(在<stdlib.h>
或return 0;
中声明)会更清楚。
您add
函数始终返回SUCCESS
。它也可能是一个void函数(并且它在main
中的值的测试没有用)。除非您预计稍后会添加错误检查。
add
函数中的强制转换是不必要的;表达式已经是float
类型。 (*foo).bar
最好写成foo->bar
。例如,第一个分配可以简化为destination->x = a->x + y->x;
。
真正的问题(已经指出)是您对"%d"
类型的值使用float
格式。
通常使用double
而不是float
。它具有更高的精度,现代硬件通常针对双精度操作进行优化。
如果在编译器中启用警告,它可能会告诉您其中一些问题。