2017-11-05 3 views
0

내 상황에 적용 가능한 해결책을 찾지 못한 채 몇 시간 동안이 문제에 대해 읽었습니다. 포함 된 파일 및 라이브러리와 관련된 문제가있을 수 있음을 이해하지만 실제로 무엇이 잘못되었는지를 알 수는 없습니다.오류 : '인수'의 유형에 .cpp 및 .h 파일의 문제가 있다고 가정하지 않았습니다.

MQTT 클라이언트 라이브러리를 사용하는 Arduino 스크립트입니다. 그것은 오래된 PubSubClient.h lib와 아름답게 작동합니다.

이제 lib를 최근 버전으로 업데이트하고 싶습니다. 함수 정의가 변경되어 스케치를 변경하고 Arduino/라이브러리 디렉토리의 lib를 전환 한 다음 Arduino IDE를 다시 시작했습니다. 나는 "error : '인자가'타입을 지정하지 않는다 '라는 많은 것을 얻었고, 나는 무엇을 고칠 지 정말로 모른다.

여기에서 .h 및 .cpp 파일 조직을 찾아서 어떤 일이 일어나고 있는지 이해할 수 있습니다.

파일 //device.ino

#include "device.h" 

//device.h 파일

#ifndef DEVICE_H 
#define DEVICE_H 

#include <WiFiClient.h> 
#include <WiFiClientSecure.h> 
#include <ESP8266WiFi.h> 
#include <ESP8266HTTPClient.h> 
#include <ESP8266WebServer.h> 
#include <ESP8266mDNS.h> 
#include <ESP8266HTTPUpdateServer.h> 
#include <PubSubClient.h> 
#include <ArduinoJson.h> 
#include <jsmn.h> 
#include <Arduino.h> 
#include <pgmspace.h> 
#include "mqtt.h" 

#endif 

mqtt.h 파일

#ifndef MQTT_H 
#define MQTT_H 

#include "device.h" 

#endif 

mqtt.cpp 파일

#include "mqtt.h" 

WiFiClient wifi_client; 
PubSubClient mqtt_client(wifi_client); 
mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT); 
mqtt_client.setCallback(mqtt_callback); 

마지막으로 오류 컴파일러는 밖으로 던져 : mqtt.cpp를 : 19 : 오류 : 'mqtt_client'는 유형

 mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT); 

    ^

    mqtt.cpp:20: error: 'mqtt_client' does not name a type 

    mqtt_client.setCallback(mqtt_callback); 

    ^

    sketch\mqtt.cpp: In function 'void mqtt_publish_mex(String, String, bool)': 

    mqtt.cpp:27: error: no matching function for call to 'PubSubClient::publish(String&, String&, bool&)' 

      if (mqtt_client.publish(topic, jmex, retained)) { 

                 ^

    sketch\mqtt.cpp:27:54: note: candidates are: 

    In file included from sketch\Walvola.h:25:0, 

        from sketch\mqtt.h:4, 

        from sketch\mqtt.cpp:1: 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: boolean PubSubClient::publish(const char*, const char*) 

     boolean publish(const char* topic, const char* payload); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: candidate expects 2 arguments, 3 provided 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: boolean PubSubClient::publish(const char*, const char*, boolean) 

     boolean publish(const char* topic, const char* payload, boolean retained); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: no known conversion for argument 1 from 'String' to 'const char*' 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int) 

     boolean publish(const char* topic, const uint8_t * payload, unsigned int plength); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: no known conversion for argument 1 from 'String' to 'const char*' 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean) 

     boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: candidate expects 4 arguments, 3 provided 

    sketch\mqtt.cpp: In function 'void mqtt_log(String)': 

    mqtt.cpp:347: error: no matching function for call to 'PubSubClient::publish(const String&, String&)' 

      mqtt_client.publish(mqtt_controllers_topic_debug, json_string); 

                     ^

    sketch\mqtt.cpp:347:70: note: candidates are: 

    In file included from sketch\Walvola.h:25:0, 

        from sketch\mqtt.h:4, 

        from sketch\mqtt.cpp:1: 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: boolean PubSubClient::publish(const char*, const char*) 

     boolean publish(const char* topic, const char* payload); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: no known conversion for argument 1 from 'const String' to 'const char*' 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: boolean PubSubClient::publish(const char*, const char*, boolean) 

     boolean publish(const char* topic, const char* payload, boolean retained); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: candidate expects 3 arguments, 2 provided 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int) 

     boolean publish(const char* topic, const uint8_t * payload, unsigned int plength); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: candidate expects 3 arguments, 2 provided 

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean) 

     boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained); 

       ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: candidate expects 4 arguments, 2 provided 

    In file included from sketch\mqtt.h:4:0, 

        from sketch\mqtt.cpp:1: 

    sketch\mqtt.cpp: In function 'void mqtt_callback(char*, byte*, unsigned int)': 

    mqtt.cpp:375: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}' 

      log(payload.payload_string()); 

         ^

    sketch\Walvola.h:89:67: note: in definition of macro 'log' 

    #define log(mex) if (DEBUG) {Serial.println(walvola_time + "::" + mex);Serial.flush(); if(MQTT_DEBUG) {mqtt_log(walvola_time + "::" + mex);}} 

                    ^

    mqtt.cpp:375: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}' 

      log(payload.payload_string()); 

         ^

    sketch\Walvola.h:89:135: note: in definition of macro 'log' 

    #define log(mex) if (DEBUG) {Serial.println(walvola_time + "::" + mex);Serial.flush(); if(MQTT_DEBUG) {mqtt_log(walvola_time + "::" + mex);}} 

                                     ^

    mqtt.cpp:379: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}' 

      if (mqtt2JSONkvs(payload.payload_string())) { 

            ^

    mqtt.cpp:404: error: a function-definition is not allowed here before '{' token 

    { 

    ^

    mqtt.cpp:512: error: expected '}' at end of input 

    } 

    ^

    Più di una libreria trovata per "WiFiClient.h" 
    Usata: C:\Users\Fabrizio & Dario\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi 
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi 
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi 
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi 
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi 
    exit status 1 
    'mqtt_client' does not name a type 
도움을

감사 이름을하지 않습니다!

답변

1

처음 두 행은 꽤 괜찮 =>이 문제는 전화와 함께 제공 wifi_clientmqtt_client

라는 이름의 전역 변수를 선언되어있다

WiFiClient wifi_client; 
PubSubClient mqtt_client(wifi_client); 
mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT); 
mqtt_client.setCallback(mqtt_callback); 

를 작성

mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT); 
mqtt_client.setCallback(mqtt_callback); 

당신이 할 수있는 전역 범위에서 변수를 선언하지만 전역 변수 초기화가 아닌 한 함수 밖에서 함수를 호출 할 수는 없습니다. 이 오류가 발생하는 이유입니다. 당신이 가리키는 예제는 변수가 함수에있는 것과는 다르다. 따라서 함수 정의 문맥에있는 메소드를 바로 호출 할 수있다.

예를 들어 main() 함수에서 호출을 이동해야 코드가 유효 해집니다.

즉, 헤더에 전역 변수를 두는 것은 다른 cpp 파일의 파일을 포함시키는 것일 수 있습니다. 컴파일러는 여러 정의에 대해 불평하지만, 여기에는 질문이 없습니다.

+0

덕분 I 대신이 같은 멤버 함수의 매개 변수를 사용 funciton : PubSubClient의 mqtt_client (mqtt_server, MQTT_BROKER_PORT, mqtt_callback, wifi_client)를; 하지만 뭔가가 여전히 잘못 호출에 대해 동일한을 사용할 수 없습니다 생각 : mqtt_client.publish 내가 전화를 사용 또한 exemple를 확인하고 있다는 점에서 (주제, jmex은 유지) 링크 ] (https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino) 행 112, 130 .. –

+0

실제로는 아니지만 이전에 내가 사용한 시간이었습니다. 필자는 pubsubclient 객체를 선언하고 public 함수를 호출하는 것보다 예제와 같은 방법으로 작업을 수행했습니다. 코드를 옮길 곳을 더 명확하게 할 수 있습니까 (이전 답)? 어쩌면 당신을 위해 간단하지만 나는 미쳐 갈거야, 고마워! –

+0

내 수정 참조 – OznOg

관련 문제