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
return0;
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?
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.
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.
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.
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).
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.)
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.