有时将3d矢量视为3个值的数组更为简单。但是,当您能够编写vec.y
来访问单个组件时,它会使代码更清晰。如何编码我的矢量结构以允许两种表示?
期望的结果:能够像这样编码
y_component = 3.0 * myvec.y
for (i = 0; i < 2; i++) {
printf("%f", myvec.v[i])
}
目前我有这个
struct vector3 {
double v[3];
double *x, *y, *z;
};
// then inside an init function it already gets a little bit strange
myvec.v = (double [3]) {1.0, 3.0, -5.0};
myvec.x = &vector3.v[0];
myvec.y = &vector3.v[1];
// And accessing individual component can be confusing
y_component = 3.0 * (*myvec.y);
// Its also strange when given a pointer to a vector3
y_component = 3.0 * (*ptr_myvec->y);
不幸的是,在查看各种实现后,这是我能想到的最好的。但也许有人有办法吗?
感谢您的时间。
答案 0 :(得分:4)
只需使用联盟。它使您能够使用不同的命名法访问相同的存储单元:
typedef union {
double v[3];
struct
{
double x;
double y;
double z;
};
} vector3;
vector3 vec;
static_assert(sizeof(vec) == sizeof(vec.v), "Err: padding detected!");
vec.v[0] = 1.0;
printf("%f", vec.x); // prints 1.0
注意:如果您使用的是较旧的编译器,则必须执行以下操作:
typedef union {
double v[3];
struct
{
double x;
double y;
double z;
} s;
} vector3;
vector3 vec;
vec.v[0] = 1.0;
printf("%f", vec.s.x); // prints 1.0