2017-11-05 12 views
0

私の状況に該当する解決策を見つけることなく何時間もこの問題について読んでいます。私は、インクルードされたファイルやライブラリに関連する問題があるかもしれないと理解していますが、実際に何が間違っているかを見つけることはできません。エラー: '引数'には、.cppファイルと.hファイルの問題があると思われるタイプの名前はありません。

MQTTクライアントライブラリを使用するArduinoスクリプトです。これは、古いPubSubClient.h libで美しく動作します。

今、私は最近のものでlibを更新したいと思っていました。関数の定義が変更されたので、スケッチを変更し、Arduino/libraryディレクトリのlibを切り替え、Arduino IDEを再起動しました。私は多くの "エラー:"引数は "タイプを指定していない"と私は本当に修正するか分からない。

ここでは、.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

最初の2行はかなりOK =>あなたは問題が通話が付属していますとmqtt_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); 

することができますグローバルスコープで変数を宣言しますが、関数外では関数を呼び出すことはできません(ただし、グローバル変数の初期化の場合を除く)。なぜこのエラーが発生するのですか?あなたが指している例は変数が関数内にあるときとは異なっているので、直後のmethodesを呼び出すことは正当である:関数コンテキストにいる。

したがって、コードが有効になるように、main()関数で呼び出しを移動する必要があります。つまり、ヘッダーにグローバル変数を置くと、さまざまなcppファイルからファイルをインクルードすることができます。コンパイラは複数の定義について文句を言いますが、ここでの質問はまだありません。

+0

おかげで、私の代わりに、このようなメンバー関数のパラメータでfuncitonを使用する: PubSubClientのmqtt_client(mqtt_server、MQTT_BROKER_PORT、 mqtt_callback、wifi_client)。 しかし、私は何かがまだ通話のための同じを使用することはできません、間違っていると思う: mqtt_client.publish(トピック、jmex、保持) 私もexempleをチェックして、その中に呼び出し、[リンクを使用しています](https://github.com/knolleary/pubsubclient/blob/master/examples/mqtt_esp8266/mqtt_esp8266.ino)の行112,130 .. –

+0

実際には、以前は私が最後に使った時でした。私は、例と同じ方法で、pubsubclientオブジェクトを宣言し、パブリック関数を呼び出すよりもやっていました。そのコードをどこに移動するかを以前の回答として明確にすることはできますか?たぶんあなたのためのシンプルですが、私は夢中になります、ありがとう! –

+0

私の変更を参照してください – OznOg

関連する問題