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

 
 
> Вопрос по C-шным указателям
PhX
сообщение Mar 23 2008, 18:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Программирую под 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 ?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
DRUID3
сообщение Mar 23 2008, 20:11
Сообщение #2


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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++ уже больше года не открывал.


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 23 2008, 20:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



(void (*)(Uint32))module_calc; - это приведение module_calc к указателю на функцию типа void func(Uint32 arg).
Go to the top of the page
 
+Quote Post
DRUID3
сообщение Mar 23 2008, 21:14
Сообщение #4


山伏
*****

Группа: Свой
Сообщений: 1 827
Регистрация: 3-08-06
Из: Kyyiv
Пользователь №: 19 294



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

smile3046.gif точно!


--------------------
Нас помнят пока мы мешаем другим...
//--------------------------------------------------------
Хороший блатной - мертвый...
//--------------------------------------------------------
Нет старик, это те дроиды которых я ищу...
Go to the top of the page
 
+Quote Post
PhX
сообщение Mar 25 2008, 05:25
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



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


Ага! Вот теперь это понятно. А почему компилятор не ругается когда указателю на функцию
void calc()
присваивают указатель
на функцию типа void func(Uint32 arg)?


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 25 2008, 08:45
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Потому что при приведении указателя на функцию можно задавать другие типы аргументов.
Go to the top of the page
 
+Quote Post
PhX
сообщение Mar 25 2008, 09:59
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



Цитата(aaarrr @ Mar 25 2008, 12:45) *
Потому что при приведении указателя на функцию можно задавать другие типы аргументов.

Не совсем Вас понял crying.gif, не могли бы Вы разъяснить поподробнее.

Сообщение отредактировал PhX - Mar 25 2008, 09:59


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 25 2008, 10:16
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Пример:
Код
int foo(void)
{
    return 1;
}

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

    f = (char (*)())foo;          // На это компилятор выругается, т.к. не соответствуют типы возвращаемого значения
    f = (int (*)(int, int))foo;   // А на это - нет, аргументы могут меняться
}
Go to the top of the page
 
+Quote Post
PhX
сообщение Mar 25 2008, 13:04
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249



БОЛЬШОЕ спасибо Вам многоуважаемый aaarrr, теперь мне все ясно!!! 08.gif

Сообщение отредактировал PhX - Mar 25 2008, 13:16


--------------------
Если все, то не я...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 18:01
Рейтинг@Mail.ru


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