2012-04-23 7 views
1

Imは、3次元ベクトルとImを "統一"しようとするための小さな数学ライブラリを持っています。C 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; 

すべては限りタイプがあるよう桃動作します。その代わりvector3f、vector3i、カラー3、角度などのために複数のtypedef構造体を持つの

は...イムは、このように同じ構造体の内側にすべてを置くしようとしています浮動小数点数は、しかし、それは整数intにいくつかの奇妙な値(理解することができます)に落ちる。私の質問です:構造体の定義の中に直接/自動的にキャストする方法はありますか、浮動小数点数と整数の間の型キャストに余分な関数を作成する必要がありますか?下記の回答に


、多分私は次の私の元の質問を変更する必要があります。

「統一」(および統一によって、私は1つの構造体のように持っている意味)であるとする最良の方法は何ですか以下同時に扱うことができる:

vector3f(フロートX、Y、Z) vector3i(INT X、Y、Z) RGB(フロートR、G、B) RGB(unsigned char型のR、 g、b) オイラー角(ax、ay、az)

ありがとうございます!

+0

を求めたものを行うことができました願って、あなたが書きたいyou.Itがjob.Iを行う必要がありますするために私が書いたコードの小さな作品ですstruct/unionに 'int'として渡しますが、' float'として読み込みますか? –

+1

なぜそれを浮動小数点として保持するのではなく、整数値が必要なときにfloatメンバをintにキャストするだけです。 –

答えて

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

これは私がボイドタイプを使用することによって意味しました。

2

ユニオンのfloat zに '360.0f'を入れ、int z_int == 3、またはその逆の場合は、にはを指定できません。これは組合の目的ではなく、3(整数)と3.0(浮動小数点値)のバイナリ表現はであり、には似ていません。

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

-1

すべての変数をvoid型に変更し、floatまたはintegerにキャストします。大丈夫ですか?

+0

void型に値を代入することはできません。 – delicateLatticeworkFever

+0

void型の変数を宣言することさえできません。 – Anthales

+0

一般的な構造体を使用する場合: typedef struct Abc_ { void * data1; ... void * dataN; } Abc; Kyle LoudonによるMastering Algorithmsに基づくC – Avyakt

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

}