枚举 位域 联合体 类

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

Enumerator--枚举器

Enum--枚举的缩写

枚举 位域 联合体 类_第1张图片

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

 采用枚举进行点灯示例

枚举 位域 联合体 类_第2张图片

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

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

#include 
// enum 声明
// 默认使用整数类型,占用2个字节
// 改成unsigned char或者 byte,只占用1个字节
enum class LedCmd
{
  On,
  Off,
  Flash
};

// 定义一个数组,存放需要点亮灯的pin
const byte ledpins[] = {4, 5, 6, 7, 8, 9};
const byte ledpins_size = sizeof(ledpins) / sizeof(ledpins[0]);

void showmenu();                // 函数声明--串口打印菜单界面
void ledon(const byte &pin);    // 开灯
void ledoff(const byte &pin);   // 关灯
void ledflash(const byte &pin); // 闪烁

void setup()
{
  Serial.begin(9600);
  Serial.setTimeout(300); // 串口运行时间
  while (!Serial)
  {
  } //等待串口连接

  // 定义端口号为输出
  for (byte i = 0; i < ledpins_size; i++)
    pinMode(ledpins[i], OUTPUT);
  showmenu(); // 向串口打印命令菜单
}

void loop()
{
  // 等待用户输入命令
  while (Serial.available())
  {
    // 用户输入放进input中
    byte input = Serial.parseInt(); // 读取一个整数,返回值为整数
    Serial.println(String(input));
    // 初始化一个新的LedMenu enum类型的对象 cmd
    // 并将input字节转换成对应的LedMenu enum值
    LedCmd cmd = static_cast(input); //  static_cast功能:把一个表达式转换成某种类型
    Serial.println("cmd enum内存占用-" + String(sizeof(cmd)) + "字节");
    switch (cmd)
    {
    case LedCmd::On:
      ledon(ledpins, ledpins_size); //开灯程序
      break;
    }
  }
}

void ledon(const byte *pins, const byte pinsize)
{
  for (byte i = 0; i < pinsize; i++)
    digitalWrite(pins[i], LOW);
}

位域

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

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

枚举 位域 联合体 类_第3张图片

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

联合体 union

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

结构体:内存独享

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

枚举 位域 联合体 类_第4张图片

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

类 class

主要作用:进行封装

结构体和类的区别:

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

结构体:开放

枚举 位域 联合体 类_第5张图片

class Ledflash
{
public:
  ledflash(); // 构造函数
  void init();
  void on();
  void off();

private:
  byte _pin = 13; // _代表私有
};

Ledflash::ledflash(byte pin ){
  _pin = pin;
}

void Ledflash::init(){
  pinMode(_pin, OUTPUT);
}

你可能感兴趣的:(Arduino神奇世界,C语言)