![](/img/trans.png)
[英]Is casting and dereferencing struct pointers of "compatible" structs allowed?
[英]Casting data array to compatible struct
我的情况是我的代码以一长串floats
的形式从我无法控制的地方接收数据。
这些数字分配给各种功能
void myfunc(struct floatstruct* fs);
采用以下形式的结构:
struct floatstruct
{
float a;
float b;
float c;
};
你明白了。
我想知道是否有一种方法可以安全地将浮点数floatstruct
转换为floatstruct
以将数据直接传递给myfunc
。 如有必要,我可以将对齐属性添加到floatstruct
。
期望行为的示例:
struct mystruct1
{
float a;
float b;
float c;
};
struct mystruct2
{
float x;
float y;
};
extern void myfunc1(mystruct1*);
extern void myfunc2(mystruct2*);
void process_data(float* numbers)
{
myfunc1((struct mystruct1*)numbers);
myfunc2((struct mystruct2*)(numbers + 3));
}
理想的解决方案肯定是改变系统。 但我正在寻找给定参数内的解决方案。
根据你的特殊要求,这就是我要做的事情:(我之所以说这是因为这里或那里有3个新浮标除非你计划在arduino或手机上使用它或者你计划拥有数万个,否则几乎没有明显的区别。 ..)
无论如何:
struct floatstruct
{
float (*a[3]);
};
{
int i;
struct floatstruct aStruct;
struct floatstruct bStruct;
float *num = numbers;
for (i = 0; i < 6; i++) {
if (i < 3)
aStruct.a[i] = num;
else
bStruct.a[i-3] = num;
num++;
}
myfunc1(&aStruct);
myfunc2(&bStruct);
}
联盟可能是你需要的:
#pragma pack(sizeof(float))
struct mystruct1
{
float a;
float b;
float c;
};
struct mystruct2
{
float x;
float y;
};
#pragma pack()
typedef union
{
mystruct1 struct1;
mystruct2 struct2;
}structsUnion;
void myfunc1(structsUnion* values)
{
values->struct1.a; // to access members
}
void myfunc2(structsUnion* values)
{
values->struct2.x; // to access members
}
void process_data(float* numbers)
{
myfunc1((structsUnion*)(numbers));
myfunc2((structsUnion*)(numbers));
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.