我正在通过做微控制器项目来自学C++。我当前的项目是使用一对或Adafruit羽毛分组无线电。无线电数据包的库函数需要一个C样式的字符串(我相信),我理解它是一个char的数组。
我已经设置了一个枚举来反映接收方的各种操作,并希望将该状态发送回发送方。所以我想把枚举变成char的数组。
在搜索将枚举转换为char数组的方法时,最简单的方法(对我来说)是将枚举变量传递给带有switch语句的函数,该语句将返回char字符串。但是当我尝试将返回放入char数组时,我得到错误“从'char*'到'char'[-Fpermisive]的转换无效”。我也一直在努力弄清楚数组和指向数组的指针,这在我的头脑中仍然是相当模糊的。
这里是我的代码的一些片段,我希望这些片段能够充分展示我正在尝试做的事情。
…从我的主要职能
BLINKING_RIGHT, //0
BLINKING_LEFT, //1
FLASHING, //2
SHOWING_BATTERY,//3
NONE //4
};
...以及处理枚举以发送的两个函数
void SendStatus()
{
char data[20] {EnumToString(currentAction)}; //This is the line showing the error
//itoa (data,static_cast<int>(currentAction),10);
//data[0]=static_cast<uint8_t>(currentAction);
//data[1]=0;
rf69.send(data, sizeof(data));
rf69.waitPacketSent();
Serial.println("Sent a reply");
}//end_function SendStatus()
char* EnumToString(CurrentAction inputEnum)
{
char *statusString;
switch(inputEnum)
{
case 0:
statusString = "BLINKING_RIGHT"; //0
return statusString;
break;
case 1:
statusString = "BLINKING_LEFT"; //1
return statusString;
break;
case 2:
statusString = "FLASHING"; //2
return statusString;
break;
case 3:
statusString = "SHOWING_BATTERY";//3
case 4:
statusString = "NONE"; //4
return statusString;
break;
default:
return "EnumToString: Invalid enum";
}
}
我希望帮助解决这个问题,更重要的是,帮助理解类型char*和类型char之间的区别。
这一行:
char data[20] {EnumToString(currentAction)};
错误,因为它使用数组初始化用字符串(char*
)初始化char
数组的第一个元素(类型为char
的第一个元素)。你想做的事情是这样的:
char data[20];
strcpy(data, EnumToString(currentAction));
或者干脆:
char *data = EnumToString(currentAction);
后者不涉及任何类型的复制,效率是重要的一个微控制器。
当我们谈到效率时,将顺序枚举值映射到字符串的规范方法是使用数组,它比重复分支效率高几个数量级:
// stored as read-only data in the .hex file
static char *names[] = { "BLINKING_RIGHT", "BLINKING_LEFT", "FLASHING", "SHOWING_BATTERY", "NONE" };
// later
const char *data = names[currentAction];
char
(或任何T)是对象。
字符*
(或任何t*)是指针。
请记住指向第0个元素的指针所显示的数组(char[]
或任何t[]
)。char*
的变量可以指向数组的一个元素(在特殊情况下指向第一个元素)。