• 枚举 位域 联合体 类


    Enumeration--枚举:容器,只能装常量,不会发生改变的量。对值进行命名的方法

    Enumerator--枚举器

    Enum--枚举的缩写

     采用::对枚举成员进行访问

     采用枚举进行点灯示例

     LedCmd cmd = static_cast(input); //  static_cast功能:把一个表达式转换成某种类型

    采用byte定义数据类型,可以节省内存空间,byte范围0~255,1个字节

    1. #include
    2. // enum 声明
    3. // 默认使用整数类型,占用2个字节
    4. // 改成unsigned char或者 byte,只占用1个字节
    5. enum class LedCmd
    6. {
    7. On,
    8. Off,
    9. Flash
    10. };
    11. // 定义一个数组,存放需要点亮灯的pin
    12. const byte ledpins[] = {4, 5, 6, 7, 8, 9};
    13. const byte ledpins_size = sizeof(ledpins) / sizeof(ledpins[0]);
    14. void showmenu(); // 函数声明--串口打印菜单界面
    15. void ledon(const byte &pin); // 开灯
    16. void ledoff(const byte &pin); // 关灯
    17. void ledflash(const byte &pin); // 闪烁
    18. void setup()
    19. {
    20. Serial.begin(9600);
    21. Serial.setTimeout(300); // 串口运行时间
    22. while (!Serial)
    23. {
    24. } //等待串口连接
    25. // 定义端口号为输出
    26. for (byte i = 0; i < ledpins_size; i++)
    27. pinMode(ledpins[i], OUTPUT);
    28. showmenu(); // 向串口打印命令菜单
    29. }
    30. void loop()
    31. {
    32. // 等待用户输入命令
    33. while (Serial.available())
    34. {
    35. // 用户输入放进input中
    36. byte input = Serial.parseInt(); // 读取一个整数,返回值为整数
    37. Serial.println(String(input));
    38. // 初始化一个新的LedMenu enum类型的对象 cmd
    39. // 并将input字节转换成对应的LedMenu enum值
    40. LedCmd cmd = static_cast(input); // static_cast功能:把一个表达式转换成某种类型
    41. Serial.println("cmd enum内存占用-" + String(sizeof(cmd)) + "字节");
    42. switch (cmd)
    43. {
    44. case LedCmd::On:
    45. ledon(ledpins, ledpins_size); //开灯程序
    46. break;
    47. }
    48. }
    49. }
    50. void ledon(const byte *pins, const byte pinsize)
    51. {
    52. for (byte i = 0; i < pinsize; i++)
    53. digitalWrite(pins[i], LOW);
    54. }

    位域

    主要是为了节省空间,1个字节8位

    位域的方式分配空间只能用在结构体和类中

    1. // 进行位域划分,一个int为2个字节,16bit
    2. // 使用方法,在变量名后加一个:即可
    3. struct Date{
    4. int year:12; //分配12个bit
    5. int month:4; // 分配4个字节
    6. int day:5; // ....
    7. int hour:5;
    8. int minute:6;
    9. int second:6;
    10. };

    联合体 union

    结构体和联合体的区别:内存占用方式不一样

    结构体:内存独享

    联合体:内存共享,可以节省内存空间

    1. union Data
    2. {
    3. byte b; // 1 byte
    4. int i; // 2 bytes
    5. long l; // 4 bytes
    6. char str[14]; // 14 bytes
    7. };
    8. // 当四个变量不同时使用时,占用空间14 bytes
    9. // 当4个变量同时使用,数据会出错
    10. Data data;

    类 class

    主要作用:进行封装

    结构体和类的区别:

    类:所有的成员只对内开放,内外访问有限制。

    结构体:开放

    1. class Ledflash
    2. {
    3. public:
    4. ledflash(); // 构造函数
    5. void init();
    6. void on();
    7. void off();
    8. private:
    9. byte _pin = 13; // _代表私有
    10. };
    11. Ledflash::ledflash(byte pin ){
    12. _pin = pin;
    13. }
    14. void Ledflash::init(){
    15. pinMode(_pin, OUTPUT);
    16. }
  • 相关阅读:
    Python 之 sqrt函数浅析
    es的优势
    盘点2024年国内外热门的十大项目管理软件
    rsm包设计响应面试验并做数据分析
    【sdx62】WCN685X将bdwlan.bin和bdwlan.txt相互转化操作方法
    软件测试面试技巧有哪些?可以从这2个方面去进行准备
    Android T(13)-- Looper 的使用(一)
    怎么在国家级媒体网站投稿发布通稿
    卷积神经网络基础补充
    java调用其他项目接口
  • 原文地址:https://blog.csdn.net/qq_45355603/article/details/126739469