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

 
 
 
Reply to this topicStart new topic
> Массив указателей на функции. Need help.
leo@intek
сообщение Dec 26 2006, 13:07
Сообщение #1





Группа: Новичок
Сообщений: 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.

Что делать? help.gif
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 26 2006, 13:23
Сообщение #2


Гуру
******

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



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


--------------------
Go to the top of the page
 
+Quote Post
_Bill
сообщение Dec 26 2006, 13:26
Сообщение #3


Местный
***

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

Что делать? help.gif

void *func(); - это прототип функции. Указатель объявляется как void (* func)(); Вызов соответственно будет (*func)();
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 26 2006, 13:39
Сообщение #4


Гуру
******

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



Вот так должно работать, только что проверил

Код
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();
}


--------------------
Go to the top of the page
 
+Quote Post
leo@intek
сообщение Dec 26 2006, 14:07
Сообщение #5





Группа: Новичок
Сообщений: 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...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Dec 26 2006, 14:20
Сообщение #6


Гуру
******

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



Цитата(leo@intek @ Dec 26 2006, 18:07) *
В симуляторе работает. Вот только, не понятно, каким образом IAR на этапе компиляции знает адреса функций func00, func01 во __flash...
А все оче просто - раз вы вызывете что то по адресу, значит адрес во флэш - по другому быть не может...



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


--------------------
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Dec 26 2006, 14:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(leo@intek @ Dec 26 2006, 14:07) *
В симуляторе работает. Вот только, не понятно, каким образом IAR на этапе компиляции знает адреса функций func00, func01 во __flash...


На этапе компиляции, - не знает. На этапе линковки - узнаёт и подставляет.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2006, 16:22
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 22:19
Рейтинг@Mail.ru


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