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

 
 
> Вызов разных функций с разными праметрами через указатель, Возможно ли такое в СИ?
Alla_student
сообщение Oct 9 2015, 08:54
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



Подскажите пожалуйста -

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

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

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
smalcom
сообщение Oct 9 2015, 10:09
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



Можно, но через приведение типа. Пример:
Код
#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++, там есть средства для этого.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Oct 10 2015, 09:41
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



Цитата(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);



Go to the top of the page
 
+Quote Post
Alla_student
сообщение Oct 13 2015, 14:22
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 5-04-11
Пользователь №: 64 146



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


Спасибо, вызов одного из полей структуры - парметров в зависимости от функции, подходящий вариант.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 13 2015, 17:22
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

Только это не поля, а члены. rolleyes.gif
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 14 2015, 20:39
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



Цитата
не поля, а члены.
ну да, members ))))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

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

 


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


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