在结构体(1)的文章里面,已经介绍了关于结构体定义和使用的基本知识,这一篇内容,直接上干货,将在工作中遇到的结构体的经典案例分享给读文章的各位,同时针对案例讲解结构体的相关知识。
我们知道要定义一个结构体的时候需要使用struct关键字,定义结构体共有三种方式:
//第一种方式
struct Stu{
...
};
Stu stu1,stu2;
//第二种方式
struct Stu{
...
}stu3,stu4;
//第三种方式
struct{
...
}stu5,stu6;
上面三种方式各有不同,但是在实际的运用中,结构体的定义往往少不了typedef的身影,typedef是类型定义的意思,它的是作用是给其他的数据类型声明一个别名,那么上面的结构体定义可以换成以下写法:
/*
* 定义了一个结构体Stu,结构体Stu的别名为stu1,stu2,
* 使用结构体的别名,定义了两个新的结构体变量,stu2,stu4
*/
typedef struct Stu{
...
}stu1,stu2;
stu1 stu3;
stu2 stu4;
接下来直接上干货
typedef struct
{
stKey PowerOnKey;
stKey PowerOffKey;
stKey ShakKey;
stKey StopShakKey;
stKey SpeedUpKey;
stKey SpeedDownKey;
stKey TimeKey;
}stFanKey;
typedef struct _stKey_S
{
uint32_t iplay_befor_normal;//学习前的播报,正常播报
uint32_t iplay_get_irdata;//学习成功获取IR播报
unsigned char Nec[4];
/*当前模式 学键模式/正常模式*/
E_KeyMode keymode;
unsigned short key_id; //红外码ID ir_data_t.key_id 暂时不用, 从 0xb0000000 - 0xb0010000
/*按键相关数据*/
//ir_data_t *key_data;
/*按键相关接口*/
int (*initKey)(struct _stKey_S* pKey); //初始化IR按键
int (*storeIR)(struct _stKey_S* pKey, ir_data_t* pIr_Key);//存储IR按键
int (*deleteIR)(struct _stKey_S* pKey);//存储IR按键
int (*sendIR)(struct _stKey_S* pKey);//发送IR按键
E_StoreFlag (*checkIRLearn)(struct _stKey_S* pKey);//判断是否学习
int (*playVoice)(struct _stKey_S* pKey, int iplay_id);//播报方法某一个ID
}stKey;
static stFanKey FanKey =
{
.PowerOnKey = {FAN_VOICE_POWER_ON, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.PowerOffKey = {FAN_VOICE_POWER_OFF, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.ShakKey = {FAN_VOICE_SHAK, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.StopShakKey = {FAN_VOICE_STOP_SHAK, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.SpeedUpKey = {FAN_VOICE_SPEED_UP, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.SpeedDownKey = {FAN_VOICE_SPEED_DOWN, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
.TimeKey = {FAN_VOICE_TIME, MAIN_VOICE_BEEP, .Nec = {0x00, 0x00, 0x00, 0x00},},
};
可以看到上面三段程序就将结构体运用得十分经典,我们从结构体stFanKey入手慢慢解析。
首先stFanKey是一个结构体别名,但是这个结构体在定义的时候没有自己的结构体名,所以stFanKey就是该结构体的结构体名;
接下来看stFanKey结构体的成员,都是通过stKey声明的结构体变量,现在我们将目光转移到stKey上,这也是一个结构体别名,是_stKey_S的别名,_stKey_S这个结构体成员就比较复杂,有普通变量,有数组,还有函数指针(函数指针的定义方式:需要指向函数的函数类型+(* 函数指针名)+(函数的的参数类型,这里的函数指针存在的意义是为了方便直接调用函数。)
比如我现在用stKey声明了一个结构体变量stKey Tempkey;
我需要调用stKey里面的storeIR函数,则只需要Tempkey.storeIR(参数)即可。
再来看FanKey,FanKey是stFanKey类型的结构体变量,当需要访问FanKey的成员的时候通过:
FanKey.PowerOffKey
因为FanKey的成员也是结构体变量,所以可以通过:
FanKey.PowerOffKey.iplay_befor_normal
访问stKey的成员iplay_befor_normal。
而在定义FanKey的时候,这里直接对里面的成员进行整体赋值,其中的.PowerOffKey就是FanKey.PowerOffKey,其中的.NEC就是FanKey.PowerOffKey.NEC
这样赋值清晰明了,且代码简洁,如果每个成员单独赋值,代码段就长得离谱了。
文章就到此结束了,如果有新的比较经典的运用,我会保持更新,看了的码友记得点赞!
保持学习的态度,吾任重而道远!