成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

STM32編程中枚舉和結構體的結合

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

01 結構體定義

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

結構體的定義:

第一種:只有結構體定義

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

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

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

其實這就相當于先定義結構體,再用結構體定義一個結構體變量:

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

第三種:使用typedef關鍵字,可以將結構體變量定義時少寫一個struct,比較省事。

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

使用typedef還可以進一步簡化,將結構體名也省略,這也是常用的方式

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

STM32的標準外設庫有大量這樣的應用,如下

  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; 

關于結構體指針定義問題,有很多的“騷操作”的寫法,我一般按照下面定義指針

  1. stuff_s *cuerrent_student; 

02 結構體初始化

在大部分應用中,一般都是定義結構體后,在代碼中進行初始化,如下所示

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學號 
  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; 

當然也有可以定義時就進行數據初始化的

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

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

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

例如,只初始化xiaoming結構中的name成員,可以這樣做:

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

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

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

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

  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 訪問結構體成員

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

  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; 

使用指針時,使用(->)符號訪問結構體成員

  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 枚舉與結構體的結合

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

當然,你可以用宏定義

  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; 

那么枚舉和結構體一起用會產生什么效果呢?假設我們要協議一個語音芯片的驅動,需要表示語音芯片的狀態

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

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

  1. voicechip_Para.status = VOICE_RECEIVE_OK; 

判斷語音芯片狀態時,我們可以按照下面寫

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

當然,你用宏定義是可以的,代碼也很整潔。這里希望你能理解文章最開始的那句話:結構體是某種業務相關屬性的聚合。

05 騷操作

關于結構體有很多騷操作,如果全部總結下來,這篇文章就會很臃腫,例如結構體嵌套的騷操作,可以一邊定義結構體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; 

 

責任編輯:姜華 來源: 知曉編程
相關推薦

2011-04-11 13:00:08

C++結構體枚舉

2021-04-22 08:39:23

哈佛結構馮洛伊曼結構ARM架構

2021-12-22 06:56:07

STM32C語言內存

2022-10-10 08:24:15

編程數據邏輯語句

2021-08-26 06:29:47

STM32DWT數據觀察點觸發

2021-08-31 08:01:40

STM32DSP指令

2021-05-20 07:26:22

DMASTM32數據

2021-05-06 08:54:39

串口DMASTM32

2021-01-20 09:51:25

STM32網絡接口

2021-02-05 08:41:44

STM32網絡中斷

2020-12-02 09:10:22

Go結構數據類型

2021-02-03 13:04:24

STM32網絡控制器

2022-07-25 14:31:55

LiteOS開發工具

2021-06-26 07:50:20

STM32串口開發環形緩沖區

2018-10-15 10:15:30

STM32Linux經驗

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寄存器網絡

2021-08-04 08:33:59

TypeScriptConst Readonly
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜久久| 色橹橹欧美在线观看视频高清 | 请别相信他免费喜剧电影在线观看 | 免费一区二区三区 | 国产91久久久久久久免费 | 日本色综合 | 欧州一区二区三区 | 欧美久久一级 | 精品国产一区二区三区性色 | 亚州精品天堂中文字幕 | 91精品国产综合久久久久久丝袜 | 亚州精品成人 | 国产成人免费视频 | 69av片| 国产一二三区电影 | 黄色在线免费观看 | 久久av网站 | 午夜视频网站 | 欧美久久天堂 | 免费a v网站 | 中文字幕一区二区三区四区五区 | 欧美激情欧美激情在线五月 | 老牛嫩草一区二区三区av | 欧美日韩a| 99reav| 国产欧美在线观看 | 国产精品视频网 | 中文字幕视频三区 | 久久久久国产精品 | 国产精品日日摸夜夜添夜夜av | www.天天操.com | 日韩欧美专区 | 欧美一区二区三区四区视频 | 亚洲欧美高清 | 国产重口老太伦 | 日韩一级 | 黄色成人免费看 | 91精品国产综合久久久亚洲 | 久久精品亚洲精品 | 久久久国产一区 | 国产精品视频在线播放 |