Ошибка: Переменная или поле объявлены недействительными

Для более крупного скетча я отделил кусок кода в отдельном файле .cpp

#include "msg.h"
#include <Arduino.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv)
{


    String json = payload;

    // Serial.println(json); // включить отладку

    StaticJsonDocument<128> filter;

    JsonObject filter_current = filter.createNestedObject("current");
    filter_current["temp_c"] = true;
    filter_current["wind_mph"] = true;
    filter_current["pressure_mb"] = true;
    filter_current["precip_in"] = true;
    filter_current["humidity"] = true;
    filter_current["feelslike_c"] = true;
    filter_current["uv"] = true;

    StaticJsonDocument<256> doc;

    // Deseriliaze и описание ошибки отображения, если таковая имеется
    DeserializationError error = deserializeJson(doc, json, DeserializationOption::Filter(filter));

    if (error)
    {
        Serial.print("deserializeJson() failed: ");
        Serial.println(error.c_str());
        return;
    }

    JsonObject current = doc["current"];
    temp = current["temp_c"];          // 80
    wind = current["wind_mph"];        // 5.6
    pressure = current["pressure_mb"]; // 1005
    humid = current["humidity"];       // 93
    feel = current["feelslike_c"];     // 6.9
    uv = current["uv"];                // 1
}

вместе с его заголовочным файлом, как показано ниже:

#ifndef MSG_H
#define MSG_H

void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);

#endif

Я включил все соответствующие библиотеки в файлы .cpp. Однако, когда я пытаюсь скомпилировать код, я получаю несколько ошибок, таких как

In file included from src/weatherapi.cpp:1:0:
include/weatherapi.h:4:17: error: variable or field 'getRequest' declared void
 void getRequest(String &payload);
                 ^
include/weatherapi.h:4:17: error: 'String' was not declared in this scope
include/weatherapi.h:4:25: error: 'payload' was not declared in this scope
 void getRequest(String &payload);
                         ^
Archiving .pio\build\lolin32\liba47\libPubSubClient.a
In file included from src/msg.cpp:1:0:
include/msg.h:4:20: error: variable or field 'parseResponse' declared void
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                    ^
include/msg.h:4:20: error: 'String' was not declared in this scope
include/msg.h:4:28: error: 'payload' was not declared in this scope
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                            ^
include/msg.h:4:37: error: expected primary-expression before 'float'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                                     ^
include/msg.h:4:50: error: expected primary-expression before 'float'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                                                  ^
include/msg.h:4:63: error: expected primary-expression before 'int'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                                                               ^
include/msg.h:4:78: error: expected primary-expression before 'int'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                                                                              ^
include/msg.h:4:90: error: expected primary-expression before 'float'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);
                                                                                          ^
include/msg.h:4:103: error: expected primary-expression before 'int'
 void parseResponse(String &payload, float &temp, float &wind, int &pressure, int &humid, float &feel, int &uv);

Функция parseResponse ничего не возвращает, поэтому я не знаю, почему она жалуется на объявление void. То же самое верно и для функции GetRequest. Кроме того, есть ли что-то не так в прототипе функции, когда я передаю ссылки?

Edit: Вот weatherapi.cpp файл & .h

#include "weatherapi.h"
#include <HTTPClient.h>
#include <Arduino.h>

const char url[] = "http://api.weatherapi.com/v1/current.json?key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

void getRequest(String &payload)
{

     HTTPClient getClient;

    getClient.begin(url);

   
    int httpCode = getClient.GET();

    //получить ответ и проверить возвращенный код состояния HTTP
    if (httpCode > 0)
    {
        payload = getClient.getString();
        Serial.print("HTTP Status: ");
        Serial.println(httpCode);
    }
    else
    {
        Serial.println("Error on HTTP request");
    }
   
    getClient.end();
} 

файл weatherapi.h

#ifndef WEATHERAPI_H
#define WEATHERAPI_H

void getRequest(String &payload);
#endif

                                                                                             

, 👍0

Обсуждение

Ваши проблемы начинаются *до* кода, который вы нам показали. В частности, в (или даже раньше) weatherapi.h. Он говорит, что не знает, что такое "Строка" - вы включили Arduino.эйч там?, @Majenko

Да, я включил Arduino.h но все та же ошибка :(. Пожалуйста, смотрите обновленный пост, @Zaffresky

Порядок очень важен.... Arduno.h должен быть включен *до* его использования..., @Majenko


1 ответ


Лучший ответ:

2

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

Вещи должны быть определены, прежде чем их можно будет использовать, и это включает в себя все, что определено в заголовочном файле Arudino.h - этот файл должен быть включен перед всем, что его использует, - и, конечно, это означает, что он должен быть перед любыми заголовками, которые используют вещи из Arduino.h

Чтобы быть более безопасным, полезно включить Arduino.h в каждый файл, который использует что-либо из него, чтобы вы не столкнулись с этими проблемами в будущем.

,

В комплекте Arduino.h во всех файлах .cpp и компилируется без ошибок. Хотя я опускал его только в тех местах, где считал, что он вообще не нужен, но, возможно, где-то он и требовался., @Zaffresky