我的结构出了什么问题?

时间:2011-09-03 04:47:11

标签: c vector struct

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

我无法弄清楚出了什么问题。

出于某种原因,我认为我必须以某种方式写出我不应该写的内存。

4 个答案:

答案 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。它具有更高的精度,现代硬件通常针对双精度操作进行优化。

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