array of function pointers

Gast #4329326
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
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
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 #4329373
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?
Gast #4329380
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
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
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
#4330348
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.