Funktionszeiger - HILFE - ES BRENNT :)
-
Oh, super Beispiel,
ich habs geschnallt
Typedefs überlege ich mir jetzt aber keine
-
Hallo mau-mau-freak,
ich bins nochmals.Wie kann ich diese Entflechtungs-Kunst gut lernen? Hast du hier gute Literatur oder weblinks oder irgendwelche Kniffe?
Zeh Mau
-
Zeh Mau schrieb:
Wie kann ich diese Entflechtungs-Kunst gut lernen? Hast du hier gute Literatur oder weblinks oder irgendwelche Kniffe?
bei mir ist es übungssache. ansonsten: --> http://www.cs.uml.edu/~canning/101/RLWM.pdf
-
maumau-freak schrieb:
Zeh Mau schrieb:
Stehen dann in dem Array die Adressen von den Funktionen?
ja, etwas so musste dir das vorstellen
double func (double a, double b) { ... } ... double (*a[4])(double, double) = {func, func, func, func}; // array mit function pointern double (*(*f)[4]) (double, double) = a; // pointer auf dieses array
so eine schreibweise ist übrigens ziemlich übel. mit'n paar typedefs kannst du's schicker machen.
Hallo!
Ich habe mal versucht, das Beispiel zu implementieren.// array mit function pointern double (*a[4])(double, double) = {func, func, func, func}; // pointer auf dieses array double (*(*f)[4]) (double, double) = a;
Der Compiler meldet jetzt:
"warning: initialization from incompatible pointer type"Was ist daran falsch ?
Zeh Mau
-
Die letzte Anweisung muss
double (*(*f)[4]) (double, double) = &a;
heissen.
-
Jetzt scheine ich ganz durcheinander zu sein,
wenn f ein pointer ist, wiese reicht dann nicht
f = a aus, bzw. &a[0]. a ist doch ein Array, folglich brauche ich auch
nicht den Adressoperator. Hier habe ich wohl einen entschiedenen
Denkfehler.Zeh Mau
-
Nein, f = a; ist koreckter code das Programm wird kompiliert
und wird ausgefürt. Der Compiler gibt eine Warnung,
will man den Compiler glücklich machen,
schreibt man f = &a; und er meckert nicht mehr.Aus welchen Gründen auch immer!
-
Scheint mir nicht plausibel zu sein. Es heißt ja, der Zeigertyp wäre nicht richtig, hier muss es einen anderen Grund geben
Zeh Mau
-
probier mal so:
typedef double(*FP)(double, double); ... FP a[4] = {func, func, func, func}; // array mit function pointern FP *f = a; // pointer auf das array ...
und dann den:
typedef double(*FP[4])(double, double); ... FP a = {func, func, func, func}; // array mit function pointern FP *f = &a; // pointer auf das array ...
ist das 'array-sein' bestandteil des typs, braucht man ein &.
seltsam, oder?
-
ich versuche mich mal an einer erklärung:
allgemein ist es ja so, dass man bei arrays den adressoperator weglassen kann. allein der name reicht, um an die adresse zu kommen. beispiel:char a[] = "hello array"; puts (a); // nicht &a
im gegensatz dazu wird bei 'nicht-arrays' durch angabe des namens der inhalt (== wert der variablen) und nicht die adresse genommen. um an die adresse zu kommen, ist der explizite einsatz des adressoperators nötig.
nun zu den typedefs da oben^^
hat der datentyp selber schon 'arraycharacter' und man legt eine einfache variable dieses typs an, dann braucht man, um an die adresse dieser variablen zu kommen, den &, denn es ist ja nur ein einzelnes objekt. legt man sich dagegen ein array von objekten an (z.b. int xxy[100];) dann wird der name des arrays (xxy) immer als adresse interpretiert, d.h. es ist kein & nötig.liege ich damit richtig oder falsch?
-
Während a oder &a[0] ein Funktionszeiger auf eine Funktion ist,
ist der Datentyp von &a ein Pointer auf ein Array von 4 Zeigern auf Funktionen.
Genau dieser Datentyp ist auch bei der Zuweisungdouble (*(*f)[4]) (double, double) = &a;
gefragt,
weil f ein Zeiger auf ein Array von 4 Zeigern auf Funktionen ist.
Deshalb kommt keine Fehlermeldung!Zeh Mau
-
char a[] = "hello array"; puts (a); // nicht &a
a kann als Zeiger auf das erste Element des Arrays betrachtet werden.
&a hingegen hat den Datentyp "char (*)[11]" also nicht "char *",
deshalb geht a und nicht &a.Zeh Mau