2016-09-28 1 views
-2

Wie übergeben Sie ein Array von Zeigern an Funktionen als Argument für eine Funktion? Wenn die Typen der Funktionen leer sind und auch der Zeiger, wie greifen Sie auf die Funktionen zu?Arrays und Funktionszeiger

int main() { 

    void(*fun_ptr[])(void) = {fun1, fun2, fun3}; 
    pickFun(fun_ptr); 
    return 0; 
} 

Alle drei Funktionen drucken nur eine Nachricht und werden als ungültig erklärt

void pickFun(void *function_ptr[]) 
{ 
    int pick = 0; 
    while(pick != 0) 
    { 
    scanf("%i", &pick); 
    *(function_ptr + (pick - 1)); 
    } 
} 

ich nie die Funktion des printf-Anweisungen erhalten kann erscheinen, wenn eine Funktion gewählt wird. Das Programm führt nur eine Schleife durch und gibt niemals die Nachricht aus, die in jeder Funktion enthalten ist. Irgendwelche Vorschläge oder Hinweise?

+0

Zuerst, wenn Sie ein Array verwenden Array-Indizierung Syntax, wie z. 'function_ptr [pick - 1]' stattdessen macht es viel klarer, was Sie tun. Zweitens rufen Sie nicht wirklich die Funktionen auf. –

+0

Oh, und drittens, denken Sie noch einmal an Ihre Schleifenbedingung ... –

+0

'int pick = 0; while (pick! = 0) {... 'Hier while while loop bekommt nie eine Chance. –

Antwort

1

Der Funktionsparameter void *function_ptr[] ist vom Typ pointer to pointer to void`. Sie müssen es ändern

void pickFun(void (*function_ptr[])(void)); 

auch zur Kenntnis, dass, wie andere in Kommentaren darauf hingewiesen, Programm tritt nie der Schleifenkörper. Besser zu nutzen do while Schleife hier

void pickFun(void *function_ptr[]) 
{ 
    do 
    { 
     scanf("%i", &pick); 
     //*(function_ptr + (pick - 1)); 
     function_ptr[pick-1]();  //Function call. pick should not be greater than 3 
    } while(pick != 0) 
} 
+1

Mit anderen Worten, * genau * wie es in "main" deklariert ist, abzüglich des Initialisierers. – WhozCraig

+0

Ich habe main zu diesem int main geändert() { \t void (* fun_ptr []) (void) = {fun1, fun2, fun3, fun4}; \t pickFun (fun_ptr); \t Rückkehr (0); } ich die pickFun dieser voidpickFun (void (* function_ptr []) (void)) geändert {} innen I Pick Spaß verwendet function_ptr [Pick - 1] für jede der drei Rechts Antworten und 0 zu beenden Meine PickFun-Deklaration ist diese void selectFunction (void (* [])); Die Fehler complier die folgende \t sagen: 'Leere pickFun (void * [])': kann nicht Argument 1 von 'void (__cdecl * [4]) (void)' auf 'void * []' –

0

Auch können Sie Ihre Funktionen aufrufen mit:

(*function_ptr[pick-1])(); 

oder (igitt):

(*(function_ptr + (pick-1)))(); 

oder:

function_ptr[pick-1](); 

oder:

(function_ptr + (pick-1))(); 
+0

Diese doesn konvertieren Beantworten Sie nicht die Frage "Wie übergibt man ein Array von Zeigern an Funktionen als Argument an eine Funktion?" – Lundin

+0

Es beantwortet die Frage: "Wie greifen Sie auf die Funktionen zu?" –