Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызов разных функций с разными праметрами через указатель
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Alla_student
Подскажите пожалуйста -

Возможен, ли, вызов разных функций с разными праметрами через указатель?
Язык СИ (Keil)?
Если да, то как лучше реализовать (желательно с примером).

Я хотела вызывать различные функции через функцию указатель и различными параметрами, которые могут меняться (время события, состояние и т.д.) и передавать вызываемой функции.

Заранее спасибо.
smalcom
Можно, но через приведение типа. Пример:
Код
#include <stdio.h>

void func1()
{
    printf("func1\n");
}

int func2(int pVal)
{
    printf("func2(%i)\n", pVal);
    
    return pVal;
}

int main()
{
typedef void(*func1_type)();
typedef int(*func2_type)(int);

void* func_ptr;

    printf("call1\n");
    func_ptr = (void*)func1;
    ((func1_type)func_ptr)();

    printf("call2\n");
    func_ptr = (void*)func2;
    ((func2_type)func_ptr)(3);

    printf("end\n");

    return 0;
}


Вывод
Цитата
call1
func1
call2
func2(3)
end

-------------------
а если вам надо во время выполнения определять функцию какого типа вызвать, то лучше перейти на C++, там есть средства для этого.
CrimsonPig
Цитата(Alla_student @ Oct 9 2015, 09:54) *
Возможен, ли, вызов разных функций с разными праметрами через указатель?
Если да, то как лучше реализовать (желательно с примером).

Я хотела вызывать различные функции через функцию указатель и различными параметрами, которые могут меняться (время события, состояние и т.д.) и передавать вызываемой функции.


Слишком общий вопрос. На С можно сделать вообще все, включая аналоги виртуальных функций и DCOM sm.gif Вопрос в цене реализации и понятии, нужно ли оно вообще.
"Различные параметры" - что означает в данном контексте ? Одинаковый набор различных значений ? Если так, то сигнатуры функций будут одними и тееми же. Вызывайте их через указатель одного типа и все.
Если наборы параметров разные, но похожие, то можно их все запихать в структуру и передавать эту структуру в функции по указателю. В этом случае сигнатуры функций тоже будут одинаковыми..

E.g:
CODE

struct TParamStruct
{
uint32 param1;
uint32 param3;
uint8 param4;
const char* pMsg;
};

typedef void (TMyFoo*) (TParamStruct*);

TMyFoo pFoo1;
TMyFoo pFoo2;

TParamStruct params1 = {...};
TParamStruct params2 = {...};

pFoo1(params1);
pFoo2(params1);
pFoo1(params2);



Alla_student
Цитата(CrimsonPig @ Oct 10 2015, 12:41) *
...
Если наборы параметров разные, но похожие, то можно их все запихать в структуру и передавать эту структуру в функции по указателю. В этом случае сигнатуры функций тоже будут одинаковыми..


Спасибо, вызов одного из полей структуры - парметров в зависимости от функции, подходящий вариант.
ViKo
Цитата(Alla_student @ Oct 13 2015, 17:22) *
Спасибо, вызов одного из полей структуры - парметров в зависимости от функции, подходящий вариант.

Только это не поля, а члены. rolleyes.gif
sigmaN
Цитата
не поля, а члены.
ну да, members ))))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.