51单片机C语言联合体如何使用
u8 apple_buff;
u32 apple1,apple2,apple3,apple4;
for(i=0;i<0x10;i++)apple_buff=0;// 字节操作16个字节清0,4个32位也清0了。想达到这个目的
如何 把8位数组跟4个32位数据关联。
struct dd
{
u32;
u32;
u32;
u32;
};
union cc
{
struct dd;
u8 apple_buff;
}; union APPLE
{
u8 apple_buff;
u32 apple;
};
这样就好了,没必要用结构了。 ehengio 发表于 2022-4-26 14:08
union APPLE
{
u8 apple_buff;
(引用自3楼)
u8 apple_buff; // 8位数组
; -----------------------------------
u32 apple1; // 32位的 16位的 浮点的变量
u16 apple2;
u16 apple3,
float apple4;
float apple6;
实际 情况需要将这些数据 联合 #include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
struct VoltStruct
{
u32 volt1;
u32 volt2;
u32 volt3;
u32 volt4;
};
union cc
{
struct VoltStruct voltAll;
u8 volt_buff;
};
/*
*/
void main()
{
volt1=0x11223344;
volt2=0x55667788;
volt3=0x99AABBCC;
volt2=0xDDEEFF00;
volt_buff=0;
volt_buff=0;
while(1)
{
}
}
写了一个测试程序编译不过 #include "reg52.h"
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long
struct VoltStruct
{
u32 volt1;
u32 volt2;
u32 volt3;
u32 volt4;
};
struct VoltStruct voltAll;
u8 volt_buff;
union cc
{
struct VoltStruct voltAll;
u8 volt_buff;
};
/*
*/
void main()
{
voltAll.volt1=0x11223344;
voltAll.volt2=0x55667788;
voltAll.volt3=0x99AABBCC;
voltAll.volt4=0xDDEEFF00;
volt_buff=0;
volt_buff=0; // 通过字节的方式 清0,仿真发现没有清0没有联合成功,哪里原因呢
volt_buff=0;
volt_buff=0;
while(1)
{
}
}
LZ 怎么这么热衷于用 U8 数组来清零呢?指针不香么?例如这样:
struct _DATPACK
{
uint32_tdw1;
uint32_tdw2;
floatfa;
floatfb;
} dat;
memset( &dat, 0x00, sizeof(dat) ); // 清零 dat 所有元素
uint8_t *ptr= (uint8_t *)&dat;
ptr= 0x12; // 按字节访问
ptr= 0x56; // 按字节访问
ptr= 0x00; // 按字节访问
定义的话,也得是把数组和元素定义在一个 union 里,并且注意各元素需要再打包成一个 struct 避免重叠。形如:
union _DATPACK
{
struct _ELEM
{
//...
};
uint8_tArray; // 柔性数组
};
本帖最后由 diyeyuye 于 2022-4-27 08:21 编辑
woshigeshuai 发表于 2022-4-26 23:26
#include "reg52.h"
#define u8 unsigned char
(引用自6楼)
你没有用你定义的联合体类型声明一个变量,然后操作其变量才能改变联合体内成员的值。
例如:
struct VoltStruct
{
u32 volt1;
u32 volt2;
u32 volt3;
u32 volt4;
};
union cc
{
struct VoltStruct voltAll;
u8 volt_buff;
};
union cc testVar;//使用联合体声明一个变量
/*
*/
void main()
{
testVar.voltAll.volt1=0x12345678;
testVar.voltAll.volt2=0x22345678;
testVar.voltAll.volt3=0x32345678;
testVar.voltAll.volt4=0x42345678;
testVar.volt_buff=0;
testVar.volt_buff=0;
testVar.volt_buff=0;
testVar.volt_buff=0;//上述清零会清除testVar.voltAll.volt1的值
while(1)
{
}
} 非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。 woshigeshuai 发表于 2022-4-27 10:12
非常感谢大家的帮助,问题解决了。我现在是一个人干活状态,没有人交流。有问题只能咨询论坛。 ...
(引用自9楼)
我现在也是一个人干活,有空多交流 我们也是 一个人的干活自己画板子, 自己写简单的程序 我也是一个人干活,画板子,写程序,有空多交流{:lol:} ls四位可以组团啦 组团的话,可以加我一个。
页:
[1]