我正在通过做微控制器项目来自学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];
刚从C开始,我想知道是否有人能解释一些事情。 我相信你可以用下面的方法初始化一个字符数组 这将创建一个字符数组,其值为。 但如果我真的创造了这个: 会创建一个数组,以及指向该数组的指针吗? 例如:将指向内存中的第一个元素,以及数组中的其他元素?
当我试图打印未初始化的静态字符数组时,它会给出运行时错误(Null指针异常),而未初始化的静态int数组会给出Null值。为什么?
描述 (Description) C库函数char *strtok(char *str, const char *delim)使用分隔符delim将字符串str分解为一系列标记。 声明 (Declaration) 以下是strtok()函数的声明。 char *strtok(char *str, const char *delim) 参数 (Parameters) str - 修改此字符串的内容
描述 (Description) C库函数char *strcpy(char *dest, const char *src)将char *strcpy(char *dest, const char *src)指向的字符串复制到dest 。 声明 (Declaration) 以下是strcpy()函数的声明。 char *strcpy(char *dest, const char *src) 参数
描述 (Description) C库函数char *strcat(char *dest, const char *src)将char *strcat(char *dest, const char *src)指向的字符串追加到dest指向的字符串的末尾。 声明 (Declaration) 以下是strcat()函数的声明。 char *strcat(char *dest, const char *
描述 (Description) C库函数char *gets(char *str)从stdin读取一行并将其存储到str指向的字符串中。 当读取换行符或达到文件结尾时(以先到者为准),它会停止。 声明 (Declaration) 以下是gets()函数的声明。 char *gets(char *str) 参数 (Parameters) str - 这是指向存储C字符串的字符数组的指针。 返回值