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 :

Fonctions avant ou après "main"


Sujet :

C

  1. #1
    Membre éclairé
    Étudiant
    Inscrit en
    Août 2007
    Messages
    419
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 419
    Par défaut Fonctions avant ou après "main"
    Bonjour,

    y a t-il une différence entre un programme dont les fonctions sont avant "main" et le même avec les fonctions après "main"?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Comme toutes autres fonctions, main() doit connaitre la signature (prototype) des fonctions qu'elle utilise, mais elle se moque du code interne. Donc si le prototype est declare avant main(), soit dans le meme fichier ou dans un fichier entete inclus, on peut mettre le code des autres fonctions ailleurs (apres main() ou dans une autre unite de compilation). Si la fonction n'est utilisee que dans l'unite de compilation en cours, on la qualifie avec static et il est d'usage de mettre son code avant la fonction principale de cette unite.

  3. #3
    Membre éclairé
    Étudiant
    Inscrit en
    Août 2007
    Messages
    419
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 419
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Comme toutes autres fonctions, main() doit connaitre la signature (prototype) des fonctions qu'elle utilise, mais elle se moque du code interne. Donc si le prototype est declare avant main(), soit dans le meme fichier ou dans un fichier entete inclus, on peut mettre le code des autres fonctions ailleurs (apres main() ou dans une autre unite de compilation). Si la fonction n'est utilisee que dans l'unite de compilation en cours, on la qualifie avec static et il est d'usage de mettre son code avant la fonction principale de cette unite.
    Merci

    donc si je comprends bien,

    prototype

    main

    puis les fonctions n'importe ou

  4. #4
    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 acacia Voir le message
    y a t-il une différence entre un programme dont les fonctions sont avant "main" et le même avec les fonctions après "main"?
    Etant donné qu'une définition de fonction intègre son prototype, il est simple et logique de définir les fonctions avant de les utiliser (donc de les placer avant le main() dans le bon ordre). Ca permet de bien voir les liens qu'il y a entre elles (qui appelle qui...)

    Mais il est techniquement possible de placer les fonctions après. Il faut cependant fournir un prototype séparé avant.

    La logique et le bon sens commandent alors de séparer les fonctions et les prototypes dans 2 fichiers séparés à inclure comme il faut : c'est la programmation modulaire (ou séparée) :

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

  5. #5
    Membre éclairé
    Étudiant
    Inscrit en
    Août 2007
    Messages
    419
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 419
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Etant donné qu'une définition de fonction intègre son prototype, il est simple et logique de définir les fonctions avant de les utiliser (donc de les placer avant le main() dans le bon ordre). Ca permet de bien voir les liens qu'il y a entre elles (qui appelle qui...)

    Mais il est techniquement possible de placer les fonctions après. Il faut cependant fournir un prototype séparé avant.

    La logique et le bon sens commandent alors de séparer les fonctions et les prototypes dans 2 fichiers séparés à inclure comme il faut : c'est la programmation modulaire (ou séparée) :

    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser
    Merci

    Quand je fais le prototype de la fonction avant le main puis le code juste après j'ai une erreur disant "previous declaration of fonction was here" en m'indiquant la ligne du prototype.

    je vais réorganiser mon programme selon vos conseils, et j'aimerai tout de même savoir s'il est possible de résoudre l'erreur que j'ai eu.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    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 391
    Par défaut
    Généralement, ce genre d'erreur indique que la fonction est différente du prototype.
    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.

  7. #7
    Membre éclairé
    Étudiant
    Inscrit en
    Août 2007
    Messages
    419
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 419
    Par défaut
    ça pour la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affichage(struct list_event *tete)
    et ça c'est sont prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichage(struct list_event);
    c'est pas comme ça qu'on fait?

  8. #8
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Par défaut
    Citation Envoyé par acacia Voir le message
    ça pour la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affichage(struct list_event *tete)
    et ça c'est sont prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichage(struct liste);
    c'est pas comme ça qu'on fait?
    liste != list_event

    Ton prototype doit donc être le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichage(struct list_event*);
    @+
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  9. #9
    Membre éclairé
    Étudiant
    Inscrit en
    Août 2007
    Messages
    419
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 419
    Par défaut
    Merci

    ça fonctionne

  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 acacia Voir le message
    ça pour la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void affichage(struct list_event *tete)
    et ça c'est sont prototype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichage(struct list_event);
    c'est pas comme ça qu'on fait?
    Il manque une étoile...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void affichage(struct list_event *);

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

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