Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Есть два варианта. В обеих порядок определяется ТОЛЬКО enum-ом (+)

Отправлено ReAl 12 марта 2008 г. 10:58
В ответ на: СИ, массив функций, привязка дефайнов к номеру функции в массиве отправлено <font color=gray>mandigit</font> 11 марта 2008 г. 22:05

Раз уж в таблицу всё равно вносится номер - функции в таблице можно держать не по порядку, всё равно рядом с указателем на функцию лежит её код.
Лишние можно отсекать до того, как лезть в таблицу.

enum { start, back, left, right, count };

#define TBL_ENTRY(f) { f, do_##f }

typedef struct {
uint8_t prio;
void (*pfunc)(void);
} entry_t;

void do_start(void) { /* и так далее */ }

const entry_t table[count] PROGMEM = {
TBL_ENTRY(start),
TBL_ENTRY(left),
TBL_ENTRY(right),
TBL_ENTRY(back)
};

Ну а дальше проверить номер на превышение count и поиск по таблице.

Вариант 2:
Если функции в таблице размещать по порядку - тогда не нужно в таблице хранить номер. Но тогда компилятор должен поддерживать одну приятную вещь из C99 (и это работает только в С, не в С++)
enum { start, back, left, right, count };

#define TBL_ENTRY(f) [f] = do_##f

void do_start(void) {}
void do_back(void) {}
void do_left(void) {}
void do_right(void) {}

void (*functbl[count])() = {
TBL_ENTRY(right),
TBL_ENTRY(back),
TBL_ENTRY(start),
TBL_ENTRY(left)
};


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 38:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru