Подтвердить что ты не робот

Как вызвать функцию с помощью указателя функции?

Предположим, что у меня есть три функции:

bool A();
bool B();
bool C();

Как я могу вызвать одну из этих функций условно с помощью указателя на функцию и как объявить указатель на функцию?

4b9b3361

Ответ 1

Вы можете сделать следующее: Предположим, что у вас есть функции A, B и C:

bool A()
{
   .....
}

bool B()
{
   .....
}

bool C()
{

 .....
}

Теперь на какой-либо другой функции, скажем, на main:

int main()
{
  bool (*choice) ();

  // now if there is if-else statement for making "choice" to 
  // point at a particular function then proceed as following

  if ( x == 1 )
   choice = A;

  else if ( x == 2 )
   choice = B;


  else
   choice = C;

if(choice())
 printf("Success\n");

else
 printf("Failure\n");

.........
  .........
  }

Помните, что это один из примеров указателя функции. существует несколько других методов и для которых вам нужно четко узнать указатель функции.

Ответ 2

Объявите свой указатель на функцию следующим образом:

bool (*f)();
f = A;
f();

Ответ 3

изначально определяют массив указателей функций, который принимает пустоту и возвращает пустоту. предполагая, что ваша функция принимает пустоту и возвращает пустоту.

typedef void (*func_ptr)(void);

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

func_ptr array_of_fun_ptr[3];

теперь сохраните адрес ваших функций в трех переменных.

array_of_fun_ptr[0]= &A;
array_of_fun_ptr[1]= &B;
array_of_fun_ptr[2]= &C;

теперь вы можете вызвать эту функцию с помощью указателей функций, как показано ниже:

some_a=(*(array_of_fun_ptr[0]))();
some_b=(*(array_of_fun_ptr[1]))();
some_c=(*(array_of_fun_ptr[2]))();

Ответ 4

Я думаю, что ваш вопрос уже ответил более чем адекватно, но было бы полезно указать явно, что с учетом указателя функции

void (*pf)(int foo, int bar);

два вызова

pf(1, 0);
(*pf)(1, 0);

точно эквивалентны по определению. Выбор, который нужно использовать, зависит от вас, хотя хорошая идея быть последовательной. Долгое время я предпочитал (*pf)(1, 0), потому что мне казалось, что он лучше отражает тип pf, однако в последние несколько лет я переключился на pf(1, 0).

Ответ 5

Вы можете объявить указатель функции следующим образом:

bool (funptr*)();

Что говорит, что мы объявляем указатель на функцию, которая ничего не берет и возвращает bool.

Следующее назначение:

funptr = A;

Чтобы вызвать функцию, используя указатель функции:

funptr();

Ответ 6

bool (*FuncPtr)()

FuncPtr = A;
FuncPtr();

Если вы хотите условно назвать одну из этих функций, вам следует использовать массив указателей функций. В этом случае у вас есть 3 элемента, указывающие на A, B и C, и вы вызываете их в зависимости от индекса к массиву, например funcArray0 для A.

Ответ 7

bool (*fptr)();

int main(void)
{
  ...
  ...
  printf("Enter your choice");
  scanf("%d",&a);
  switch(a)
{
  case 0:
         fptr = A;
         break;
  case 1:
         fptr = B;
         break;
  case 2:
         fptr = C;
         break;
  case 3:
          break;
}
(*fptr)();
return 0;
}

ваш выбор сохраняется в a; Затем, соответственно, функции назначаются в указателе функции. Наконец, в зависимости от вашего выбора, ту же самую функцию вызывается, чтобы вернуть желаемый результат.

Ответ 8

Обратите внимание, что когда вы говорите:

bool (*a)();

вы объявляете a типа "указатель на функцию return bool и принимая неопределенное количество параметров". Предполагая, что bool определен (возможно, вы используете C99 и включили stdbool.h, или это может быть typedef), это может быть или не быть тем, что вы хотите.

Проблема заключается в том, что компилятор не может проверить, соответствует ли a правильному значению. Та же проблема существует с вашими объявлениями функций. A(), B() и C() объявляются как функции "return bool и принимают неопределенное количество параметров".

Чтобы увидеть проблемы, которые могут возникнуть, напишите программу:

#include <stdio.h>

int test_zero(void)
{
    return 42;
}

static int test_one(char *data)
{
    return printf("%s\n", data);
}

int main(void)
{
    /* a is of type "pointer to function returning int
       and taking unspecified number of parameters */
    int (*a)();

    /* b is of type "pointer to function returning int
       and taking no parameters */
    int (*b)(void);

    /* This is OK */
    a = test_zero;
    printf("a: %d\n", a());

    a = test_one; /* OK, since compiler doesn't check the parameters */
    printf("a: %d\n", a()); /* oops, wrong number of args */

    /* This is OK too */
    b = test_zero;
    printf("b: %d\n", b());

    /* The compiler now does type checking, and sees that the
       assignment is wrong, so it can warn us */
    b = test_one;
    printf("b: %d\n", b()); /* Wrong again */

    return 0;
}

Когда я скомпилировал выше с помощью gcc, он говорит:

предупреждение: назначение из несовместимого типа указателя

для линии b = test_one;, что хорошо. Для соответствующего присваивания a нет предупреждений.

Итак, вы должны объявить свои функции как:

bool A(void);
bool B(void);
bool C(void);

И тогда переменная для хранения функции должна быть объявлена ​​как:

bool (*choice)(void);

Ответ 9

Лучший способ прочитать это "По часовой стрелке/спиральное правило"

Дэвид Андерсон

http://c-faq.com/decl/spiral.anderson.html

Ответ 10

Вы объявляете переменную указателя функции для данной сигнатуры ваших функций следующим образом:

bool (* fnptr)();

вы можете назначить ему одну из своих функций:

fnptr = A;

и вы можете назвать его:

bool result = fnptr();

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

typdef bool (* BoolFn)();

а затем вы можете использовать это для объявления переменной указателя функции для этого типа:

BoolFn fnptr;

Ответ 11

Немного другой подход:

bool A() {...}
bool B() {...}
bool C() {...}

int main(void)
{
  /**
   * Declare an array of pointers to functions returning bool
   * and initialize with A, B, and C
   */
  bool (*farr[])() = {A, B, C};
  ...
  /**
   * Call A, B, or C based on the value of i
   * (assumes i is in range of array)
   */
  if (farr[i]()) // or (*farr[i])()
  {
    ...
  }
  ...
}

Ответ 12

//Declare the pointer and asign it to the function
bool (*pFunc)() = A;
//Call the function A
pFunc();
//Call function B
pFunc = B;
pFunc();
//Call function C
pFunc = C;
pFunc();

Ответ 13

Я обычно использую typedef для этого, но это может быть чрезмерным, если вам не нужно слишком часто использовать указатель функции.

//assuming bool is available (where I come from it is an enum)

typedef bool (*pmyfun_t)();

pmyfun_t pMyFun;

pMyFun=A; //pMyFun=&A is actually same

pMyFun();

Ответ 14

Это более чем достаточно ответственно, но вы можете найти это полезным: Учебники по указателям функций. Это по-настоящему всеобъемлющее обращение с предметом в пяти главах!

Ответ 15

Если вам нужна помощь с сложными определениями, например:

double (*(*pf)())[3][4];

Взгляните на мое правое правое правило здесь.