webentwicklung-frage-antwort-db.com.de

Wie rufe ich die Funktion mit dem Funktionszeiger auf?

Angenommen, ich habe diese drei Funktionen:

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

Wie rufe ich eine dieser Funktionen mit einem Funktionszeiger bedingt auf und wie deklariere ich den Funktionszeiger?

29
Priya

Sie können Folgendes tun: Angenommen, Sie haben die Funktion A, B C wie folgt:

bool A()
{
   .....
}

bool B()
{
   .....
}

bool C()
{

 .....
}

Nun zu einer anderen Funktion, sagen Sie bei 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");

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

Denken Sie daran, dies ist ein Beispiel für einen Funktionszeiger. es gibt mehrere andere methoden und für die muss man den funktionszeiger klar lernen.

35
Abhineet

Deklarieren Sie Ihren Funktionszeiger folgendermaßen:

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

Ich denke, Ihre Frage wurde bereits mehr als ausreichend beantwortet, aber es könnte nützlich sein, ausdrücklich darauf hinzuweisen, dass ein Funktionszeiger gegeben ist

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

die beiden Anrufe

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

sind per definitionem in jeder Hinsicht genau gleichwertig. Die Wahl, welche Sie verwenden, liegt bei Ihnen, obwohl es eine gute Idee ist, konsequent zu sein. Lange Zeit bevorzugte ich (*pf)(1, 0), Weil es mir so schien, als würde es die Art von pf besser widerspiegeln, aber in den letzten Jahren habe ich zu pf(1, 0) gewechselt .

15
Dale Hagglund

definieren Sie zunächst ein Funktionszeiger-Array, das eine Leere annimmt und eine Leere zurückgibt. Annehmen, dass Ihre Funktion eine Leere annimmt und eine Leere zurückgibt.

typedef void (*func_ptr)(void);

jetzt können Sie damit Funktionszeigervariablen solcher Funktionen erstellen. Wie unten:

func_ptr array_of_fun_ptr[3];

speichern Sie nun die Adresse Ihrer Funktionen in den drei Variablen.

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

jetzt können Sie diese Funktion mit den folgenden Funktionszeigern aufrufen:

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

Sie können den Funktionszeiger wie folgt deklarieren:

bool (funptr*)();

Das heißt, wir deklarieren einen Funktionszeiger auf eine Funktion, die nichts annimmt und einen Bool zurückgibt.

Nächste Aufgabe:

funptr = A;

So rufen Sie die Funktion mit dem Funktionszeiger auf:

funptr();
6
codaddict
bool (*FuncPtr)()

FuncPtr = A;
FuncPtr();

Wenn Sie eine dieser Funktionen bedingt aufrufen möchten, sollten Sie ein Array von Funktionszeigern verwenden. In diesem Fall hätten Sie 3 Elemente, die auf A, B und C zeigen, und Sie rufen je nach Index des Arrays eines auf, z. B. funcArray0 für A.

4
Firas Assaad
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;
}

ihre Wahl wird in a gespeichert; Im Funktionszeiger werden dann entsprechend Funktionen zugeordnet. Schließlich wird abhängig von Ihrer Wahl dieselbe Funktion aufgerufen, um das gewünschte Ergebnis zurückzugeben.

2
wrapperm

Der beste Weg, dies zu lesen, ist die "Rechts-/Spiralregel".

Von David Anderson

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

2
Vaysage

Beachten Sie Folgendes, wenn Sie sagen:

bool (*a)();

sie deklarieren a vom Typ "Zeiger auf Funktion, die bool zurückgibt und eine nicht angegebene Anzahl von Parametern verwendet". Angenommen, bool ist definiert (möglicherweise verwenden Sie C99 und haben stdbool.h Eingefügt, oder es ist ein typedef), kann dies das sein, was Sie wollen oder nicht.

Das Problem hierbei ist, dass der Compiler jetzt nicht überprüfen kann, ob a einem korrekten Wert zugewiesen ist. Das gleiche Problem besteht bei Ihren Funktionsdeklarationen. A(), B() und C() werden alle als Funktionen deklariert, die "bool zurückgeben und eine nicht angegebene Anzahl von Parametern annehmen".

Um die möglichen Probleme zu erkennen, schreiben wir ein Programm:

#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;
}

Wenn ich das obige mit gcc kompiliere, heißt es:

warnung: Zuweisung von inkompatiblem Zeigertyp

für die Zeile b = test_one;, was gut ist. Es gibt keine Warnung für die entsprechende Zuordnung zu a.

Deshalb sollten Sie Ihre Funktionen wie folgt deklarieren:

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

Und dann sollte die Variable, die die Funktion enthält, wie folgt deklariert werden:

bool (*choice)(void);
2
Alok Singhal

Wenn Sie Hilfe bei komplexen Definitionen benötigen, wie zum Beispiel:

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

Schauen Sie sich meine Rechts-Links-Regel an hier .

1
Jack

Etwas anderer Ansatz:

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])()
  {
    ...
  }
  ...
}
1
John Bode

Sie deklarieren eine Funktionszeigervariable für die angegebene Signatur Ihrer Funktionen wie folgt:

bool (* fnptr)();

sie können ihm eine Ihrer Funktionen zuweisen:

fnptr = A;

und du kannst es nennen:

bool result = fnptr();

Sie können typedefs verwenden, um einen Typ für jede einzelne benötigte Funktionssignatur zu definieren. Dies erleichtert das Lesen und Verwalten des Codes. d.h. für die Signatur von Funktionen, die bool ohne Argumente zurückgeben, könnte dies sein:

typdef bool (* BoolFn)();

und dann können Sie wie folgt verwenden, um die Funktionszeigervariable für diesen Typ zu deklarieren:

BoolFn fnptr;
1
x4u

Aufrufen einer Funktion durch Funktionszeiger

float add(int , float),result;
int main()
{
 float (*fp)(int,float);
 float result;
 fp=add;
 result=add(5,10.9);      // Normal calling
 printf("%f\n\n",result);

 result=(*fp)(5,10.9);    //calling via function Pointer
 printf("%f\n\n",result);

 result=(fp)(5,10.9);    //calling via function Pointer,Indirection Operator can Be 
 omitted
 printf("%f",result);
 getch();
 }

float add(int a,float b)
{
return a+b;
}

Ausgabe

15.90000
15.90000
15.90000
0
Suraj Verma
//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();
0
Khelben

Dies wurde mehr als ausreichend beantwortet, aber Sie können dies nützlich finden: The Function Pointer Tutorials . Es ist eine wirklich umfassende Behandlung des Themas in fünf Kapiteln!

0
Clifford

Ich benutze normalerweise typedef, aber es kann übertrieben sein, wenn Sie den Funktionszeiger nicht zu oft verwenden müssen.

//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();
0
Sint