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 :

Problème programmation modulaire


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Problème programmation modulaire
    Bonjour;
    Je travaille actuellement sur un projet, mais me voici coincer depuis plus de 2 jours sur un stupide problème; J'ai 3 fichier (le main.c, test.h et test.c que voici ci dessous)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "test.h"
     
    int main()
    {
        affiche();
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //test.c
    #include "test.h"
     
    void affiche()
    {
        printf("Hello world");
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //test.h
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
        #include <stdio.h>
        #include <stdlib.h>
        void affiche();
     
    #endif // TEST_H_INCLUDED
    Tout devrais fonctionner mais voila, a la compilation j'ai le droit a une belle erreur dans le main:
    Undefined reference to affiche()

    Je travaille sous code::blocks et le fichier est bien linké au projet et les case Debug et release sont cocher.
    Merci d'avance

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Normalement, tu as tout ce qu'il faut.
    (et meme trop, les includes ne servent que dans test.c, il ne devrait pas être dans main.c et test.h)

    "undefined reference" c'est que le linker n'a pas fait le lien qu'il faut.
    La cause probable, c'est qu'un .c n'a pas été compilé.

    Fais un clean, puis un build, et regarde si main.c et test.c sont compilé, puis si tu vois une ligne du genre:
    gcc -o test.exe ... main.o test.o ...Normalement, l'erreur devrait arriver après.


    Si tu travailles sous linux, fais le test à la main (apprendre à compiler de la sorte est utile, de toute facon).

    supposons que tu aies un dossier contenant les trois fichiers.
    alors, tu pourrais compiler ainsi:
    1. d'un coup: gcc *.c -o exemple ce qui produira le programme "exemple"
    2. En plusieurs étapes
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      gcc -c main.c
      gcc -c test.c
      gcc main.o test.o -o exemple

    l'option -o permet de nommer le fichier produit.
    gcc *.c produirait un programme nommé a.out
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci leternel de ta réponse;

    Je travail actuellement, (malheureusement), sous Windows mais je pense que je vais essayer sous Linux.
    Lorsque je recompile après le Clean, c'est au moment de la ligne du linkage du .exe que sa plante et tout les fichiers sont bien compiler.
    Je suis vraiment désespéré sa fait 2 jours que je cherche et toujours rien :/
    J'essaye sous linux et je te tient au courant dans les plus bref délais.

    Bon, sous Linux aucun soucis, tout marche a merveille... (Ne pas pensser du mal de Windows )

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    ça veut dire que c'est bien le réglage de code::blocks qu'il faut remettre en doute.

    Essaie de voir si tous les fichiers sont bien considérés comme des sources.
    En ultime recours, crée un autre projet, dans lequel tu injecteras ces trois fichiers.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai injecter les fichiers dans un nouveau projet, toujours le même soucis.
    Comment fait-on pour vérifier que les fichiers sont bien considéré comme sources ?

    EDIT: Si je met: #include "test.c" dans le main le programme fonctionne, mais ceci n’étant pas un bonne méthode de programmation, j'aimerais m'en passer.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Sous Windows, peux-tu nous faire une capture d'écran de l'arborescence du projet, comme dans l'image suivante ?

    Nom : Untitled.png
Affichages : 381
Taille : 6,5 Ko

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    J'aime beaucoup ton main_cpp.c
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Voici l'image du projet, on a même le droit a la belle erreur
    Nom : Nouvelle image.png
Affichages : 385
Taille : 215,0 Ko

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Bonjour,
    main.cpp sous entend que tu utilises le compilateur C++.
    N'y aurait il pas un petit conflit entre l'adressage C et C++ ?
    Je pense qu'il faut que tu indiques que les fonctions sont C.

    Dans ton header il faut rajouter des directives interprétées uniquement par le compilateur C++ et pas par le compilateur C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifdef __cplusplus
      extern "C"{
    #endif
     
    //Plein de prototypes de fonctions C
     
     #ifdef __cplusplus
       }
     #endif
    Tes fichiers .c sont compilés par le compilateur C : Les inclusions sont faites et ton prototype est considéré normalement par ton compilateur : une fois dans le .C il trouve la déclaration de la fonction et crée une adresse pour ta fonction qui servira plus tard à ton linker.
    Ton fichier main.cpp est compilé par le compilateur C++ : Comme pour le compilateur C les inclusions sont effectués. Quand le compilateur arrive sur ton prototype de fonction il croit que c'est une fonction C++. Le système d'adressage interne des fonctions entre C et C++ n'est pas le même en effet les fonctions C++ gèrent la surcharge... Au moment de l'édition des liens, le linker tombe sur cette déclaration C++ et cherche l'adresse dans la table des fonctions C++ et plouf ! La fonction est dans la table C.

    En espérant que ça résolve ton problème.

    Un article qui explique ça bien mieux que moi et qui permet d'aller plus loin.

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Salut schonai;

    Je pensait aussi a l'idée d'un conflit mais même un créant un projet comme l'exemple (cf le premier message du sujet), j'ai l'erreur alors que ce ne sont que des .c
    Je vais tout de même essayer ta solutions, sa ne me coute rien.

    EDIT: schonai, tu est mon messie... Sa marche enfin, je ne comprend vraiment pas pourquoi mais ça marche, un grand merci, après tant de galère...

    Un grand merci à vous tous pour vos conseils et votre attention, merci beaucoup.

  11. #11
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 62
    Points : 162
    Points
    162
    Par défaut
    Code::blocks doit déterminer le compilateur à utiliser à partir de l'extension. Sous linux tu as du appeler explicitement gcc (ou un de ses amis) donc main.cpp ou main.c c'est pareil, il le compile en tant que C.

    Content d'avoir pu t'aider.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/02/2010, 12h49
  2. Problème debugger en programmation modulaire
    Par Henri dans le forum Code::Blocks
    Réponses: 0
    Dernier message: 04/12/2007, 11h56
  3. programmation modulaire
    Par barbarello dans le forum C++
    Réponses: 2
    Dernier message: 19/02/2006, 13h04
  4. [Projet] Programmation modulaire d'un projet.
    Par loverdose dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 18/11/2005, 21h59
  5. Problème programmation objet
    Par Contrec dans le forum MFC
    Réponses: 54
    Dernier message: 30/03/2005, 11h30

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