将arduino nano移植到esp8266
// list of fields that must be quoted in JSON convertion
char RFLINK_FIELD_NAME_CMD[] = "CMD";
char RFLINK_FIELD_NAME_BAT[] = "BAT";
char RFLINK_FIELD_NAME_SMOKEALERT[] = "SMOKEALERT";
char RFLINK_FIELD_NAME_SWITCH[] = "SWITCH";
char RFLINK_FIELD_NAME_PIR[] = "PIR";
char RFLINK_FIELD_NAME_RFDEBUG[] = "RFDEBUG";
char* RFLINK_FIELD_STRING[] = {
RFLINK_FIELD_NAME_CMD,
RFLINK_FIELD_NAME_BAT,
RFLINK_FIELD_NAME_SMOKEALERT,
RFLINK_FIELD_NAME_SWITCH,
RFLINK_FIELD_NAME_PIR,
RFLINK_FIELD_NAME_RFDEBUG,
"\0" // do not remove this mark the end of the array
};
出现问题的功能:
/**
* check wether a given string is in a array of strings
*/
bool RfLinkIsStringInArray(char *buffer, char* strArray[]) {
int i = 0;
int j;
while((strArray + i) != '\0') {
j = strcmp(buffer, (strArray + i++));
if((j==0)) return true;
}
return false;
}
In function 'bool RfLinkIsStringInArray(char*, char**)':
error: cannot convert 'char**' to 'const char*' for
argument '2' to 'int strcmp(const char*, const char*)'
j = strcmp(buffer, (strArray + i++));
答案 0 :(得分:2)
strArray
是一个字符串指针数组,由一个零长度字符串的指针(为什么不是NULL指针?)终止。数组本身会衰减为指向其第一个元素的指针。您需要取消引用数组指针以访问各个字符串指针,以便可以将它们传递到strcmp()
直至到达该终止符,例如:
bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
int i = 0;
int j;
while (*(strArray + i) != "\0") // <- note the *
{
j = strcmp(buffer, *(strArray + i++)); // <- note the *
if (j == 0) return true;
}
return false;
}
或者,仅使用普通数组语法(适用于数组指针)而不是手动指针算术语法:
bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
int i = 0;
int j;
while (strArray[i] != "\0")
{
j = strcmp(buffer, strArray[i++]);
if (j == 0) return true;
}
return false;
}
或者,可以完全消除i
和j
变量:
bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
while (*strArray != "\0")
{
if (strcmp(buffer, *strArray++) == 0)
return true;
}
return false;
}
话虽如此,并不能保证代码中两个不同的"\0"
字符串文字在运行时将指向相同的内存地址。一些编译器确实合并重复的字符串,但这是非常特定于编译器的行为。您不应该依赖于此。您需要使用strlen(...) == 0
来检测终止的零长度字符串,或者最好使用NULL指针。