Форум проекта "Минилаб-Мастер"
Клуб по интересам - отдыхаем от фотобизнеса => Программирование => Тема начата: Andy от 24 Апреля 2014, 03:03:09
-
Есть функция, например печатающая время, в которую передаются минуты через указатель:
void print_time (uint16_t *minutes);
Есть, например, диспетчер задач, запускающий функцию на через какое-то время через указатель:
extern unsigned int QueueDelay(void (*TaskPtr)(), unsigned int Ticks);
Запуск функций без параметров происходит отлично:
QueueDelay(Set_hour_min,500);
Но как передать туда функцию с параметрами? Так не работает, выдает ошибку:
QueueDelay(print_time (&min_alarm),500);
-
@ Andy
В QueueDelay передается указатель на функцию, а не сама функция. Аргументы этой функции надо передать отдельно. То есть QueueDelay должна иметь вид:
extern unsigned int QueueDelay(void (*TaskPtr)(uint16_t *minutes), unsigned int Ticks, uint16_t *minutes)
{
// blah-blah
TaskPtr(minutes);
// blah-blah
}
А когда ты пишешь QueueDelay(print_time (&min_alarm),500);
сначала выполняется print_time (&min_alarm), и возвращенное им значение подставляется в первый аргумент. То есть что-то вроде этого (на минутку забудем, что там void):
someresult = print_time (&min_alarm);
QueueDelay(someresult,500);
-
Опять же можно ли в такую функцию
extern unsigned int QueueDelay(void (*TaskPtr)(uint16_t *minutes), unsigned int Ticks, uint16_t *minutes)
НЕ передавать параметр *minutes? В диспетчер надо будет передавать разные функции....
Или не парится и оборачивать функции с параментрами в функции без параметров - типа:
void print_time (uint16_t *minutes);
void alarm_print_time (void);
void alarm_print_time (void){
print_time(&min_alarm);
}
QueueDelay(alarm_print_time, 500);
?
-
@ Andy
Приведи все Callback-функции к единому виду по аргументам и возвращаемым значениям, даже если не будешь использовать. Обертки - это по сути то же самое.
void print_time (uint16_t* pminutes)
{
printf("Minutes are: %d\\n", *pminutes);
}
void print_none(uint16_t* zzz)
{
printf("Minutes are: None\\n");
}
unsigned int QueueDelay2(void (*TaskPtr)(uint16_t*), unsigned int Ticks, uint16_t* pminutes)
{
TaskPtr(pminutes);
return 0;
}
int main(int argc, char *argv[])
{
uint16_t min = 123;
QueueDelay2(print_time, 500, &min);
QueueDelay2(print_none, 500, NULL);
return 0;
}
-
А не улетит ли функция по нулевому указателю на ресет? NULL - это ноль, не?
Да и весь код чужой переписывать придется - там эти функции как переходящий флвг между другими функциями гуляют - выстрелить в ногу проще простого, пока я не монстр в указателями, остановлюсь на обертке,
Спасибо!
-
А не улетит ли функция по нулевому указателю на ресет? NULL - это ноль, не?
Не улетит. print_time вызывается с ормальным значением, а print_none с NULL (можно что угодно сюда воткнуть), так как всё равно не использует его внутри себя.
Да и весь код чужой переписывать придется - там эти функции как переходящий флвг между другими функциями гуляют - выстрелить в ногу проще простого, пока я не монстр в указателями, остановлюсь на обертке,
Ну тогда лучше обернуть, раз куча унаследованного кода.
-
Ок, спасибо!