|
|
  |
Массив указателей на функции. Need help. |
|
|
|
Dec 26 2006, 13:07
|
Группа: Новичок
Сообщений: 6
Регистрация: 3-05-05
Из: Ufa
Пользователь №: 4 692

|
Добрый день! Стоит следующая задача: есть некоторое количество функций func00, func01, ... , funcN. В зависимости от значения переменной необходимо вызвать либо func00, либо func01, и т.д. Причем городить конструкцию switch-case очень не хочется (условий получится больше 100). Попробовал создать массив указателей на функции, следующим образом: Код void func00(void) { printf("func00"); }
void func01(void) { printf("func01"); }
void test(void) { void *func(); int ptrs[2]; char x;
ptrs[0] = (int)func00; ptrs[1] = (int)func01;
// пытаемся присвоить func() указатель на нужную функцию x = 0; func = (void*)ptrs[x];
// вызов функци func();
} При компиляции для строчки func = (void*)ptrs[x] выдается вполне ожидаемая ошибка - Error[Pe137]: expression must be a modifiable lvalue. Что делать?
|
|
|
|
|
Dec 26 2006, 13:23
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(leo@intek @ Dec 26 2006, 17:07)  Добрый день! Стоит следующая задача: есть некоторое количество функций func00, func01, ... , funcN. В зависимости от значения переменной необходимо вызвать либо func00, либо func01, и т.д. Причем городить конструкцию switch-case очень не хочется (условий получится больше 100). Что делать?  не парьтесь, в Вашем случае ИАР сам сотворит такую таблицу, как раз, если Вы будете использовать switch-case
--------------------
|
|
|
|
|
Dec 26 2006, 13:26
|
Местный
  
Группа: Участник
Сообщений: 416
Регистрация: 18-04-06
Из: Челябинск
Пользователь №: 16 219

|
Цитата(leo@intek @ Dec 26 2006, 13:07)  Добрый день! Стоит следующая задача: есть некоторое количество функций func00, func01, ... , funcN. В зависимости от значения переменной необходимо вызвать либо func00, либо func01, и т.д. Причем городить конструкцию switch-case очень не хочется (условий получится больше 100). Попробовал создать массив указателей на функции, следующим образом: Код void func00(void) { printf("func00"); }
void func01(void) { printf("func01"); }
void test(void) { void *func(); int ptrs[2]; char x;
ptrs[0] = (int)func00; ptrs[1] = (int)func01;
// пытаемся присвоить func() указатель на нужную функцию x = 0; func = (void*)ptrs[x];
// вызов функци func();
} При компиляции для строчки func = (void*)ptrs[x] выдается вполне ожидаемая ошибка - Error[Pe137]: expression must be a modifiable lvalue. Что делать?  void *func(); - это прототип функции. Указатель объявляется как void (* func)(); Вызов соответственно будет (*func)();
|
|
|
|
|
Dec 26 2006, 14:07
|
Группа: Новичок
Сообщений: 6
Регистрация: 3-05-05
Из: Ufa
Пользователь №: 4 692

|
Спасибо всем откликнувшимся! Соорудил вот такой код: Код void func00(void) { printf("func00\r\n"); }
void func01(void) { printf("func01\r\n"); }
int __flash ptrs[2] = {(int)func00, (int)func01};
void test(void) { ((void (*)())ptrs[0])(); ((void (*)())ptrs[1])(); } В симуляторе работает. Вот только, не понятно, каким образом IAR на этапе компиляции знает адреса функций func00, func01 во __flash...
|
|
|
|
|
Dec 26 2006, 16:22
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(leo@intek @ Dec 26 2006, 13:07)  Соорудил вот такой код: А зачем вы делаете принудительное приведение указателя к типу int? Во-первых это требует лишней писанины, во-вторых ограничиваете указатель размером int (непереносимость), но главное - вы подавляете возможность компилятора отлавливать ошибки несоответствия типов: Код void func00(void) { printf("func00\r\n"); }
void func01(void) { printf("func01\r\n"); }
typedef void (*pfunc_t)(void);
pfunc_t __flash ptrs[2] = {func00, func01};
void test(void) { ptrs[0](); ptrs[1](); }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|