leo@intek 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Добрый день! Стоит следующая задача: есть некоторое количество функций 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. Что делать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Добрый день! Стоит следующая задача: есть некоторое количество функций func00, func01, ... , funcN. В зависимости от значения переменной необходимо вызвать либо func00, либо func01, и т.д. Причем городить конструкцию switch-case очень не хочется (условий получится больше 100). Что делать? не парьтесь, в Вашем случае ИАР сам сотворит такую таблицу, как раз, если Вы будете использовать switch-case Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bill 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Добрый день! Стоит следующая задача: есть некоторое количество функций 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)(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Вот так должно работать, только что проверил 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; x = 0; func = (void (*)())ptrs[x]; func(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
leo@intek 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Спасибо всем откликнувшимся! Соорудил вот такой код: 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба В симуляторе работает. Вот только, не понятно, каким образом IAR на этапе компиляции знает адреса функций func00, func01 во __flash... А все оче просто - раз вы вызывете что то по адресу, значит адрес во флэш - по другому быть не может... Но все же рекомендую switch case - доверьтесь компилятору, на крайцний случай проверьте листинг - все будет шоколадно, так как вы хотите - через таблицу векторов функций Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба В симуляторе работает. Вот только, не понятно, каким образом IAR на этапе компиляции знает адреса функций func00, func01 во __flash... На этапе компиляции, - не знает. На этапе линковки - узнаёт и подставляет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 26 декабря, 2006 Опубликовано 26 декабря, 2006 · Жалоба Соорудил вот такой код:А зачем вы делаете принудительное приведение указателя к типу 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](); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться