Перейти к содержанию
    

Вызов разных функций с разными праметрами через указатель

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

 

Возможен, ли, вызов разных функций с разными праметрами через указатель?

Язык СИ (Keil)?

Если да, то как лучше реализовать (желательно с примером).

 

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

 

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно, но через приведение типа. Пример:

#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++, там есть средства для этого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможен, ли, вызов разных функций с разными праметрами через указатель?

Если да, то как лучше реализовать (желательно с примером).

 

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

 

Слишком общий вопрос. На С можно сделать вообще все, включая аналоги виртуальных функций и DCOM :) Вопрос в цене реализации и понятии, нужно ли оно вообще.

"Различные параметры" - что означает в данном контексте ? Одинаковый набор различных значений ? Если так, то сигнатуры функций будут одними и тееми же. Вызывайте их через указатель одного типа и все.

Если наборы параметров разные, но похожие, то можно их все запихать в структуру и передавать эту структуру в функции по указателю. В этом случае сигнатуры функций тоже будут одинаковыми..

 

E.g:

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);


 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Если наборы параметров разные, но похожие, то можно их все запихать в структуру и передавать эту структуру в функции по указателю. В этом случае сигнатуры функций тоже будут одинаковыми..

 

Спасибо, вызов одного из полей структуры - парметров в зависимости от функции, подходящий вариант.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, вызов одного из полей структуры - парметров в зависимости от функции, подходящий вариант.

Только это не поля, а члены. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...