【问题标题】:C Typedef Struct / Union auto-castC Typedef Struct / Union 自动转换
【发布时间】:2012-05-03 22:47:48
【问题描述】:

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

而不是为vector3f,vector3i,color3,angles等提供多个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 (浮点 x,y,z) vector3i (int x,y,z) RGB (浮点数 r,g,b) RGB (无符号字符 r,g,b) 欧拉角(ax,ay,az)

提前致谢!

【问题讨论】:

  • 澄清一下,您想以int 的形式写入结构/联合,但以float 的形式读出它?
  • 为什么不把它保留为浮点数,当你需要整数值时,只需将浮点成员转换为 int。

标签: c


【解决方案1】:

如果您的意思是要将 '360.0f' 放入并集的 float z 并具有 int z_int == 3,反之亦然,您不能。这不是联合的目的,3(整数)和 3.0(浮点值)的二进制表示是不同的

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

【讨论】:

    【解决方案2】:
    #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 类型的意思。

    【讨论】:

      【解决方案3】:

      这是我为您编写的一小段代码。它应该可以完成这项工作。我希望我能够完成您的要求...

      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));
      
      }
      

      【讨论】:

        【解决方案4】:

        或将所有变量更改为 void 指针类型,然后将它们转换为浮点数或整数。可以吗?

        【讨论】:

        • 您不能为类型 void 赋值。
        • 你甚至不能声明一个 void 类型的变量。
        • 如果你想要通用结构: typedef struct Abc_ { void *data1; ... 无效 *dataN; }ABC;基于 Kyle Loudon 用 C 语言掌握算法。
        • 然后:例如 - *intValue 到 *voidValue 用于输入,*voidValue 到 *intValue 用于输出。因此可以声明和分配。
        • @Anthales,这是 void 类型,根据定义,必须使用指向 void 类型的指针。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        相关资源
        最近更新 更多