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 Zuweisung

    double (*(*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 👍


Anmelden zum Antworten