Множественное включение глобальных настроек.h: Mehr Dimensional Arrays, Enum или Struct - C++C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Множественное включение глобальных настроек.h: Mehr Dimensional Arrays, Enum или Struct - C++

Сообщение Anonymous »

Я хотел бы создать глобальные пользовательские настройки для всего проекта. Пример касается тем MQTT.
Почему? Обычно я использую глобальные настройки только в файле main.cpp (включаю только в один файл кода) и передаю необходимые параметры конструктору класса при создании экземпляра.
Но: Я работаю с PlatformIO, ESP32-S3 и в своем приложении с TFT_eSPI (дисплей ST7796), LVGL и сенсорная библиотека TAMC_GT911.
Из-за сложности мне пока не удалось упаковать все это в классы. Поэтому я отложил решение проблемы на будущее. Чтобы привести в порядок файл main.cpp, я создал файл заголовка и файл кода для реализации, связанной с отображением (

Код: Выделить всё

DispFunc.h
и DispFunc.cpp).
Итак, теперь мне нужно сделать глобальные настройки доступными и в DispFunc.cpp и, таким образом, включить SETTINGS.h на секунду время. Мой подход работает, но уже не так хорош.
Мое требование: Все определения хранятся исключительно в файле настроек (

Код: Выделить всё

SETTINGS.cpp). Не в обоих: .h
и .cpp. Многомерные массивы (здесь двумерные), использование типа перечисления или структуры являются для меня проблемой.
Подход с двумерным массивом: Это работает с этой структурой. Однако файл заголовка содержит определения (в определенной степени), которые я не хочу иметь там.

Код: Выделить всё

SETTINGS.h
Содержит объявления extern, поэтому файл заголовка можно включать несколько раз:

Код: Выделить всё

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

Код: Выделить всё

SETTINGS.cpp
Содержит определения переменных.

Код: Выделить всё

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"
};

Код: Выделить всё

main.cpp
Печатает ожидаемую тему на последовательном мониторе.

Код: Выделить всё

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

Код: Выделить всё

others.cpp

Код: Выделить всё

#include 
Не актуально, просто для полноты картины
1. Недостаток перечисления: мне нужно определить тип перечисления в SETTINGS.h (не .cpp), чтобы у меня был доступ к нему в файлах кода, которые включают SETTINGS.h. Такое объявление, как extern enum themeNamePub, невозможно.
2. недостаток перечисления: мне нужно знать количество объектов перечисления для определения моего массива символов в SETTINGS.cpp. И в настоящее время я не знаю, как оценить количество определенных объектов перечисления, и мне приходится определять это число дополнительно (см. SETTINGS.cpp).
3. Недостаток char-Array: мне нужно указать второе измерение (длину записи массива символов, то есть имени темы) уже в SETTINGS.h. Однако это должно быть определено только в SETTINGS.cpp.
Подход с использованием массива структур: Поэтому мне нужен только одномерный массив, состоящий из нескольких определений структур. Единственным элементом структуры является массив символов с названием темы.

Код: Выделить всё

SETTINGS.h

Код: Выделить всё

struct PubTopicStruct;
extern PubTopicStruct pubTopicStruct[];

Код: Выделить всё

SETTINGS.cpp

Код: Выделить всё

const int l    = 256;

struct PubTopicStruct
{
char topic[l];
};

struct PubTopicStruct pubTopicStruct[] =
{
{ "/stat/Status"     },
{ "/stat/Temperatur" },
{ "/stat/Light"      }
};

Код: Выделить всё

others.cpp

Код: Выделить всё

#include 
Не актуально, просто для полноты картины

Код: Выделить всё

main.cpp

Код: Выделить всё

#include 
//...
Serial.println(pubTopicStruct[mqttPubStatus].topic);
1. Преимущество: мне больше не нужно определять второе измерение массива в SETTINGS.h.
2. Преимущество: Количество тем определяется определением массива с темами, мне больше не нужно указывать их заранее.
1. Недостаток: для доступа к конкретным именам перечислений в файлах кода определение перечисления все равно должно находиться в SETTINGS.h, а не в SETTINGS.cpp.
2. Недостаток: Я не совсем разбираюсь в указателях и ссылках. В Serial.println в main.cpp сообщение об ошибке компилятора для pubTopicStruct в этой строке гласит: выражение должно быть указателем на полный тип объекта . А для mqttPubStatus указано: недопустимое использование неполного типа 'struct PubTopicStruct'.
Вместо Enum я могу просто объявить 3 переменные int в .h и определите их в .cpp. Тем не менее, мне приходится добавлять в .h при добавлении темы, что не является общим и мне это не очень нужно. Решение всех остальных проблем может быть простым * ...
С уважением, Рене

Подробнее здесь: https://stackoverflow.com/questions/793 ... -or-struct
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Множественное включение глобальных Settings.h: многомерные массивы, Enum или Struct – C++ [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Множественное включение глобальных Settings.h: многомерные массивы, Enum или Struct – C++ [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Numpy Sort N Dimensional Array, аналогичный списку Pythons Sort
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Polars struct.field(list[str]) возвращает один столбец при работе со списком[Struct]
    Anonymous » » в форуме Python
    0 Ответы
    33 Просмотры
    Последнее сообщение Anonymous
  • Почему struct {u64} быстрее, чем struct {u32, u32}?
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»