Forum: Compiler & IDEs array of function pointers


von ch (Gast)


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?

von A. H. (ah8)


Lesenswert?

ch schrieb:
> void (*func_ptr[3]) = {fun1, fun2, fun3};

Das definiert ein array von void-Pointern, Du möchtest aber ein array 
von void-Funktionen:
1
void (*func_ptr[3])() = {fun1, fun2, fun3};

: Bearbeitet durch User
von 7856ujtzuitzu (Gast)


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

von A. H. (ah8)


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.

von ch (Gast)


Lesenswert?

Irgendwie kapiere ich es immer noch nicht.
Ich hatte angenommen, dass das der Funktionsaufruf ist.
1
(*func_ptr[option])();
Was muss ich dahin schreiben, dass ich eine der Funktionen aufrufen 
kann?

von Leo Lotzröffel (Gast)


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.

von Leo Lotzröffel (Gast)


Lesenswert?

Leo Lotzröffel schrieb:
> Unter dem Beitrag steht sogar, dass es so nicht kompiliert wird.

Ok, dieser Punkt war schon korrigiert.

von A. H. (ah8)


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.

von nicht"Gast" (Gast)


Lesenswert?

ch schrieb:
> (*func_ptr[option])();

Das kannst du dir auch ein wenig lesbarer machen.
1
func_ptr[option]();
reicht völlig

von ch (Gast)


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

von A. H. (ah8)


Lesenswert?

ch schrieb:
> Die Frage ist
> nur, wie kriege ich das Array dazu ein Array von Funktionspointern zu
> sein?

Steht schon oben. Du musst Dir nur mal Mühe machen, genau zu lesen.
(Kleiner Tipp: Es sind nur zwei Zeichen, die den Unterschied machen.)

: Bearbeitet durch User
von ch (Gast)


Lesenswert?

Upps, wer lesen kann ist klar im Vorteil
1
void (*func_ptr[3])() = {fun1, fun2, fun3};

Does it compile? Yes it does.

Dankeschön :-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sauberer wäre
1
void (*func_ptr[3])(void) = {fun1, fun2, fun3};

Schöner und übersichtlicher wiederum ist es bei Funktionszeigern fast
immer via typedef:
1
typedef void (*func_ptr_t)(void);
2
3
func_ptr_t func_ptr[3] = {fun1, fun2, fun3};

: Bearbeitet durch Moderator
von Rolf M. (rmagnus)


Lesenswert?

A. H. schrieb:
> Und da ein 'pointer to void function' auf einen 'pointer to void' gecastet
> werden kann, hat der Compiler an dieser Stelle auch kein Problem.

Kann er ein ISO C eigentlich nicht. Das ist eine Eigenheit von GCC, daß 
der es sogar im strikten C-Modus zulässt. Eine Warnung gibt er immerhin 
aus.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.