Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по C-шным указателям
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
PhX
Программирую под 2812. В библиотеках от TI очень часто встречается следующая конструкция

Код
Module.h
typedef struct module_data {
int in, pastIn ,result; // Persistent data, coefficients etc.
void (*calc)() // Pointer to calculation function
} MODULE;
#define MODULE_DEFAULTS { 0,0,0, (void (*)(Uint32))module_calc }

Module.c
void module_calc(MODULE *p)
{
// compute code
p->result = p->pastIn+p->In;
p->pastIn = p->In;
}


Код
Client.c
MODULE mod = MODULE_DEFAULTS;
void somefunc(void)
{
int foo;
mod.in = 10; // coefficient configuration
mod.calc(&mod);
foo = mod.result; // Use result
}


Спрашивается по какой логике работает компилятор когда указателю типа
void (*calc)()
присваевается
(void (*)(Uint32))module_calc ?
И вообще как можно человеческим языком описать конструкцию:
(void (*)(Uint32))module_calc ?
DRUID3
void (*calc)()
calc - указатель на функцию возвращающую результат типа void, следовательно приравниваюЦЦо указатели

Не работаю с TI - Uint32 - это что, тип как в MSVS или указатель типа?
не уверен, но...
Код
()module_calc;                    //приведение к типу...
void *ptr;                    //отсутствуют данные об размере объекта в памяти
*(void *)module_calc;             //приведение к типу указателя на "никуда"
(void (*)(Uint32))module_calc;       //преобразование типа Uint32 к void *
07.gif ?

Код
#define MODULE_DEFAULTS { 0,0,0, (void (*)(Uint32))module_calc }//по-умолчанию все поля 0, указатель на ф-цию - указатель "в никуда"???
Даже не знаю, память чтоли не выделяется под структуру так. 07.gif

Нечто подобное помню есть в лабах по Bf533 какими-то индусами написанное. Но я блин VDSP++ уже больше года не открывал.
aaarrr
(void (*)(Uint32))module_calc; - это приведение module_calc к указателю на функцию типа void func(Uint32 arg).
DRUID3
Цитата(aaarrr @ Mar 23 2008, 22:35) *
(void (*)(Uint32))module_calc; - это приведение module_calc к указателю на функцию типа void func(Uint32 arg).

smile3046.gif точно!
PhX
Цитата(aaarrr @ Mar 24 2008, 00:35) *
(void (*)(Uint32))module_calc; - это приведение module_calc к указателю на функцию типа void func(Uint32 arg).


Ага! Вот теперь это понятно. А почему компилятор не ругается когда указателю на функцию
void calc()
присваивают указатель
на функцию типа void func(Uint32 arg)?
aaarrr
Потому что при приведении указателя на функцию можно задавать другие типы аргументов.
PhX
Цитата(aaarrr @ Mar 25 2008, 12:45) *
Потому что при приведении указателя на функцию можно задавать другие типы аргументов.

Не совсем Вас понял crying.gif, не могли бы Вы разъяснить поподробнее.
aaarrr
Пример:
Код
int foo(void)
{
    return 1;
}

int main(void)
{
    int (*f)();

    f = (char (*)())foo;          // На это компилятор выругается, т.к. не соответствуют типы возвращаемого значения
    f = (int (*)(int, int))foo;   // А на это - нет, аргументы могут меняться
}
PhX
БОЛЬШОЕ спасибо Вам многоуважаемый aaarrr, теперь мне все ясно!!! 08.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.