C语言结构体数组:
今天在学习stm32的时候,被火哥的代码震惊到了,火哥的C语言结构体数组的初始化方式着实秀到我了,下面来分享一下火哥的操作:
传统的C语言结构体数组初始化:
传统的C语言结构体数组相信大家都会了,初始化方法十分简单:
typedef struct
{
int age;
const char* name;
int height;
}student;
student STU[]={
{11,"张三",170},
{12,"李四",181},
{13,"王五",190}
};
以上都是基操,你直接在网上搜,或者看C语言入门教程都是这样教你的。下面来看一看火哥的操作!
比较秀的C语言结构体数组初始化:
火哥的操作发生在SPI_FLASH恢复出厂设置的代码里,感兴趣的小伙伴可以看看源码,来!直接上代码:
typedef struct
{
const char* filename; //从SD卡拷录数据时的文件路径
const char* description; //描述
uint32_t start_addr; //开始地址
uint32_t length; //长度
Burn_Option_Typedef burn_option;
}Aux_Data_Typedef;
typedef enum
{
AUX_DATA_ERROR = -1,
AUX_XBF_XINSONGTI,
AUX_PYTAB,
AUX_GB2312,
AUX_UNIGBK,
AUX_TOUCH,
AUX_FILE_SYSTEM, //FLASH文件系统
AUX_MAX_NUM,
} aux_data_t;
Aux_Data_Typedef burn_data[] =
{
[AUX_XBF_XINSONGTI] =
{
.filename = "0:/srcdata/新宋体16.xbf",
.description = "XBF字库文件(emWin使用,新宋体16.xbf)",
.start_addr = 1*4096 ,
.length = 399*4096,
.burn_option = UPDATE,
},
[AUX_PYTAB] =
{
.filename = "0:/srcdata/拼音候选表.txt",
.description = "拼音候选表(emwin键盘拼音输入时使用)",
.start_addr = 400*4096 ,
.length = 6*4096,
.burn_option = UPDATE,
},
[AUX_GB2312] =
{
.filename = "0:/srcdata/GB2312_H1616.FON",
.description = "GB2312字库(修复HZLIB不支持标点的问题)",
.start_addr = 406*4096 ,
.length = 64*4096,
.burn_option = UPDATE,
},
[AUX_UNIGBK] =
{
.filename = "0:/srcdata/UNIGBK.BIN",
.description = "文件系统中文支持编码库(emWin使用,UNIGBK.BIN)",
.start_addr = 470*4096 ,
.length = 43*4096,
.burn_option = UPDATE,
},
[AUX_TOUCH] =
{
.filename = "0:/srcdata/触摸校准默认数据.BIN",
.description = "触摸校准默认数据",
.start_addr = 513*4096 ,
.length = 1*4096,
.burn_option = UPDATE,
},
[AUX_FILE_SYSTEM] =
{
.filename = "",
.description = "FATFS文件系统",
.start_addr = 514*4096 ,
.length = 1534*4096,
.burn_option = DO_NOT_UPDATE,
}
};
代码有点长,我一一分析一下,首先,火哥定义了一个Aux_Data_Typedef结构体和一个aux_data_t枚举,枚举为-1的值这里没有用到,可以不看,然后剩下的枚举值是0~6共7个元素,相信以上各位都可以理解吧,接下来高能来了:
我们看一下火哥的结构体数组初始化方式,以结构体数组的第一个元素为例:以AUX_XBF_XINSONGTI枚举值为索引号用中括号括起来,然后把结构体成员的值赋值给中括号这个整体,然后结构体成员的赋值方式也很独特,以"." + “结构体成员名字” 的方式来赋值结构体成员的值
这一波操作属实是惊艳到我了,哎,可能这个操作对大佬来说都是基操吧,但对于我这样的小白来说实在是秀(可能是我第一次见的原因吧)哈哈哈!