-2

将 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++));
4

1 回答 1

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;
}

或者,可以完全消除ij变量:

bool RfLinkIsStringInArray(char *buffer, char* strArray[])
{
    while (*strArray != "\0")
    {
        if (strcmp(buffer, *strArray++) == 0)
            return true;
    }
    return false;
}

也就是说,不能保证"\0"代码中的两个不同的字符串文字在运行时会指向同一个内存地址。一些编译器确实合并了重复的字符串,但这是非常特定于编译器的行为。你不应该依赖它。您需要使用strlen(...) == 0来检测终止的零长度字符串,或者更好地使用 NULL 指针。

于 2019-09-21T18:23:55.373 回答