我有以下遗留代码:
#define UINT8 unsigned char
#define UINT16 unsigned short
#define UINT32 unsigned long
typedef union
{
struct
{
UINT16 R1: 1;
UINT16 S1: 1;
UINT16 S2: 1;
UINT16 D1: 1;
UINT16 I1: 1;
UINT16 S3: 1;
UINT16 S4: 1;
UINT16 S5: 1;
UINT16 S6: 1;
UINT16 P1: 1;
UINT16 F1: 1;
UINT16 I2: 1;
UINT16 R2: 4;
}bb;
UINT16 V16;
}test_union11;
typedef struct /* memory index */
{ /* ++++++++++++ */
// Write Config 01-32
UINT16 i1; /* 0 */
UINT16 i2; /* 2 */
// Faults
UINT16 o3; /* 4 */
UINT16 o4; /* 6 */
UINT16 o5; /* 8 */
UINT16 o6; /* 10 */
// Values 01-08
UINT8 o7; /* 12 */
UINT8 o8; /* 13 */
UINT8 o9; /* 14 */
UINT8 o10; /* 15 */
UINT8 o11; /* 16 */
UINT8 o12; /* 17 */
UINT8 o13; /* 18 */
UINT8 o14; /* 19 */
// Values 09-12
UINT16 o15; /* 20 */
UINT16 o16; /* 22 */
UINT16 o17; /* 24 */
UINT16 o18; /* 26 */
// Values 13-14
UINT32 o19; /* 28 */
UINT32 o20; /* 32 */
UINT8 OctStr[8];
} test_str11;
test_str11 test_str1;
test_union11 test_union;
int test_memcpy(void) {
test_str1.o15 = 1500;
test_union.V16 = test_str1.i1;
memcpy(&test_union,&test_str1,sizeof(test_union11));
}
int main(void) {
test_memcpy();
printf("Test Pass!\n");
return 0;
}
第test_union.V16 = test_str1.i1
行背后的想法是test_union.bb嵌套结构是否填充了来自结构" test_str1"的数据?但是出于某种原因,既不是在那条线之后也不是在发生的memcpy之后。为什么?联合内部嵌套结构中数字的含义是什么?
我测试了这种情况,当没有这样的数字具有较小的联合和结构和memcpy时,虽然第一个元素赋值的技巧没有。但是这样的语法:
un = (*(test_union1*)&st);
也为第二次测试做了准备,并没有提供所提供的代码。这两个表达有什么区别?并且test_union.V16 = test_str1.i1
只复制i1变量或者test_union.bb可以容纳的字节数吗?
代码应该在stm32f10x嵌入式平台上运行,尽管它目前在PC上的Visual Studio中都不起作用。因此,这是纯粹的C问题。 谢谢!
答案 0 :(得分:1)
您尚未向test_str.i1
分配任何内容。如果你这样做,我认为你的程序会起作用。这种联合的想法是提供一种简单的方法来获得unsigned int V16中的16位。但是,这是依赖于平台的代码,因为int可能不是16位(通常是32位)。
联合的大小将是其最大成员的大小。但是,我不确定对齐规则对于大小错误匹配是什么。
最后,我认为获得位的最佳方法是使用逐位运算符&,|等