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 :

Découper un programme.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Par défaut Découper un programme.
    Bonjour.

    J'aimerais découper mon programme en le séparant en plusieurs fichiers.
    un exemple :

    Le fichier main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "fichier.c"
     
    int main (void)
    {
      fonction();
      return 0;
    }
    Le fichier fichier.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void fonction(void) {
     
    }
    Je compile et cela ne provoque pas d' erreur de compilation.
    Par contre quand je construit j' ai une erreur pendant le linking dans le fichier fichier.c. --> (multiple definition of `fonction()')
    Si je remplace #include "fichier.c" par le contenu de fichier.c, ça marche.

    J'aimerais savoir comment faire pour séparer mon programme en plusieurs fichiers : un fichier pour l'affichage, un autre pour la gestion du clavier etc...
    (je programme un jeu)
    Merci.

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Tu as tenté de compiler ce code simple ? ça devrait marcher.

    Par contre pour un truc plus compliqués, comme ton jeu, c'est très bien de séparer en plusieurs fichiers, mais tu pourrais etre embété par un fichier qui serait inclus plusieurs fois. Il faut mettre des "sentinelles" qui éviteront que les fichiers soient inclus plus de fois que nécessaire:

    dans le fichier fichier.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef FICHIER_C
    #define FICHIER_C
     
    void fonction(void) {
     
    }
     
    #endif
    essaye de mettre une sentinelle du type dans les divers fichiers ajoutés et dis nous si ça marche.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Par défaut
    Oui j'ai essayé de compiler ce code simple et ça ne marche pas
    Si je renomme le fichier fichier.c en fichier.h et que bien sur je remplace le include, alors ça marche!

    Le problème c'est que j'ai besoin d'un fichier header pour chaque fichier de code pour y mettre les déclarations.

    J' utilise Mingw Developer Studio.... c'est peut être a cause de lui?

    Merci pour les sentinelles, ça va me servir

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'abord on n'inclue pas des fichiers C, mais des fichiers d'entête, des .h, ne contenant que des définitions de constante et/ou de FONCTIONS, mais pas le CODE des fonctions..

    Exemple

    Fonction.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef FONCTION_H
    #define FONCTION_H
     
    extern void Fonction ( int Param );
     
    #endif
    main.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
     
    #include "Fonction.h"
     
    int main(void)
    {
      int MaVar = 10 ;
     
      Fonction(MaVar);
     
      return EXIT_SUCCESS ;
    }
    fonction.c

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdlib.h>
    #include <stdio.h>
     
    void Fonction ( int Param )
    {
        printf ( "La variable est : %d \n", Param);
    }
    Ensuite on compile, et on lie grâce à l'éditeur de liens (via Makefile ou IDE)

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Par défaut
    Merci beaucoup, ça éclaire beaucoup de choses!
    Tu devrais rajouter ta réponse dans la FAQ
    Je vais tester ça sur mon programme.

    Une question cependant :
    pourquoi inclure 2 fois stdlib?

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    parce que les 2 fichiers sont compilés séparément et indépendamment...

  7. #7
    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 jnspunk Voir le message
    J'aimerais découper mon programme en le séparant en plusieurs fichiers.
    Programmation modulaire (ou séparée). A lire de A à Z :

    http://emmanuel-delahaye.developpez.com/codage.htm

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 139
    Par défaut
    Merci!! C'est exactement ce que je cherchais!
    Ca marche bien maintenant ^^

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 35
    Par défaut une petite question
    Une petite question qui qui me chagrine et dont je n'ai pas trouvé la réponse dans ton lien -ed-.

    Si dans mon .c (par exemple pile.c) j'ai des fonctions qui sont static exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void arret_sur_erreur(char *mess);
    que je pense ne pas avoir besoin d'exporter. Ou est-ce que je déclare leurs prototypes ?

    Dans le .h en remettant static, ou dans le.c ?

  10. #10
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Pas de static dans un .h. Une fonction déclarée static n'est utilisable que dans le fichier source dans lequel elle a été définie. Pour déclarer la fonction (dans ton fichier source), tu doit mettre également le mot clé static devant la déclaration. Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    static void f(void);
     
    ...
     
    void f() /* Plus la peine de remettre le static */
    {
        ...
    }

  11. #11
    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 -Raf- Voir le message
    Une petite question qui qui me chagrine et dont je n'ai pas trouvé la réponse dans ton lien -ed-.

    Si dans mon .c (par exemple pile.c) j'ai des fonctions qui sont static exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static void arret_sur_erreur(char *mess);
    que je pense ne pas avoir besoin d'exporter. Ou est-ce que je déclare leurs prototypes ?
    En principe, une fonction static, si elle est bien placée, n'a pas besoin de prototype séparé.

    Tu as bien vu que dans les 'sections' que je recommande, il n'y a pas de 'private functions prototypes', que ce soit dans un .h ou dans un.c...

    http://emmanuel-delahaye.developpez....tes.htm#static

    Si tu avais besoin de définir un prototype séparé pour cause d'appels croisés, par exemple, ça pourrait signifier qu'il y a un bug potentiel dans ton code (récursivité non intentionnelle)...

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

Discussions similaires

  1. Découper mon programme en plusieurs classes
    Par 1abdou1 dans le forum JavaFX
    Réponses: 6
    Dernier message: 12/03/2015, 23h53
  2. Programme de boot qui passe la main à Windows
    Par Bob dans le forum Assembleur
    Réponses: 7
    Dernier message: 25/11/2002, 03h08
  3. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  4. communication entre programmes
    Par jérôme dans le forum C
    Réponses: 12
    Dernier message: 16/04/2002, 08h05
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h43

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