1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

funktions-prototype in c ?

  • NickK
  • 4. August 2008 um 10:30
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • NickK
    Punkte
    310
    Beiträge
    46
    • 4. August 2008 um 10:30
    • #1

    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.

  • sauzachn
    Punkte
    3.101
    Beiträge
    606
    • 4. August 2008 um 11:06
    • #2

    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)

  • Kampi
    Punkte
    7.828
    Beiträge
    1.468
    • 4. August 2008 um 11:32
    • #3

    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

  • NickK
    Punkte
    310
    Beiträge
    46
    • 4. August 2008 um 11:51
    • #4
    Zitat von sauzachn

    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

  • NickK
    Punkte
    310
    Beiträge
    46
    • 4. August 2008 um 11:54
    • #5
    Zitat von Kampi

    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

  • Ringding
    Punkte
    1.237
    Beiträge
    244
    • 4. August 2008 um 11:58
    • #6

    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.

  • Plantschkuh!
    Punkte
    6.173
    Beiträge
    1.181
    • 4. August 2008 um 12:02
    • #7
    Zitat von NickK

    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.

  • Blµb
    Punkte
    5
    Beiträge
    1
    • 5. August 2008 um 13:59
    • #8
    Zitat von NickK

    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);

  • Maximilian Rupp 27. Dezember 2024 um 12:04

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum