|
Поиск по массиву в compile time на С |
|
|
|
May 3 2018, 11:54
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Есть массив регистров, ссылки на переменные с именами и некоторыми параметрами, для удобного доступа по разным интерфейсам и конфигурирования устройства. Допустим вот так объявленный, Код typedef struct {
const char *sym;
const char *fmt; int mode;
union {
float *f; int *i; } link;
void (* proc) (const void *reg, void *lval, const void *rval); } reg_t;
#define REG_E(link, extra, unit, fmt, mode, proc) { #link extra "\0" unit, fmt, mode, \ { (void *) &link }, (void *) proc }
#define REG(link, unit, fmt, mode, proc) REG_E(link, "", unit, fmt, mode, proc)
const reg_t regfile[] = {
REG(hal.USART_baud_rate, "", "%i", REG_CONFIG, NULL), REG(hal.PWM_freq_hz, "Hz", "%i", REG_CONFIG, NULL), REG(hal.PWM_dead_time_ns, "ns", "%i", REG_CONFIG, NULL), REG(hal.ADC_reference_voltage, "V", "%3f", REG_CONFIG, NULL), REG(hal.ADC_current_shunt_resistance, "Ohm", "%4e", REG_CONFIG, NULL), ... REG(pm.probe_speed_ramp, "rad/s", "%2f", REG_CONFIG, NULL), REG_E(pm.probe_speed_ramp, "_rpm", "rpm", "%2f", REG_NORMAL, ®_proc_rpm), ... Регистры адресуются по именам или по номерам. Имена достаточно постоянны, а номера могут изменяться в следующих версиях. В этом проблема, нельзя в коде просто взять ссылку на регистр по номеру regfile[n], номер может измениться. Искать по имени в compile time слишком сложно, средствами C и препроцессора не обойтись. По адресам переменных нельзя, они могут повторятся. Какие еще варианты? Сейчас думаю, генерировать из объявления массив макросов вида #define REG_hal_USART_baud_rate 0, но здесь тоже много проблем, надо как-то "спасать" недопустимые символы (точка и др.). Да можно обратится к переменным напрямую, но в некоторых случаях надо например сделать вывод значений, а в этом массиве регистров уже есть информация о том как это сделать для данного параметра. Не хочется дублировать одно и тоже в разным местах. Спасибо.
|
|
|
|
|
 |
Ответов
|
Aug 13 2018, 19:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(DASM @ Aug 13 2018, 22:39)  Гы, const struct а тут мы возвращаемся к вопросу их инициализации, который вы почему то сочли непонятным static const struct это к кому относится? Разве что делать отдельный namespace как вариант ? Иначе также самая нелюбимая вами глобальная переменная. Глобальная в одном файле - все равно не отмазка. Command - НЕ глобальная переменная, а статическая константа, которую, кстати, надо будет сделать constexpr.... Вообще, в данном примере показан бут-загручик (!) в одном из старых проектов, а эта структура Command используется прямо внутри соотв. cpp файла. Сам набор эти команд (Command) имеет смысл делать видимым только внутри этого модуля (в данном случае он называется Communication). Чтобы не загромождать соотв hpp файл никому не нужным снаружи этим набором команд, то они просто добавлены внутри соотв. cpp файла и им приписано static. По сути эта const struct - замена enum, видимая только внутри cpp файла, но позволяющая более легко читать текст, благодаря разбиения на поля и подструктуры. Впрочем, в данный момент, глядя на эти исходники, некоторые мелочи я бы сделал иначе. ... Но суть не в этом, а в том, что пример я привел для того, чтобы показать как можно обойтись без enion вообще.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
Сообщений в этой теме
amaora Поиск по массиву в compile time на С May 3 2018, 11:54 Kabdim А зачем так сделано? Выглядит как кусок для внешне... May 3 2018, 12:09 Forger Масло-масляное.
Ваш некий реестр (я так понял по н... May 3 2018, 12:15 x736C Цитата(Forger @ May 3 2018, 15:15) зы. А ... May 3 2018, 14:01  Forger Цитата(x736C @ May 3 2018, 17:01) Как при... May 3 2018, 14:42 jcxz Цитата(Forger @ May 3 2018, 15:15) В свои... May 5 2018, 09:33  Forger Цитата(jcxz @ May 5 2018, 12:33) Лучше ра... May 5 2018, 10:26   jcxz Цитата(Forger @ May 5 2018, 13:26) К тому... May 5 2018, 11:02    Forger Цитата(jcxz @ May 5 2018, 14:02) Вобщем -... May 5 2018, 14:50 amaora Параметры не константные, все разные, есть настрой... May 3 2018, 13:16 Kabdim А точка в ваших определениях регистров всегда буде... May 3 2018, 13:40 amaora Функции доступа я тоже мог бы написать, но в этом ... May 5 2018, 08:15 amaora Вот так сделал
Кодcat regfile.c | sed -n ... Aug 11 2018, 18:54 Arlleex Цитата(amaora @ Aug 11 2018, 21:54) Вот т... Aug 12 2018, 07:00 amaora Ну, здесь я обычно не задаю вопросов по своей осно... Aug 12 2018, 16:52 Nixon Для доступа по индексу можно так сделать
Кодenum V... Aug 13 2018, 13:58 Forger Цитата(Nixon @ Aug 13 2018, 16:58) Для до... Aug 13 2018, 14:51 DASM Вот чтобы не плодить тем, возник вопрос. Есть стру... Aug 13 2018, 17:36 Forger Цитата(DASM @ Aug 13 2018, 20:11) ...
Пыт... Aug 13 2018, 17:39 Сергей Борщ QUOTE (DASM @ Aug 13 2018, 20:36) max_enu... Aug 13 2018, 18:31  DASM Цитата(Сергей Борщ @ Aug 13 2018, 21:31) ... Aug 13 2018, 18:37   Forger Цитата(DASM @ Aug 13 2018, 21:37) Но как ... Aug 13 2018, 18:39   Сергей Борщ QUOTE (DASM @ Aug 13 2018, 21:37) да оно ... Aug 13 2018, 19:47    DASM Цитата(Сергей Борщ @ Aug 13 2018, 22:47) ... Aug 13 2018, 20:08     Forger Цитата(DASM @ Aug 13 2018, 23:08) Можно с... Aug 13 2018, 20:17     Сергей Борщ QUOTE (DASM @ Aug 13 2018, 23:08) Выше вы... Aug 13 2018, 22:49      DASM Цитата(Сергей Борщ @ Aug 14 2018, 01:49) ... Aug 14 2018, 02:53      Nixon Цитата(Сергей Борщ @ Aug 14 2018, 01:49) ... Aug 14 2018, 06:14       DASM Цитата(Nixon @ Aug 14 2018, 09:14) Не обя... Aug 14 2018, 06:18        Nixon Цитата(DASM @ Aug 14 2018, 09:18) О, кста... Aug 14 2018, 06:24 DASM А наоборот как ?
Кодtypedef enum {t1, t2, t3 = ... Aug 13 2018, 18:15 Forger По-ходу я ошибся с явным указанием типа enum, у ме... Aug 13 2018, 18:25  DASM Цитата(Forger @ Aug 13 2018, 21:25) По-хо... Aug 13 2018, 18:43   Forger Цитата(DASM @ Aug 13 2018, 21:43) А вот т... Aug 13 2018, 19:28 Nixon Может ещё кому полезно будет:
В анонимных структу... Aug 13 2018, 20:31 Forger Цитата(Nixon @ Aug 13 2018, 23:31) Наприм... Aug 13 2018, 20:37 Nixon Я без привязки к вашему примеру. Просто довольно п... Aug 13 2018, 20:49 Forger Цитата(Nixon @ Aug 13 2018, 23:49) Просто... Aug 13 2018, 20:51 DASM Вот нашел ответ, как удобно пользовать enum class.... Aug 14 2018, 05:53 Kabdim По факту тип указанный в энуме, года 3 назад работ... Aug 14 2018, 06:32 DASM Да, лучше. Но пока не знал об этом - много писанин... Aug 14 2018, 06:34 Kabdim Цитата(DASM @ Aug 14 2018, 09:34) "3... Aug 14 2018, 06:49 Nixon В стандарте то стандарте, но не совсем "С... Aug 14 2018, 06:39 DASM Цитата(Nixon @ Aug 14 2018, 09:39) В стан... Aug 14 2018, 07:10  Kabdim Цитата(DASM @ Aug 14 2018, 10:10) это как... Aug 14 2018, 07:17 DASM Цитатаtypedef enum { tst, tst2, tst3 } test;
#pra... Aug 16 2018, 06:32 Kabdim Цитата(DASM @ Aug 16 2018, 09:32) А что т... Aug 16 2018, 14:29  DASM Цитата(Kabdim @ Aug 16 2018, 17:29) А чег... Aug 16 2018, 14:41   Forger После sizeof ( некого enum ), недалеко и до sizeof... Aug 16 2018, 14:56    DASM Цитата(Forger @ Aug 16 2018, 17:56) После... Aug 16 2018, 15:09     Forger Цитата(DASM @ Aug 16 2018, 18:09) А все ж... Aug 16 2018, 15:13   Kabdim Цитата(DASM @ Aug 16 2018, 17:41) Просто ... Aug 17 2018, 10:39    Arlleex Цитата(Kabdim @ Aug 17 2018, 14:39) Как э... Aug 17 2018, 10:54    DASM Цитата(Kabdim @ Aug 17 2018, 13:39) Как э... Aug 17 2018, 12:04     Forger Цитата(DASM @ Aug 17 2018, 15:04) offseto... Aug 17 2018, 12:23     Kabdim Применительно к этой ситуации, как раз Кейл - непр... Aug 17 2018, 12:45 sigmaN Извиняюсь, если это уже предлагали(не читал все со... Aug 17 2018, 08:08 Kabdim Я не вижу. Вопрос был DASM'у цитата к которой ... Aug 17 2018, 11:51 sigmaN From Standard C++ 7.2/5:
ЦитатаThe underlying type... Aug 19 2018, 06:25 DASM Да ладно, фиг с ним. Aug 19 2018, 20:41
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|