Ошибка: Переменная или поле объявлены недействительными
Для более крупного скетча я отделил кусок кода в отдельном файле .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
@Zaffresky, 👍0
Обсуждение1 ответ
Лучший ответ:
В C порядок важен. Все анализируется последовательно, и включения заголовочного файла буквально заменяются содержимым заголовка во время компиляции.
Вещи должны быть определены, прежде чем их можно будет использовать, и это включает в себя все, что определено в заголовочном файле Arudino.h
- этот файл должен быть включен перед всем, что его использует, - и, конечно, это означает, что он должен быть перед любыми заголовками, которые используют вещи из Arduino.h
Чтобы быть более безопасным, полезно включить Arduino.h
в каждый файл, который использует что-либо из него, чтобы вы не столкнулись с этими проблемами в будущем.
В комплекте Arduino.h во всех файлах .cpp и компилируется без ошибок. Хотя я опускал его только в тех местах, где считал, что он вообще не нужен, но, возможно, где-то он и требовался., @Zaffresky
- Ошибка: expected unqualified-id before 'if'
- ошибка: expected primary-expression before '(' token
- GSM-модуль IOT-GA6 Arduino + ошибка CME 58
- Не могу использовать uint16_t в библиотеке
- Использование функций в заголовочных файлах
- Что означает аргумент []() в функции?
- Возможно ли, чтобы функция возвращала строку ИЛИ число, в зависимости от адреса
- Не удалось скомпилировать библиотеки c++11, несмотря на добавление-std=c++11 в platform.txt
Ваши проблемы начинаются *до* кода, который вы нам показали. В частности, в (или даже раньше) weatherapi.h. Он говорит, что не знает, что такое "Строка" - вы включили Arduino.эйч там?, @Majenko
Да, я включил Arduino.h но все та же ошибка :(. Пожалуйста, смотрите обновленный пост, @Zaffresky
Порядок очень важен.... Arduno.h должен быть включен *до* его использования..., @Majenko