我有一个用于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)
提前致谢!
答案 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。可以吗?