1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

funktions-prototype in c ?

  • NickK
  • 4. August 2008 um 10:30
  • Unerledigt
  • NickK
    6
    NickK
    Mitglied
    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
    17
    sauzachn
    Mitglied
    Reaktionen
    51
    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)

    Dipper dipper dii dipper dii dipper dii duuu

  • Kampi
    27
    Kampi
    Mitglied
    Reaktionen
    193
    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

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

  • NickK
    6
    NickK
    Mitglied
    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
    6
    NickK
    Mitglied
    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
    11
    Ringding
    Mitglied
    Reaktionen
    12
    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!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    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.

    *plantsch*

  • Blµb
    1
    Blµb
    Mitglied
    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 :face_with_tongue:
    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.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung