Прежде всего, извините за заумное название моего вопроса, но я не смог найти лучшего. Позвольте мне объяснить мою проблему, что, очевидно, очень распространено, но я удивительно обнаружил очень мало информации и практики дизайна в Интернете (это потому, что я не смог правильно смотреть из -за отсутствия надлежащей терминологии? Может очень хорошо). Представьте, что у меня есть такая структура с кучей параметров различных типов. : < /p>
struct MyParam
{
uint16_t param_1;
uint16_t param_2;
int param_3;
bool param_4;
};
< /code>
И я хочу создать таблицу для определения каждого параметра этой структуры с именем, аббревиатурой, минимальным, максимум и значением по умолчанию и функцией визуализации. Что -то, что выглядит так: < /p>
struct MyParamDef
{
char[5] acronym;
TXT_ID name; //TXT_ID is an enum which refers to a table with the name of the param
Type type; //enum for the type of my params
uint16_t offset;
int min;
int max;
int default;
bool (*rutvis)(const MyParam&);
};
< /code>
и таблица может выглядеть так: < /p>
MyParamDef myTable[NB_OF_PARAMS] =
{
"ACR1", TXT_NAME_1, Type::UINT16_T, offsetof(MyParam, param_1) , 0 , 10, 5, nullptr,
"ACR2", TXT_NAME_2, Type::UINT16_T, offsetof(MyParam, param_2) , 0 , 10, 5, nullptr,
"ACR3", TXT_NAME_3, Type::INT , offsetof(MyParam, param_3) , -10, 10, 5, nullptr,
"ACR4", TXT_NAME_4, Type::BOOL , offsetof(MyParam, param_4) , 0 , 1 , 0, nullptr,
};
< /code>
Это текущий подход, который я использую, который я нахожу довольно уродливым, потому что нет никакого способа гарантировать, что тип в таблице фактически соответствует реальному типу, используемому в структуре. Если Param_1 становится Bool, моя таблица по -прежнему считает, что это uint16_t… Я пытался использовать метапрограммирование шаблонов, чтобы гарантировать, что тип соответствует реальному типу с некоторым успехом, но мне не очень нравится, потому что сообщение об ошибке компилятора довольно расплывчато И даже не специфично таблицу, где она терпит неудачу (все еще лучше, чем сбой во время выполнения…). Мое решение заключается в использовании функции для заполнения типа и смещения и должно быть вызвано во время фазы инициирования, которую мне тоже не нравится… (хотелось бы создать таблицу ContexPR с контейкспр FCT, но OFC foftssetof () не может быть constexpr…) < /p>
Кроме того, такой подход заставляет меня управлять всем Соответствующий mytable, который я нахожу довольно опасным решением, если честно, особенно с пользовательскими типами, где я иногда делаю простой переосмысление_КАСА int… может ли использование союза со всеми типами быть лучше? Или, может быть, вариант std :: теперь, когда C ++ 17 вышел, но тогда он может значительно увеличить размер таблицы (который может иметь сотни параметров, и я работаю для микроконтроллера с ограниченным пространством…)
Использование Offset () тоже не очень рекомендуется, поскольку это может привести ко всем некрасивым сбоям памяти ... но каковы альтернативы? Каково современное способ сделать это? Должно быть некоторые, так как это проблема, который должен столкнуться с каждым проектом программирования ... Используя указатель void* вместо смещения? Не очень лучше ... и как вы работаете с двумя разными структурами параметров с той же таблицей определения? Вы не можете ... указатели на участника? Такая же проблема, что и с указателем, плюс создание таблицы определения становится головной болью, и это не может быть простой std :: массив, но должен быть кортеж или, может быть, std :: массив std :: variant, но это все труднее… < /p>
Итак, как вы обычно подходите к этой проблеме? < /p>
Я уверен Я действительно любопытно узнать, как другие программисты решают эту проблему! Я уже давно думал об этом, и ни одно решение меня полностью не удовлетворяет ...
Подробнее здесь: https://stackoverflow.com/questions/794 ... definition
Практика дизайна для создания определения таблицы параметров ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1738685793
Anonymous
Прежде всего, извините за заумное название моего вопроса, но я не смог найти лучшего. Позвольте мне объяснить мою проблему, что, очевидно, очень распространено, но я удивительно обнаружил очень мало информации и практики дизайна в Интернете (это потому, что я не смог правильно смотреть из -за отсутствия надлежащей терминологии? Может очень хорошо). Представьте, что у меня есть такая структура с кучей параметров различных типов. : < /p>
struct MyParam
{
uint16_t param_1;
uint16_t param_2;
int param_3;
bool param_4;
};
< /code>
И я хочу создать таблицу для определения каждого параметра этой структуры с именем, аббревиатурой, минимальным, максимум и значением по умолчанию и функцией визуализации. Что -то, что выглядит так: < /p>
struct MyParamDef
{
char[5] acronym;
TXT_ID name; //TXT_ID is an enum which refers to a table with the name of the param
Type type; //enum for the type of my params
uint16_t offset;
int min;
int max;
int default;
bool (*rutvis)(const MyParam&);
};
< /code>
и таблица может выглядеть так: < /p>
MyParamDef myTable[NB_OF_PARAMS] =
{
"ACR1", TXT_NAME_1, Type::UINT16_T, offsetof(MyParam, param_1) , 0 , 10, 5, nullptr,
"ACR2", TXT_NAME_2, Type::UINT16_T, offsetof(MyParam, param_2) , 0 , 10, 5, nullptr,
"ACR3", TXT_NAME_3, Type::INT , offsetof(MyParam, param_3) , -10, 10, 5, nullptr,
"ACR4", TXT_NAME_4, Type::BOOL , offsetof(MyParam, param_4) , 0 , 1 , 0, nullptr,
};
< /code>
Это текущий подход, который я использую, который я нахожу довольно уродливым, потому что нет никакого способа гарантировать, что тип в таблице фактически соответствует реальному типу, используемому в структуре. Если Param_1 становится Bool, моя таблица по -прежнему считает, что это uint16_t… Я пытался использовать метапрограммирование шаблонов, чтобы гарантировать, что тип соответствует реальному типу с некоторым успехом, но мне не очень нравится, потому что сообщение об ошибке компилятора довольно расплывчато И даже не специфично таблицу, где она терпит неудачу (все еще лучше, чем сбой во время выполнения…). Мое решение заключается в использовании функции для заполнения типа и смещения и должно быть вызвано во время фазы инициирования, которую мне тоже не нравится… (хотелось бы создать таблицу ContexPR с контейкспр FCT, но OFC foftssetof () не может быть constexpr…) < /p>
Кроме того, такой подход заставляет меня управлять всем Соответствующий mytable, который я нахожу довольно опасным решением, если честно, особенно с пользовательскими типами, где я иногда делаю простой переосмысление_КАСА int… может ли использование союза со всеми типами быть лучше? Или, может быть, вариант std :: теперь, когда C ++ 17 вышел, но тогда он может значительно увеличить размер таблицы (который может иметь сотни параметров, и я работаю для микроконтроллера с ограниченным пространством…)
Использование Offset () тоже не очень рекомендуется, поскольку это может привести ко всем некрасивым сбоям памяти ... но каковы альтернативы? Каково современное способ сделать это? Должно быть некоторые, так как это проблема, который должен столкнуться с каждым проектом программирования ... Используя указатель void* вместо смещения? Не очень лучше ... и как вы работаете с двумя разными структурами параметров с той же таблицей определения? Вы не можете ... указатели на участника? Такая же проблема, что и с указателем, плюс создание таблицы определения становится головной болью, и это не может быть простой std :: массив, но должен быть кортеж или, может быть, std :: массив std :: variant, но это все труднее… < /p>
Итак, как вы обычно подходите к этой проблеме? < /p>
Я уверен Я действительно любопытно узнать, как другие программисты решают эту проблему! Я уже давно думал об этом, и ни одно решение меня полностью не удовлетворяет ...
Подробнее здесь: [url]https://stackoverflow.com/questions/79412356/design-practice-to-create-a-table-of-parameters-definition[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия