1

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;

型がfloatである限り、すべてがうまく機能しますが、intに落ちると、奇妙な値がいくつかあります(これは理解できます)。私の質問は次のとおりです。構造定義内で直接/自動的にキャストする方法はありますか、それとも float と int の間で型キャストする追加の関数を作成する必要がありますか?


以下の回答により、元の質問を次のように変更する必要があるかもしれません。

以下を同時に処理できるようにするために「統合」する(そして統合するということは、1つの構造体を持っていることを意味します)ための最良の方法は何ですか:

vector3f (float x,y,z) vector3i (int x,y,z) RGB (float r,g,b) RGB (unsigned char r,g,b) オイラー角 (ax, ay, az)

前もって感謝します!

4

4 に答える 4

2

'360.0f' を共用体の float z に入れ、int z_int == 3 にしたい場合、またはその逆の場合 は、できません。これは共用体の目的ではなく、3 (整数) と 3.0 (浮動小数点値) のバイナリ表現はていません。

ただし、int を削除して、float の 1 つを int にキャストすることもできます。

于 2012-04-23T10:20:34.960 に答える
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 型を使用することで意味したことです。

于 2012-04-23T14:19:56.297 に答える
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));

}
于 2012-04-24T11:03:45.050 に答える
-1

または、すべての変数を void ポインター型に変更してから、それらを float または integer にキャストします。大丈夫ですか?

于 2012-04-23T10:27:19.670 に答える