2011-09-03 34 views
0

好的,我在这里写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)...

我无法弄清楚什么是错的。

由于某种原因,我认为我必须以某种方式记录下我不应该记忆的内容。

+2

您可以使用' - >'运算符而不是'*(x).y',同时删除superflous圆括号,这将使您的代码更具可读性。 – Necrolis

回答

4

的x,y,z是浮动,但你正尝试将它们打印为整数。

尝试:

 printf("result: (%f, %f, %f)\n\n",destination.x,destination.y,destination.z); 

检查man printf或文档的查看所有符为的printf。

0

%d预计int。漂浮物/双人使用%f%g

0

您正在打印float,其格式说明符%d打算用于signed int。改为使用%f%g%e

而且,你为什么不这样做:

destination->x = a->x + b->x; 

及其对眼睛容易得多。 (虽然不是问题)。

开始以下划线后跟大写字母
+2

'%d'用于签名的'int',而不是用于一般的有符号整数('long'是一个有符号的整数类型,但它不是'int')。 '%f','%g'和'%e'对于float或double参数都是正确的格式;在这种情况下,float参数被提升为double。 –

+0

已更正。是的,他们提升了一倍。 – phoxis

0

标识符被保留;不要在你自己的代码中使用它们。

包括守卫(#ifndef _PHYSICS_C_ ...)用于头文件,而不用于.c文件。

printf要求#include <stdio.h>

您从main()返回值SUCCESS。这是确定的,因为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。它具有更高的精度,现代硬件通常针对双精度操作进行优化。

如果您在编译器中启用了警告,它可能会告诉您其中一些问题。

+0

为什么downvote? –

相关问题