自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

STM32編程中枚舉和結(jié)構(gòu)體的結(jié)合

開發(fā) 前端
結(jié)構(gòu)體,通俗講就像是打包封裝,把一些有共同特征(比如同屬于某一類事物的屬性,往往是某種業(yè)務(wù)相關(guān)屬性的聚合)的變量封裝在內(nèi)部,通過一定方法訪問修改內(nèi)部變量。

01 結(jié)構(gòu)體定義

基本定義:結(jié)構(gòu)體,通俗講就像是打包封裝,把一些有共同特征(比如同屬于某一類事物的屬性,往往是某種業(yè)務(wù)相關(guān)屬性的聚合)的變量封裝在內(nèi)部,通過一定方法訪問修改內(nèi)部變量。

結(jié)構(gòu)體的定義:

第一種:只有結(jié)構(gòu)體定義

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績 
  6. }; 

第二種:附加該結(jié)構(gòu)體類型的“結(jié)構(gòu)體變量”的初始化的結(jié)構(gòu)體定義,如下代碼也就是定義結(jié)構(gòu)體時,直接定義一個變量

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績 
  6. }xiaoming; 

其實這就相當(dāng)于先定義結(jié)構(gòu)體,再用結(jié)構(gòu)體定義一個結(jié)構(gòu)體變量:

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績  
  6. };   
  7. struct stuff xiaoming;   

第三種:使用typedef關(guān)鍵字,可以將結(jié)構(gòu)體變量定義時少寫一個struct,比較省事。

  1. typedef struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績  
  6. }stuff_s;   
  7. stuff_s xiaoming; 

使用typedef還可以進一步簡化,將結(jié)構(gòu)體名也省略,這也是常用的方式

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績  
  6. }stuff_s;   
  7. stuff_s xiaoming; 

STM32的標(biāo)準(zhǔn)外設(shè)庫有大量這樣的應(yīng)用,如下

  1. typedef struct 
  2.   uint32_t GPIO_Pin; 
  3.   GPIOMode_TypeDef GPIO_Mode; 
  4.   GPIOSpeed_TypeDef GPIO_Speed; 
  5.   GPIOOType_TypeDef GPIO_OType; 
  6.   GPIOPuPd_TypeDef GPIO_PuPd; 
  7. }GPIO_InitTypeDef; 

關(guān)于結(jié)構(gòu)體指針定義問題,有很多的“騷操作”的寫法,我一般按照下面定義指針

  1. stuff_s *cuerrent_student; 

02 結(jié)構(gòu)體初始化

在大部分應(yīng)用中,一般都是定義結(jié)構(gòu)體后,在代碼中進行初始化,如下所示

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績  
  6. }stuff_s; 
  7. stuff_s xiaoming; 
  8. void xiaoming_inf_init() 
  9.   xiaoming.name = "xiaoming"
  10.   xiaoming.num = 1; 
  11.   xiaoming.age = 18.0; 
  12.   xiaoming.score = 100; 

當(dāng)然也有可以定義時就進行數(shù)據(jù)初始化的

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號 
  4.   int age;  //年齡 
  5.   float score;  //成績  
  6. }stuff_s; 
  7. stuff_s xiaoming={"xiaoming",1,18.0,100}; 

C99和C11為結(jié)構(gòu)提供了指定初始化器(designatedinitializer)。其初始化器使用點運算符和成員名。

關(guān)于C99和C11的知識可以看我之前的文章《C語言的發(fā)展》,在IAR和Keil中記得勾選C99的選項。

例如,只初始化xiaoming結(jié)構(gòu)中的name成員,可以這樣做:

  1. stuff_s xiaoming= 
  2.   .name = "xiaoming" 
  3. }; 

也可以按照任意順序使用指定初始化器:

  1. stuff_s xiaoming= 
  2.   .age = 18.0, 
  3.   .name = "xiaoming" 
  4. }; 

這樣的賦值方式,在linux方式中很常見,以platform驅(qū)動框架為例:

  1. static struct platform_driver leds_platform_driver = { 
  2.   .driver = { 
  3.     .name = "imx6ul-led"
  4.     .of_match_table = leds_of_match, 
  5.   }, 
  6.   .probe = leds_probe, 
  7.   .remove = leds_remove, 
  8. }; 

03 訪問結(jié)構(gòu)體成員

結(jié)構(gòu)體成員的訪問需要借助結(jié)構(gòu)體成員運算符(.),如下

  1. stuff_s xiaoming,xiaohong; 
  2. void student_inf_init() 
  3.   xiaoming.name = "xiaoming"
  4.   xiaoming.num = 1; 
  5.   xiaoming.age = 18.0; 
  6.   xiaoming.score = 100; 
  7.    
  8.    
  9.   xiaohong.name = "xiaohong"
  10.   xiaohong.num = xiaoming.num+1; 

使用指針時,使用(->)符號訪問結(jié)構(gòu)體成員

  1. stuff_s xiaoming,xiaohong; 
  2. stuff_s *cuerrent_student; 
  3. void student_inf_init() 
  4.   xiaoming.name = "xiaoming"
  5.   xiaoming.num = 1; 
  6.   xiaoming.age = 18.0; 
  7.   xiaoming.score = 100; 
  8.   cuerrent_student = &xiaohong; 
  9.    
  10.    
  11.   cuerrent_student->name = "xiaohong"
  12.   cuerrent_student->num = xiaoming.num+1; 

04 枚舉與結(jié)構(gòu)體的結(jié)合

簡單介紹下枚舉:有些數(shù)據(jù)的取值往往是有限的,只能是非常少量的整數(shù),并且最好為每個值都取一個名字,以方便在后續(xù)代碼中使用,比如一個星期只有七天,一年只有十二個月,一個班每周有六門課程等。

當(dāng)然,你可以用宏定義

  1. #define Mon 1 
  2. #define Tues 2 
  3. #define Wed 3 
  4. #define Thurs 4 
  5. #define Fri 5 
  6. #define Sat 6 
  7. #define Sun 7 

如果用了枚舉則如下

  1. enum week{ 
  2.   Mon, 
  3.   Tues, 
  4.   Wed, 
  5.   Thurs, 
  6.   Fri, 
  7.   Sat, 
  8.   Sun 
  9. }; 

枚舉是一種類型,通過它可以定義枚舉變量:

  1. enum week a, b, c; 

那么枚舉和結(jié)構(gòu)體一起用會產(chǎn)生什么效果呢?假設(shè)我們要協(xié)議一個語音芯片的驅(qū)動,需要表示語音芯片的狀態(tài)

  1. typedef enum//語音芯片狀態(tài) 
  2.     VOICE_INIT_OK =            0x4A,  //語音芯片上電初始化成功后,自動回傳命令 
  3.     VOICE_RECEIVE_OK =           0x41,  //語音芯片收到正確的命令幀 
  4.     VOICE_ORDER_ERROR=         0x45,  //語音收到錯誤的命令幀 
  5.     VOICE_BUSY     =            0x4E,  //語音忙(正在合成狀態(tài)) 
  6.     VOICE_FREE     =           0x4F  //語音空閑 
  7. } VOICE_STATUS; 
  8. typedef struct { 
  9.     VOICE_STATUS status ;                 //!< 語音芯片狀態(tài) 
  10.     Ouint32  delayTicks;                   //!< 播放時間 
  11.     Ouint32  playtimes;                    //!< 播放次數(shù) 
  12. } voicechip_Para_S; 
  13. voicechip_Para_S voicechip_Para; 

那么改變語音芯片狀態(tài)時,我們可以按照下面這樣寫

  1. voicechip_Para.status = VOICE_RECEIVE_OK; 

判斷語音芯片狀態(tài)時,我們可以按照下面寫

  1. if((voicechip_Para.status == VOICE_FREE) 

當(dāng)然,你用宏定義是可以的,代碼也很整潔。這里希望你能理解文章最開始的那句話:結(jié)構(gòu)體是某種業(yè)務(wù)相關(guān)屬性的聚合。

05 騷操作

關(guān)于結(jié)構(gòu)體有很多騷操作,如果全部總結(jié)下來,這篇文章就會很臃腫,例如結(jié)構(gòu)體嵌套的騷操作,可以一邊定義結(jié)構(gòu)體B,一邊就使用上:

  1. struct A{   
  2.     struct B{   
  3. int c;   
  4.     }b;   
  5.     struct B sb;   
  6. }a; 

對于這樣的情況,我一般主張能看懂就行,自己寫代碼時就少點這樣的騷操作

  1. struct B{   
  2.      int c;   
  3. }b; 
  4. struct A{   
  5.      struct B sb;   
  6. }a; 

 

責(zé)任編輯:姜華 來源: 知曉編程
相關(guān)推薦

2011-04-11 13:00:08

C++結(jié)構(gòu)體枚舉

2021-04-22 08:39:23

哈佛結(jié)構(gòu)馮洛伊曼結(jié)構(gòu)ARM架構(gòu)

2022-10-10 08:24:15

編程數(shù)據(jù)邏輯語句

2021-12-22 06:56:07

STM32C語言內(nèi)存

2021-08-26 06:29:47

STM32DWT數(shù)據(jù)觀察點觸發(fā)

2021-08-31 08:01:40

STM32DSP指令

2021-05-20 07:26:22

DMASTM32數(shù)據(jù)

2021-05-06 08:54:39

串口DMASTM32

2021-02-05 08:41:44

STM32網(wǎng)絡(luò)中斷

2021-01-20 09:51:25

STM32網(wǎng)絡(luò)接口

2020-12-02 09:10:22

Go結(jié)構(gòu)數(shù)據(jù)類型

2021-02-03 13:04:24

STM32網(wǎng)絡(luò)控制器

2022-07-25 14:31:55

LiteOS開發(fā)工具

2021-06-26 07:50:20

STM32串口開發(fā)環(huán)形緩沖區(qū)

2018-10-15 10:15:30

STM32Linux經(jīng)驗

2020-12-03 06:32:21

STM32單片機通信

2020-01-10 22:51:30

硬件軟件人生第一份工作

2021-11-15 09:53:16

STM32PSPMSP

2021-02-26 08:46:46

PHY寄存器網(wǎng)絡(luò)

2021-08-04 08:33:59

TypeScriptConst Readonly
點贊
收藏

51CTO技術(shù)棧公眾號