Как правильно создать функцию класса, которой в качестве параметра передается массив строк? [Ардуино] - PullRequest
0 голосов
/ 18 июня 2020

Я хочу создать свою собственную функцию в существующей библиотеке из Arduino / ESP8266, передать пустой массив на случай, если у пользователя нет заголовка.

//.h file
t_httpUpdate_return updateheader(WiFiClient& client, const String& url, const String& currentVersion = "", const String& header[][2] = {{}});

//.cpp file
HTTPUpdateResult ESP8266HTTPUpdate::updateheader(WiFiClient& client, const String& url, const String& currentVersion, const String& header[][2])
{
    HTTPClient http;
    http.begin(client,url);
    for (int i, i < sizeof(header), i++){
        http.addHeader(F(header[i][0]), header[i][1]);
    }
    return handleUpdate(http, currentVersion, false);
}

Но я получаю следующую ошибку, когда Пытаюсь скомпилировать:

C:\Users\myuser\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.1\libraries\ESP8266httpUpdate\src/ESP8266httpUpdate.h:125:143: error: declaration of 'header' as array of references
    
t_httpUpdate_return updateheader(WiFiClient& client, const String& url, const String& currentVersion = "", const String& header[][2] = {{}});
    
                                                                                                                                        ^
    
exit status 1
    Error compilando para la tarjeta NodeMCU 1.0 (ESP-12E Module).

Я использую ESP8266httpUpdate Library .

1 Ответ

1 голос
/ 18 июня 2020

Массивы ссылок не допускаются. Кроме того, вы не можете ограничить размер внутреннего массива таким образом.

Массивы не могут передаваться как значения, они в основном распадаются на указатели, когда вы передаете их другой функции. Это также означает, что вам нужно передать размер массива.

То, что вы написали: sizeof(header) - это ошибка - вы получили массив в стиле C в качестве аргумента функции , массив распадается на указатель, и sizeof(header) дает вам размер указателя , а не длину массива!

Я бы использовал структуру для фактического заголовка, поскольку вам всегда нужен размер 2, и тогда вам нужно иметь дело только с одномерным массивом:

struct HttpHeader {
    String name;
    String value;
};

t_httpUpdate_return updateheader(WiFiClient& client, const String& url,
        const String& currentVersion = "",
        const HttpHeader* headers, int headers_size)
{
    HTTPClient http;
    http.begin(client,url);

    for (int i = 0; i < headers_size; i++) {
        http.addHeader(F(headers[i].name), headers[i].value);
    }

    return handleUpdate(http, currentVersion, false);
}

// Calling it somewhere:
HttpHeader headers[] = { { String("Accept"), String("application/json") } };
updateheader(client, version, headers, 1);

Обратите внимание, что это означает, что данные массива живут в стеке вызывающей функции, и указатель становится недействительным как только эта функция закончится. Но это всегда так, когда не используется выделение кучи.

...