一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - STM32編程中枚舉和結構體的結合

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

2022-01-07 21:48知曉編程Firefly C/C++

本文為大家介紹STM32編程中枚舉和結構體的結合實例代碼,有需要的朋友可以參考下

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. {
  3. uint32_t GPIO_Pin;
  4. GPIOMode_TypeDef GPIO_Mode;
  5. GPIOSpeed_TypeDef GPIO_Speed;
  6. GPIOOType_TypeDef GPIO_OType;
  7. GPIOPuPd_TypeDef GPIO_PuPd;
  8. }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. {
  10. xiaoming.name = "xiaoming";
  11. xiaoming.num = 1;
  12. xiaoming.age = 18.0;
  13. xiaoming.score = 100;
  14. }

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

  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. {
  3. .name = "xiaoming"
  4. };

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

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

這樣的賦值方式,在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. {
  4. xiaoming.name = "xiaoming";
  5. xiaoming.num = 1;
  6. xiaoming.age = 18.0;
  7. xiaoming.score = 100;
  8.  
  9.  
  10. xiaohong.name = "xiaohong";
  11. xiaohong.num = xiaoming.num+1;
  12. }

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

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

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

原文鏈接:https://mp.weixin.qq.com/s/ggOg6BDZpi7GACwUJkPCiA

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
主站蜘蛛池模板: 国产精品亚洲va在线观看 | 99欧美精品| 帅老头恋帅老头同性tv | 欧美黑人ⅹxxx片 | kisssis无减删全集在线观看 | 欧美第十页 | 国产成人精品一区二区阿娇陈冠希 | 女人爽到喷水的视频免费 | 出差上的少妇20p | 午夜理论片日本中文在线 | 狠狠色婷婷日日综合五月 | 日韩欧美一级大片 | 色漫在线观看 | 欧美作爱福利免费观看视频 | 国产福利你懂的 | 日本视频高清 | 国产好痛疼轻点好爽的视频 | 美女操批| 香蕉精品国产高清自在自线 | 日韩国产成人精品视频人 | 久久久久青草大香线综合精品 | 俄罗斯三级完整版在线观看 | 国产精品一区三区 | 韩国伊人 | 日韩精品高清自在线 | 女人是男人的未来1分49分 | 色综合中文字幕在线亚洲 | xxx老妇人60 xxxx意大利xxxxhd | 三级无删减高清在线影院 | 色一情| 国产免费好大好硬视频 | 久久精品国产亚洲AV麻豆欧美玲 | 狠狠色成人综合 | 精品suv一区二区三区 | 欧美人鲁交大全 | 甜蜜调教 | 91进入蜜桃臀在线播放 | 成人免费福利网站在线看 | 日本免费不卡在线一区二区三区 | 男生和女生搞逼逼 | 成人午夜在线视频 |