array of function pointers

Gast #4329326
Lesenswert?

http://stackoverflow.com/questions/252748/how-can-i-use-an-array-of-function-pointers

Bei stack overflow gibt es ein Beispiel für ein Array von 
Funktionspointern:
1
void fun1()
2
{
3

4
}
5

6
void fun2()
7
{
8

9
}
10

11
void fun3()
12
{
13

14
}
15

16
void (*func_ptr[3]) = {fun1, fun2, fun3};
17

18
main()
19
{
20
    int option;
21

22

23
    printf("\nEnter function number you want");
24
    printf("\nYou should not enter other than 0 , 1, 2"); /* because we have only 3 functions */
25
    scanf("%d",&option);
26

27
    if((option>=0)&&(option<=2))
28
    { 
29
        (*func_ptr[option])();
30
    }
31

32
    return 0;
33
}

Wenn ich das mit dem GCC compiliere erhalte ich

error: called object is not a function or function pointer
         (*func_ptr[option])();

Hat jemand eine Ahnung, wie man die Funktionen richtig aufrufen kann?
Gast #4329355
Lesenswert?

ich kenne diverse kurzschreibweisen auch nicht und nicht ob das :
1
void (*func_ptr[3]) = {fun1, fun2, fun3};
geht ..
irgendwie fehlt da der typ

zB
1
typedef int (*foo)(int); 
2
foo *p[100];  // array of foo 100 pointer

nutzt man sowas als queue
kann man ein struct bauen was den *fp()  + parameter enthält
#4329370
Lesenswert?

7856ujtzuitzu schrieb:
> ich kenne diverse kurzschreibweisen auch nicht und nicht ob das :
> void (*func_ptr[3]) = {fun1, fun2, fun3};
> geht ..
> irgendwie fehlt da der typ

Das stimmt so nicht. (Sonst hätte der Compiler hier schon protestiert.) 
Der Typ eines Feldelements ist 'pointer to void'. Und da ein 
'pointer to void function' auf einen 'pointer to void' gecastet werden 
kann, hat der Compiler an dieser Stelle auch kein Problem.

Das Problem kommt erst, wenn etwas als Funktion aufgerufen werden soll, 
was (zumindest laut Deklaration) keine Funktion ist.
Gast #4329380
Lesenswert?

ch schrieb:
> Bei stack overflow gibt es ein Beispiel für ein Array von
> Funktionspointern:

> Wenn ich das mit dem GCC compiliere erhalte ich
> error: called object is not a function or function pointer
>          (*func_ptr[option])();

Ach. Unter dem Beitrag steht sogar, dass es so nicht kompiliert wird. 
Lies doch mal die ganze Seite, da gibt es noch mehr Beispiele.
#4329385
Lesenswert?

ch schrieb:
> Irgendwie kapiere ich es immer noch nicht.
> Ich hatte angenommen, dass das der Funktionsaufruf ist.

Stimmt ja auch. (beides :-) Dein Problem ist ja auch nicht der Aufruf, 
sondern die Deklartion (bzw. Definition). Das sagt Dir die Fehlermeldung 
ganz deutlich:

1
error: called object is not a function or function pointer

Offensichtlich versucht der Compiler etwas aufzurufen (called object) 
was aber nicht aufgerufen werden kann (is not a function or function 
pointer).

Also schaue an der Stelle nach, wo das, von dem Du glaubst das es eine 
Funktion ist, definiert wurde.
Gast #4329413
Lesenswert?

1
func_ptr[option]();
Das sieht zwar besser aus, es compiliert aber auch nicht.
Wie weiter oben erwähnt, ist das Problem die Deklaration. Die Frage ist 
nur, wie kriege ich das Array dazu ein Array von Funktionspointern zu 
sein?

>Offensichtlich versucht der Compiler etwas aufzurufen (called object)
>was aber nicht aufgerufen werden kann (is not a function or function
>pointer).
1
error: called object is not a function or function pointer

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren