C Typedef Struct / Union自动播放

时间:2012-04-23 10:13:01

标签: c

我有一个用于3d矢量的小型数学库,我试图“统一”它。

而不是为vector3f,vector3i,color3,angle等设置多个typedef结构...我试图将所有内容放在同一个结构中,如下所示:

typedef struct
{
    union
    {
            float x;
            float r;
            float ax;

            int   x_int;
    };

    union
    {        
            float y;
            float g;
            float ay;

            int   y_int;
    };


    union
    {
            float z;
            float b;
            float az;

            int   z_int;                
    };

} vec3;

只要类型是浮点数,一切都有效,但是当它落入int时我有一些奇怪的值(这是可以理解的)。我的问题是:有没有办法在结构定义中直接/自动转换,或者我必须创建额外的函数来在float和int之间进行类型转换?


由于下面的答案,也许我应该将我原来的问题修改为以下内容:

“统一”的最佳方式是什么(通过统一,我的意思是有1个结构)能够同时处理以下内容:

vector3f(float x,y,z) vector3i(int x,y,z) RGB(浮点数r,g,b) RGB(unsigned char r,g,b) 欧拉角(ax,ay,az)

提前致谢!

4 个答案:

答案 0 :(得分:2)

如果你的意思是你想把'360.0f'放到一个联合的浮点数z并且有int z_int == 3,反之亦然,你不能。这不是联合的目的,3(整数)和3.0(浮点值)的二进制表示是不熟悉

但是,您可以删除int并将其中一个浮点数转换为int。

答案 1 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

typedef struct genericStruct
{
    void *valueOne;
    void *valueTwo;
}GS;

int main()
{
    GS *gs = malloc(sizeof(*gs));
    int valueInt = 10;
    float valueFloat = 3.141592653589;
    int *inputIntPtr = (int*)malloc(sizeof(int));
    float *inputFloatPtr = (float*)malloc(sizeof(float));
    void *voidPtr = NULL;
    *inputIntPtr = valueInt;
    *inputFloatPtr = valueFloat;
    voidPtr = inputIntPtr;
    gs->valueOne = voidPtr;
    int *outputIntPtr = (int*)malloc(sizeof(int));
    outputIntPtr = gs->valueOne;
    printf("Input ptr  = %d\n", *inputIntPtr);
    printf("Output ptr = %d\n", *outputIntPtr);
    voidPtr = inputFloatPtr;
    gs->valueTwo = voidPtr;
    float *outputFloatPtr = (float*)malloc(sizeof(float));
    outputFloatPtr = gs->valueTwo;
    printf("Input ptr   = %f\n", *inputFloatPtr);
    printf("output ptr  = %f\n", *outputFloatPtr);
    free(gs);
    free(inputIntPtr);
    free(inputFloatPtr);
    free(outputIntPtr);
    free(outputFloatPtr);
    return 0;
}

这就是我使用void类型的意思。

答案 2 :(得分:0)

这是我为你写的一小段代码。它应该完成这项工作。我希望我能够做你所要求的......

typedef struct{


        void *ptr1;

        void *ptr2;

        void *ptr3;

}VEC;






main(){

        VEC v ;

        VEC *ptr;

        int a = 5;

        double b = 6;

        float c = 7;

        v.ptr1 = NULL;

        v.ptr2 = NULL;

        v.ptr3 = NULL;


        ptr = &v;

        v.ptr1 = (int *)&a;

        ptr->ptr1 = (int *)&a;

         v.ptr2 = (double *)&b;

        ptr->ptr2 = (double *)&b;

        v.ptr3 = (float *)&c;

        ptr->ptr3 = (float *)&c;

        printf("%d\n",*(int *)v.ptr1);

        printf("%d\n",*(int *)(ptr->ptr1));

        printf("%lf\n",*(double *)v.ptr2);

        printf("%lf\n",*(double *)(ptr->ptr2));

        printf("%f\n",*(float *)v.ptr3);

        printf("%f\n",*(float *)(ptr->ptr3));

}

答案 3 :(得分:-1)

或者将所有变量更改为void指针类型,然后将它们转换为float或integer。可以吗?