реклама на сайте
подробности

 
 
> Поиск по массиву в compile time на С
amaora
сообщение May 3 2018, 11:54
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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, &reg_proc_rpm),
...


Регистры адресуются по именам или по номерам. Имена достаточно постоянны, а номера могут изменяться в следующих версиях. В этом проблема, нельзя в коде просто взять ссылку на регистр по номеру regfile[n], номер может измениться. Искать по имени в compile time слишком сложно, средствами C и препроцессора не обойтись. По адресам переменных нельзя, они могут повторятся. Какие еще варианты?

Сейчас думаю, генерировать из объявления массив макросов вида #define REG_hal_USART_baud_rate 0, но здесь тоже много проблем, надо как-то "спасать" недопустимые символы (точка и др.).

Да можно обратится к переменным напрямую, но в некоторых случаях надо например сделать вывод значений, а в этом массиве регистров уже есть информация о том как это сделать для данного параметра. Не хочется дублировать одно и тоже в разным местах.

Спасибо.


Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - DASM   Гы, const struct а тут мы возвращаемся к вопросу и...   Aug 13 2018, 19:39
|- - Forger   Цитата(DASM @ Aug 13 2018, 22:39) Гы, con...   Aug 13 2018, 19:49
- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th June 2025 - 04:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016