IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Prototype de fonction


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut Prototype de fonction
    Bonjour,

    J'aurais 2 questions

    La première :
    Je ne comprends pas la notion de prototype pour une fonction.
    Si l'on remplace tout le corps de la fonction par un ;
    comment l'appel sait quoi faire ? où se trouve le corps de la fonction alors ?

    Le deuxième:
    Dans une fonction non void, comment exploite t'on les valeurs des return ?

    Merci d'avance pour vos réponses

  2. #2
    Membre éprouvé Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Par défaut
    Bonjour,

    un prototype c'est la signature du une fonction : son nom, ses parametres d entrées, et son type de retour (formellement le type de retour ne doit pas faire partie de la signature, mais je la cite car c'est une des infos importantes pour pouvoir utiliser correctement cette fonction).
    Ce prototype est placé dans un .h (avec un petit commentaire au dessus pour expliquer ce que fait cette fonction) et le corps de la fonction (la ou y a pas le ";" apres la parenthese) est placé dans le .c
    Pourquoi, car la fonction a souvent pour but d etre appelé par d autres fonctions, or ce qui t interesse dans ce cas la c'est comment l appeler plutot que de savoir comment elle fonctionne. La lecture du .h te suffit pour savoir quelle méthode/fonction tu peux utiliser.
    Donc il te faut les deux une partie dans le .c et une dans le .h

    Pour l appel des fonction non-void :
    si j ai une fonction dont la signature est int ma_fct() ben
    int retour = ma_fct();
    si ma fonction est struct toto mon_autre_fct() ben
    struct toto retour_2 = mon_autre_fct();

    vola voila,
    mais bon si tu te pose des questions de ce type je te conseille vivement un tuto (y a a plein et de tres bon sur developpez.com). Pour avancer dans le C il te faut maitriser sur le bout des doigts les bases.

  3. #3
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Psychique Voir le message
    Je ne comprends pas la notion de prototype pour une fonction.
    Si l'on remplace tout le corps de la fonction par un ;
    comment l'appel sait quoi faire ? où se trouve le corps de la fonction alors ?
    Le question est un peu confuse...
    Le prototype d'une fonction est la base de la programmation modulaire : cela permet de regrouper des fonctions par type d'intérêt et ne pas avoir à les recompiler à chaque construction d'un programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /* déclaration de foo (c'est quoi foo) */
    void foo(void);
     
    /* définition de foo (que fait foo) */
    void foo(void)
    {
        printf("hello world\n");
    }
    Si on remplace le corps d'une fonction par ; on ne supprime pas la définition de cette fonction, c'est juste que la fonction ne fait plus rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* définition de foo (que fait foo) */
    void foo(void)
    {
        /* ne rien faire */
        ;
    }
    Citation Envoyé par Psychique Voir le message
    Dans une fonction non void, comment exploite t'on les valeurs des return ?
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    /* cette fonction calcule le carré ud paramètre passé */
    int mettre_au_carre(int x)
    {
        return x*x;
    }
     
    int main(void)
    {
        printf("%d --> %d\n", 4, mettre_au_carre(4));
        return 0;
    }

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Les prototypes de fonctions ne vont pas forcément dans un .h. Si une fonction n'est utilisée que dans un .c, et n'est jamais appelée depuis un autre .c, alors cette fonction n'a pas à être déclarée dans un .h. Pourtant il faut tout de même déclarer le prototype de cette fonction en tête du .c, dans le cas où elle serait appelée avant d'être définie.

    Le prototype sert à connaitre le type des arguments attendus par une fonction, et le type retourné. Ca suffit au compilo pour générer le code d'appel de la fonction.

    Si une fonction est appelée alors que sa signature n'est pas connue, le compilo ne peut pas vérifier le type des arguments qui lui sont passés, ce qui est potentiellement dangereux. Pire encore, il va supposer que la fonction retourne un int... Manque de bol, si ta fonction retourne un type plus large, tu va seulement récupérer la moitié de ce que tu attends. C'est le fameux bug du malloc() appelé sans inclure stdlib.h en 64 bits... Plantage assuré.

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Psychique Voir le message
    La première :
    Je ne comprends pas la notion de prototype pour une fonction.
    Si l'on remplace tout le corps de la fonction par un ;
    comment l'appel sait quoi faire ? où se trouve le corps de la fonction alors ?
    http://emmanuel-delahaye.developpez.....htm#prototype

    attention, 20 Mo (mettre le son)
    http://delahaye.emmanuel.free.fr/video/modulaire.avi

    Le deuxième:
    Dans une fonction non void, comment exploite t'on les valeurs des return ?

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par matafan Voir le message
    Les prototypes de fonctions ne vont pas forcément dans un .h.
    Techniquement, il est possible de faire autrement, certes. Mais est-ce bien utile de dévoiler des techniques foireuses, alors qu'il est certainement utile de promouvoir la Bonne Programmation ?

    C'est le fameux bug du malloc() appelé sans inclure stdlib.h en 64 bits... Plantage assuré.
    C'était déjà le cas en x86 16-bit (mode réel, ce lui du démarrage de tous les PC, je le rappelle)... Le mode 32-bit n'est qu'une 'parenthèse de l'histoire' !

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    C'était déjà le cas en x86 16-bit (mode réel, ce lui du démarrage de tous les PC, je le rappelle)... Le mode 32-bit n'est qu'une 'parenthèse de l'histoire' !
    En es-tu sûr ? Chez moi, malloc() retournait un pointeur near, donc il tenait aussi dans un int...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Techniquement, il est possible de faire autrement, certes. Mais est-ce bien utile de dévoiler des techniques foireuses, alors qu'il est certainement utile de promouvoir la Bonne Programmation ?
    En quoi c'est foireux de déclarer les fonctions "static" dans le .c plutôt que dans un .h ? Moi je trouve ça plus propre : porté = unité de compilation, déclaration dans l'unité de compilation.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    @matafan: Emmanuel met ses fonctions statiques avant la première utilisation et n'a donc pas besoin de faire une déclaration séparée (du moins, tant qu'il n'y a pas de récursivité indirecte dans son code).

    @Emmanuel: C'est peut-être parce que je suis derrière un proxy qui semble perdre l'adresse de free toutes les trois secondes, mais pas moyen de télécharger ta vidéo.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    En es-tu sûr ? Chez moi, malloc() retournait un pointeur near, donc il tenait aussi dans un int...
    Je rappelle qu'il y avait 5 modèles de mémoire (dont un buggé!)

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Multiples modèles où pas, à moins qu'il y ait des defines dans les fichiers d'en-tête, malloc() retournait toujours un pointeur near. Je devais appeler _fmalloc() pour avoir droit à pointeur far.

    D'un autre côté, il y a des systèmes comme la calculatrice TI-89, où non seulement les int font 16 bits et les pointeurs 32 (même s'il n'y a que 24 bits d'adresse), mais en plus les pointeurs ne sont pas retournés par le même registre que les int!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par matafan Voir le message
    En quoi c'est foireux de déclarer les fonctions "static" dans le .c plutôt que dans un .h ? Moi je trouve ça plus propre : porté = unité de compilation, déclaration dans l'unité de compilation.
    On, est d'accord, mais dans ce cas, il n'est pas utile d'avoir un prototype séparé (saufs cas douteux : récursion plus ou moins désirée...). Il suffit de se tenir au principe "définir avant d'utiliser".

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Multiples modèles où pas, à moins qu'il y ait des defines dans les fichiers d'en-tête, malloc() retournait toujours un pointeur near. Je devais appeler _fmalloc() pour avoir droit à pointeur far.
    En MSC, peut être. Je n'ai pas connu. En mode large sur Borland C, malloc() retourne un seg:ofs qui a bien du mal à tenir dans un int !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 12
    Par défaut
    Merci à tous pour vos réponses, cela m'a bien aidé

    A bientôt

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] Prototypes de fonctions et IE
    Par T.NightGlow dans le forum Bibliothèques & Frameworks
    Réponses: 9
    Dernier message: 15/01/2008, 16h50
  2. definition prototypes de fonctions dans main
    Par fantomas261 dans le forum C
    Réponses: 4
    Dernier message: 19/10/2007, 11h18
  3. Question sur les prototypes de fonctions
    Par GnuVince dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2006, 23h37
  4. .net prototype de fonction
    Par stgi02 dans le forum MFC
    Réponses: 1
    Dernier message: 13/04/2006, 22h41
  5. prototype de fonction ?
    Par salseropom dans le forum C
    Réponses: 3
    Dernier message: 07/04/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo