kostenloser Webspace werbefrei: lima-city


[C] Function pointer - korrekte Nutzung

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    madhouse

    madhouse hat kostenlosen Webspace.

    Hallo,

    ich habe eine Frage zu Funktionspointer in C.
    Die Definition sieht ja so aus:
    void function1(char *attr1, int attr2, void* (*pointerfunc)(int i));

    Das würde heißen: Die Funktion function1 nimmt einen Funktionspointer pointerfunc entgegen, dessen Funktion einen void-Pointer returned, korrekt?

    Wäre es jetzt nicht falsch, mit dieser Funktion:
    void* somefunction(int i) {
    ...
    }

    diesen Funktionsaufruf zu machen?
    function1(bla1, bla2, somefunction(10));

    Müsste ich nicht, da ich die Adresse der somefunction-Funktion will, entweder beim Aufruf ein & hinzufügen, oder aber bei der Deklaration der Funktion ein *, also ein
    void* (*somefunction)(int i) {...}
    machen?

    Ist meine Überlegung richtig? Denn in vielen Beispielen im Internet wird der obige Weg benutzt, nie wird genau drauf eingegangen, was nun richtig ist, bzw ob alle Möglichkeiten funktionieren.

    Danke im Vorraus,
    madhouse

    PS: Und kann ich den Paramenter int i überhaupt so übergeben, weil ein Pointer ja normal nicht wirklich ein Parameter halten kann.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. thomasba

    Co-Admin Kostenloser Webspace von thomasba

    thomasba hat kostenlosen Webspace.

    Der korrekte Funktionsaufruf ist:
    function1(bla1, bla2, somefunction);

    Das du ja die Adresse der Funktion übergeben musst.

    In der function1 kannst du dann so auf diese übergebene Funktion aufrufen:
    (*pointerfunc)(10);


    Und nein, der Parameter kann nicht bei dem Zeiger mit übergeben werden ;-)
  4. Hallo madhouse,

    wenn Du eine Funktion
    void* somefunc(int i)
    {
        ...
    }
    hast, dann ist die Adresse der Funktion einfach der Funktionsname. Also ohne '&' davor und ohne die runden Klammern mit dem/den Argument/en.
    Der Aufruf von function1() muss wie folgt aussehen:
    function1(bla1, bla2, somefunc);
    Bei dem von Dir verwendeten Aufruf würde erst somefunc() ausgeführt und das Ergebnis, d.h. der void-Pointer der von somefunc() zurückgegeben wird, an function1() übergeben und nicht die Adresse der Funktion.

    Edit: Mir scheint, dass die 'Es wurde ein neuer Beitrag erstellt'-Meldung defekt ist.
    Aber eine Anmerkung habe ich noch:
    Du kannst in function1() anstelle von
    foobar = (*pointerfunc)(10);
    auch einfach
    foobar = pointerfunc(10);
    schreiben.

    Beitrag zuletzt geändert: 30.11.2011 15:29:01 von darkpandemic
  5. Autor dieses Themas

    madhouse

    madhouse hat kostenlosen Webspace.

    Danke für die Hinweise, jetzt wird das ganze schon klarer.

    darkpandemic schrieb:
    Bei dem von Dir verwendeten Aufruf würde erst somefunc() ausgeführt und das Ergebnis, d.h. der void-Pointer der von somefunc() zurückgegeben wird, an function1() übergeben und nicht die Adresse der Funktion.

    Oh ja stimmt, das war etwas dämlich ;)

    Zusammenfassend kann ich sagen, das egal ob
    void* (*somefunc)(params) {...}
    oder
    void* somefunc(params) {...}
    für die Definition der Funktion verwendet wurde, ich sie immer mit
    function1(bla1, bla2, somefunc);
    aufrufe und innerhalb der function1 mit
    foobar = (*somefunc)(10);
    oder
    foobar = somefunc(10);
    benutzen kann?

    Also muss ich da komplett vom Variablendenken wegkommen und es gibt keinen Unterschied zwischen den unterschiedlichen Aufrufen?

  6. Hallo madhouse,

    nicht ganz richtig:
    Das ist die Deklaration eines Zeigers:
    void* (*somefunc)(params);
    und das ist die Deklaration einer Funktion:
    void* somefunc(params);
    Ich denke mal, dass Dein Compiler sowas nicht mögen wird:
    void* (*somefunc)(params)
    {
        ...
    }
    weil ein Zeiger keinen Funktions-Definition einleiten kann. Es geht nur:
    void* somefunc(params)
    {
        ...
    }

    Edit: Typo



    Beitrag zuletzt geändert: 30.11.2011 15:52:44 von darkpandemic
  7. Autor dieses Themas

    madhouse

    madhouse hat kostenlosen Webspace.

    Hallo darkpandemic,

    vielen Dank für die Hilfe,
    ich hab gerade nochmal bisschen damit rumgespielt und würde jetzt behaupten wollen, es begriffen zu haben ;)

    Edit: Natürlich auch an thomasba, wie ich das mit den Argumenten mache, ist auch auf jeden Fall hilfreich

    Gruß,
    madhouse



    Beitrag zuletzt geändert: 30.11.2011 16:05:26 von madhouse
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!