funktions-prototype in c ?

  • hallo

    ich hätt eine frage zu funktionsprototypen in c. nur zu einer funktion (bereits bestehnde software) bring ich keinen funktionierenden prototypen zusammen:

    int funktionsname(..., ..., snapfptr)

    int ..., (*snapfptr)();
    float ...;
    {

    was ich auch für snapfptr (pointer to integer-function) schreibe, nix funktioniert (absturz zur laufzeit):

    int funktionsname(int ..., float ..., int (*)());
    int funktionsname(int ..., float ..., int (*snapfptr)());
    int funktionsname(int ..., float ..., int (*)(void));

    ohne prototyp funktionierts :o

    da andere funktionen ohne prototyp nicht funktionieren wollt ich generell
    prototypen schreiben...

    danke für hinweise, lg

    n.k.

  • Was heißt "Absturz zur Laufzeit"? Prototypen sind etwas, das beim Compilieren gecheckt wird. Stimmt ein Typ nicht überein, regt sich bereits der Compiler auf. Nur wenn du die Funktion tatsächlich verwendest, kann es zu einem Absturz kommen.

    (Fehler im Compiler selbst nehme ich hier mal aus)

    Dipper dipper dii dipper dii dipper dii duuu

  • ganz generell brauchst du bei prototypen keine variablen benennen (ich denke das deuten deine "..." an). es reicht der typ:

    Code
    int fkt(int, int);

    statt

    Code
    int fkt(int a, int b);

    schau dir mal folgende seite an. da wird erklaert wie man fktptrs schoen mit hilfe von typedefs loest.

    HTH

    Willfähriges Mitglied des Fefe-Zeitbinder-Botnets und der Open Source Tea Party.

  • Was heißt "Absturz zur Laufzeit"? Prototypen sind etwas, das beim Compilieren gecheckt wird. Stimmt ein Typ nicht überein, regt sich bereits der Compiler auf. Nur wenn du die Funktion tatsächlich verwendest, kann es zu einem Absturz kommen.

    (Fehler im Compiler selbst nehme ich hier mal aus)

    absturz zur laufzeit heisst segmentation fault; laut ddd-debuger wird quatsch beim aufruf der fkt übergeben, diese stürzt dann bei der verwendung ab

    ohne prototypen klappt die übergabe einer float nicht; so nach der art float wird auf den stack gelegt, funktion liest double raus (oder umgekehrt) :o da die beiden unterschiedlich lang sind wird der pointer der als nächster parameter folgt dann verstümmelt

    mit prototypen (es geht insgesamt um 8-9 funktionen) klappt und läuft alles ok

    nur für die eine funktion (die in meiner frage) bring ich den prototyp nicht zusammen

  • ganz generell brauchst du bei prototypen keine variablen benennen (ich denke das deuten deine "..." an).

    ich wollt nur nicht mit den variablennamen hier verwirren...

    der springende punkt ist, wie geb ich einen parameter im prototyp an, der ein pointer auf eine FUNKTION mit return-value integer ist

  • Ich versteh die Angabe gar nicht. Da ist so viel weggelassen, dass ich mir den Rest nicht zusammenreimen kann.

    Etwas komisch kommt mir die Zeile mit dem "int ..., (*snapfptr)();" vor. Wolltest du da nicht ein typdef schreiben? So erzeugst du eine globale Variable.

    sauzachn: Der C-Compiler macht aber normalerweise nur Warnings.

  • der springende punkt ist, wie geb ich einen parameter im prototyp an, der ein pointer auf eine FUNKTION mit return-value integer ist


    So:

    Code
    int (*myfuncptr)(void)


    Das (void) ist in C wichtig, damits wirklich ein Prototype ist -- ansonsten ist es nur eine Funktion mit nicht naeher definierten Argumenten. Wenn du diesen Stil, inklusive (void)-Parameterlisten, im gesamten Programm durchziehst und keine Funktionspointer herumcastest, duerfte es dann keine Probleme geben.

    Mit Typedefs wird die Syntax vielleicht etwas klarer. Damit koenntest du sowas schreiben:

    Code
    typedef int (*myfuncptr_t)(void);
    int foobar(myfuncptr_t myfuncptr);


    und haettest automagisch die richtige Deklaration des Funktionspointers.

    *plantsch*

  • ich wollt nur nicht mit den variablennamen hier verwirren...

    der springende punkt ist, wie geb ich einen parameter im prototyp an, der ein pointer auf eine FUNKTION mit return-value integer ist

    muss auch sagen, die angaben oben sind unklar, aber um diese frage zu beantworten, entweder mit typedefs, oder richtiger schreibweise :P
    funktionspointer werden so definiert:
    endtyp pointertyp(*name)(argumente);

    also zb für returntype int
    int (*gib_mir_nen_int)();
    für nen int*:
    int *(*gib_mir_nen_int_pointer)(double juhu);

    was du willst ist:
    void eine_funktion(int die, float einen, int (*funktionspointer)(), void *nimmt);

    Da du float/double größen erwähnt hast, und viele "..." verwendet hast:
    Üblicherweise werden float typen zu doubles konvertiert in variadic arguments:
    void nimmt_floats_als_doubles(...);
    void nimmt_nen_float(float blah);

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!