Warum? Normalerweise verwende ich globale Einstellungen nur in der main.cpp (inklusive nur in einer Codedatei) und übergebe das Notwendige Parameter an den Konstruktor einer Klasse beim Instanziieren.
Aber: Ich arbeite mit PlatformIO, ESP32-S3 und in meiner Anwendung mit TFT_eSPI (ST7796-Anzeige), LVGL , und die Touch-Bibliothek TAMC_GT911.
Aufgrund der Komplexität ist es mir bisher nicht gelungen, das alles in Klassen zu packen. Deshalb habe ich die Lösung des Problems auf die Zukunft verschoben. Um die main.cpp aufzuräumen, habe ich eine Header-Datei und eine Codedatei für die anzeigerelevante Implementierung erstellt (
Code: Select all
DispFunc.h
Jetzt muss ich also die globalen Einstellungen auch in DispFunc.cpp verfügbar machen und daher SETTINGS.h als zweites einbinden Zeit. Mein Ansatz funktioniert zwar, ist aber nicht mehr so schön.
Meine Anforderung: Alle Definitionen erfolgen ausschließlich in einer Einstellungsdatei (
Code: Select all
SETTINGS.cpp
Ansatz mit zweidimensionalem Array: Es funktioniert mit dieser Struktur. Allerdings enthält die Header-Datei (bis zu einem gewissen Grad) Definitionen, die ich dort nicht haben möchte.
Code: Select all
SETTINGS.h
Code: Select all
enum pubTopicNameEnum
{
mqttPubStatus,
mqttPubTemperature,
mqttPubLight
//...
};
extern char pubTopicChar[][256];
Code: Select all
SETTINGS.cpp
Code: Select all
const int nPub = 3; // Total number of Topics to Publish
const int l = 256; // Maximum number of characters for topic name (minus 1)
char pubTopicChar[nPub]\[l] =
{
"/stat/Status",
"/stat/Temperature",
"/stat/Light"
};
Code: Select all
main.cpp
Code: Select all
#include
//...
Serial.println(pubTopicChar[mqttPubStatus]);
Code: Select all
others.cpp
Code: Select all
#include
1. Nachteil Enum: Ich muss den Enum-Typ in SETTINGS.h (nicht .cpp) definieren, damit ich in den Codedateien, die SETTINGS.h enthalten, Zugriff darauf habe. Eine Deklaration wie extern enum topicNamePub ist nicht möglich.
2. Nachteil Enum: Ich muss die Anzahl der Enum-Entitäten für die Definition meines char-Arrays in SETTINGS.cpp kennen. Und ich weiß derzeit nicht, wie ich die Anzahl der definierten Enum-Entitäten auswerten soll und muss die Anzahl zusätzlich definieren (siehe SETTINGS.cpp).
3. Nachteil char-Array: Ich muss die zweite Dimension (Länge eines char-Array-Eintrags, auch bekannt als Themenname) bereits in der SETTINGS.h angeben. Dies sollte jedoch nur in SETTINGS.cpp definiert werden.
Vorgehensweise mit Array von Strukturen: Ich benötige also nur ein eindimensionales Array bestehend aus aus mehreren Strukturdefinitionen. Das einzige Element in der Struktur ist ein char-Array mit dem Themennamen.
Code: Select all
SETTINGS.h
Code: Select all
struct PubTopicStruct;
extern PubTopicStruct pubTopicStruct[];
Code: Select all
SETTINGS.cpp
Code: Select all
const int l = 256;
struct PubTopicStruct
{
char topic[l];
};
struct PubTopicStruct pubTopicStruct[] =
{
{ "/stat/Status" },
{ "/stat/Temperatur" },
{ "/stat/Light" }
};
Code: Select all
others.cpp
Code: Select all
#include
Code: Select all
main.cpp
Code: Select all
#include
//...
Serial.println(pubTopicStruct[mqttPubStatus].topic);
2. Vorteil: Die Anzahl der Themen ergibt sich aus der Definition des Arrays mit den Themen, ich muss diese nicht mehr vorher angeben.
1. Nachteil: Um auf die spezifischen Enum-Namen in den Codedateien zugreifen zu können, muss die Enum-Definition weiterhin in SETTINGS.h statt in SETTINGS.cpp liegen.
< S. 2. Nachteil: Mit Zeigern und Referenzen bin ich nicht so vertraut. In Serial.println in main.cpp lautet die Compiler-Fehlermeldung für pubTopicStruct in dieser Zeile: Ausdruck muss ein Zeiger auf einen vollständigen Objekttyp sein . Und für mqttPubStatus sagt: ungültige Verwendung des unvollständigen Typs „struct PubTopicStruct“.
Anstelle von Enum kann ich möglicherweise einfach 3 int-Variablen deklarieren die .h und definieren Sie sie in der .cpp. Dennoch muss ich die .h ergänzen, wenn ein Thema hinzugefügt wird – was nicht generisch ist und was ich auch nicht wirklich möchte. Die Lösung für alle anderen Probleme könnte eine einfache * ...
Grüße René