Fehler bei Kontruktor (laut Compiler)

Hallo,

ich arbeite derzeit an einem Master-Clients - System für eine kleine Heimautomation. Dafür habe ich eine erste Fassung erstellt.

Die uC kommunizieren über nrf24L01+ miteinander. Dazu verwende ich die Bibliotheken RF24, -Network und -Mesh.

Der Compiler wirft mir beim Übersetzen Fehler, mit denen ich wenig anfangen kann. Es macht den Anschein, dass ich die Konstruktoren nicht korrekt anspreche(?)

Kurze Beschreibung zum Code:

  • Clients werden immer mit dem Objekt HA arbeiten, der Master mit dem abgeleiteten ServerFunctions.
  • Meist arbeite ich mit vMicro für VisualStudio, für die Tests habe ich die Direktiven aber erstmal auskommentiert.
  • Die Klassen sind über die Bibliothek eingebunden (liegen bei mir also im Ordner libraries).

Ich verwende einen Uno für den Master, die Clients bekommen einen Pro Mini.

Der Code ist vereinfacht und auf das beschränkt, wo die Fehler auftreten.

HA.h

#include <Arduino.h>
#include <RF24.h>
#include <RF24Network.h>
#include <RF24Mesh.h>
#include <Ethernet.h>

#ifndef values
#define values

//Requestschema vom µC:
//http://192.168.0.9/Client/SubControl/Action
//			^Addresse immer gleich
//						^entspricht dem Wert von eHANodeTypes
//						 Wenn der Wert -1 übergeben wurde, wird nichts gesetzt, sondern die Status aller Clienten zurück gegeben
//								^Identifier, falls Client mehrere Objekt verwaltet
//										^Wert, der gesetzt werden soll. Sollte irgendetwas zwischen 0 und 100 sein.
//										 Wenn der Wert -1 übergeben wurde, wird nichts gesetzt, sondern nur der Status ausgelesen

//#define master 1
//#define woodlamp 1
//#define flexenlamp 1
//#define corridornight 1

//#if not defined master
//#define MESH_NOMASTER
//#endif
//
//#if ((defined woodlamp || defined flexenlamp || defined corridornight) && defined master ) || (!defined woodlamp && !defined flexenlamp && !defined corridornight && !defined master)
//return;
//#endif

//Definiert die Stationarten.
//Danach richtet sich, wie sich der Knoten verhält (Server oder Client)
enum eHANodeTypes { Master, Woodlamp, Flexenlamp, CorridorNight };
//Definiert die Funktionsmodi.
enum eHANodeModes { Server, Client };

//Definiert die Anfragetypen für Knoten
//Werte setzen oder Werte auslesen
enum eHARequestCommand { Set, Read };

//Strukt mit Anfragetyp, Sonderanfrage und neuem Wert.
struct sHARequest {
	eHARequestCommand command;
	//Sonderanfrage - für den Fall, dass ein Knoten unterschiedliche Ziele/Funktionen hat.
	char subControl;
	byte value;
};

//Strukt mit dem akutellen Zustand eines Knotens.
// hardState ist 0 oder 1
// softState zeigt den tatsächlichen Wert
// percentageState zeigt den Wert prozentual im möglichen Wertebereich
// outputPin ist der physisch verwendete Ausgang am uC
struct sHAControlState {
	char subControl;
	bool hardState;
	byte softState;
	byte percentageState;
	int outputPin;
};

class HA
{
private:
	sHAControlState controlState;
public:
	RF24 radio;
	RF24Network network;
	RF24Mesh mesh;

	eHANodeModes mode;
	eHANodeTypes type;

	//Die letzte Stelle wird durch den INT-Wert des eHANodeTypes ersetzt.
	byte macAddress[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x00 };

	HA(eHANodeTypes nodeType);
	// void Update();

	// void SetStates(sHARequest *newState);
	// void CalcRequestToState(sHARequest *newState, sHAControlState* stateObject);
	// void SendData(sHAControlState* values);

	// void printSerial(String text, bool newLine);
};

//#ifdef master
class ServerFunctions : public HA {
private:
	EthernetServer server;
	byte ipAddress[4] = { 192, 168, 0, 0 };

public:
	ServerFunctions(eHANodeTypes nodeType);
	// void Update();

	// void ForewardRequest(eHANodeTypes nodeTypeNumber, String requestString);

	// //sHARequest BuildHARequest();
	// void SendData(sHARequest* values, int nodeID);
	// sHAControlState getStates(eHANodeTypes nodeTypeNumber, char subControl);
	// String getStatesEthernetResponse(eHANodeTypes nodeTypeNumber, char subControl);

	// uint16_t GetNodeAddressByID(int nodeID);
	// String getValueAtIndex(String data, char separator, int index);
};
//#endif

#endif

HA.cpp

#include <Arduino.h>
#include <HA.h>
#include <RF24.h>
#include <RF24Network.h>
#include <RF24Mesh.h>
#include <Ethernet.h>

HA::HA(eHANodeTypes nodeType)
{
	type = nodeType;
	mode = (nodeType == Master ? Server : Client);
	macAddress[5] = (int)nodeType;

	radio(7, 8);
	network(radio);
	mesh(radio, network);

	mesh.setNodeID(nodeType);
	mesh.begin();
}


ServerFunctions::ServerFunctions(eHANodeTypes nodeType) : HA(nodeType) {
	server = EthernetServer(80);

	Ethernet.begin(macAddress, ipAddress);
	server.begin();
}

automation_oop.ino

#include <RF24.h>
#include <RF24Network.h>
#include <RF24Mesh.h>
#include <Ethernet.h>
#include <SPI.h>
#include <HA.h>


//#ifdef master
ServerFunctions automation(Master);
//#else
//#if defined woodlamp
//HA automation(Woodlamp);
//#elif defined flexenlamp
//HA automation(Flexenlamp);
//#elif defined corridornight
//HA automation(CorridorNight);
//#endif
//#endif


void setup()
{

}

void loop()
{
	//automation.Update();
}

Der erste Block der Fehlermeldungen sieht wie im Folgenden aus. Die gesamte Ausgabe befindet sich im Anhang.

C:\Users\[xxx]\Documents\Arduino\libraries\HA\HA.cpp: In constructor 'HA::HA()':

C:\Users\[xxx]\Documents\Arduino\libraries\HA\HA.cpp:8:8: error: no matching function for call to 'RF24::RF24()'

 HA::HA()

        ^

C:\Users\[xxx]\Documents\Arduino\libraries\HA\HA.cpp:8:8: note: candidates are:

In file included from C:\Users\[xxx]\Documents\Arduino\libraries\HA/HA.h:2:0,

                 from C:\Users\[xxx]\Documents\Arduino\libraries\HA\HA.cpp:2:

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:124:3: note: RF24::RF24(uint16_t, uint16_t, uint32_t)

   RF24(uint16_t _cepin, uint16_t _cspin, uint32_t spispeed );

   ^

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:124:3: note:   candidate expects 3 arguments, 0 provided

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:110:3: note: RF24::RF24(uint16_t, uint16_t)

   RF24(uint16_t _cepin, uint16_t _cspin);

   ^

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:110:3: note:   candidate expects 2 arguments, 0 provided

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:51:7: note: constexpr RF24::RF24(const RF24&)

 class RF24

       ^

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:51:7: note:   candidate expects 1 argument, 0 provided

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:51:7: note: constexpr RF24::RF24(RF24&&)

C:\Users\[xxx]\Documents\Arduino\libraries\RF24/RF24.h:51:7: note:   candidate expects 1 argument, 0 provided

Wo liegt mein Fehler?

Wenn noch Informationen benötigt werden, dann einfach Bescheid geben.

:slight_smile:

Achja - und schlagt mit bitte einen besseren Namen für das Thema vor. Mit fiel kein besserer ein.

errorMessages.txt (14.2 KB)

Klar geht das nicht:

 radio(7, 8);
 network(radio);
 mesh(radio, network);

Zu dem Zeitpunkt bist du schon im Konstruktor. Die anderen Objekte müssen aber vorher erstellt werden

So eher (nicht getestet!):

HA::HA(eHANodeTypes nodeType) : radio(7, 8), network(radio), mesh(radio, network)
{
}

Achte hier auch unbedingt darauf dass die Liste der Konstruktoren die gleiche Reihenfolge wie die Deklaration der Variablen im Header hat!

Danke, das scheint es im ersten Schritt erstmal zu lösen.

In der vereinfachten Variante habe ich jetzt den Folgenden Code.

HA::HA(eHANodeTypes nodeType)
    : radio(7, 8), network(radio), mesh(radio, network)
{
    type = nodeType;
    mode = (nodeType == Master ? Server : Client);
    macAddress[5] = (int)nodeType;


    mesh.setNodeID(nodeType);
    mesh.begin();
}


ServerFunctions::ServerFunctions(eHANodeTypes nodeType)
    : server(80), HA(nodeType)
{
    Ethernet.begin(macAddress, ipAddress);
    server.begin();
}

Und erhalte keinen Fehler :)

Darauf baue ich jetzt auf.

Und Objekte bitte als Referenz an Methoden übergeben. In dem auskommentierten Teil sind mehrmals String Objekte als Wert (value) übergeben. Das ist nicht gut. Da braucht man auch keine Zeiger (wie bei paar der anderen Methoden). Einfach sowas:

void func(String& str)
{
}

Dann kannst du str.X machen anstatt str->X wie bei Zeigern

Danke. Heute Nachmittag werde ich das ganze mal testen :)