Mehrfaches Einbinden globaler Settings.h: Mehrdimensionale Arrays, Enum oder Struct – C++ [geschlossen]C++

Programme in C++. Entwicklerforum
Anonymous
 Mehrfaches Einbinden globaler Settings.h: Mehrdimensionale Arrays, Enum oder Struct – C++ [geschlossen]

Post by Anonymous »

Ich möchte globale Benutzereinstellungen für das gesamte Projekt erstellen. Im Beispiel geht es um MQTT-Themen.
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
und DispFunc.cpp).
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
). Nicht in beiden: der .h und der .cpp. Mehrdimensionale Arrays (hier zweidimensional), die Verwendung des Enum-Typs oder der Struktur stellen für mich eine Herausforderung dar.
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
Enthält externe Deklarationen, sodass die Header-Datei mehrfach eingebunden werden kann:

Code: Select all

enum pubTopicNameEnum
{
mqttPubStatus,
mqttPubTemperature,
mqttPubLight
//...
};
extern char pubTopicChar[][256];

Code: Select all

SETTINGS.cpp
Enthält Definitionen der Variablen.

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
Druckt das erwartete Thema auf dem seriellen Monitor.

Code: Select all

#include 
//...
Serial.println(pubTopicChar[mqttPubStatus]);

Code: Select all

others.cpp

Code: Select all

#include 
Nicht relevant, nur der Vollständigkeit halber
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 
Nicht relevant, nur der Vollständigkeit halber

Code: Select all

main.cpp

Code: Select all

#include 
//...
Serial.println(pubTopicStruct[mqttPubStatus].topic);
1. Vorteil: Ich muss die 2. Dimension eines Arrays nicht mehr in SETTINGS.h definieren.
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é

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post
  • Java Spring Stiefel Mehrfaches Spaltenverbinden [geschlossen]
    by Anonymous » » in Java
    0 Replies
    7 Views
    Last post by Anonymous
  • Globaler Hotkey in der Konsolenanwendung
    by Guest » » in C#
    0 Replies
    9 Views
    Last post by Guest
  • Hinzufügen globaler Attribute zu Opentelemetrie -Metriken
    by Guest » » in C#
    0 Replies
    5 Views
    Last post by Guest
  • Wie finde ich überlappende mehrdimensionale Bereiche? [geschlossen]
    by Guest » » in Python
    0 Replies
    20 Views
    Last post by Guest
  • Wie finde ich überlappende mehrdimensionale Bereiche?
    by Guest » » in Python
    0 Replies
    10 Views
    Last post by Guest