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 :

erreur mais je ne vois pas où


Sujet :

C

  1. #1
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut erreur mais je ne vois pas où
    Bonjour ,
    cela fait qlq mois que , je débute en C , j'essai de faire une programmation modulaire en séparant les fichiers sources .c et les headers .h mais le compilateur m'affiche une erreur gênante que j'avais du mal à retrouver !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    include <stdio.h>
    #include <stdlib.h>
    #include "fonction.h"
     
     
    int main ( )
    {
        int element;
        int valeur1,valeur2;
     
        printf("Hello world!\n");
        printf ("je suis libre les gars \n");
     
        printf ("entrer votre mot de passe :\n");
        scanf("%d", &element);
     
        printf ("entrer deux nombres:\n");
        scanf("%d %d ", &valeur1,&valeur2);
     
         printf ("la somme des  deux nombres: %d\n",mafonctionsomme(valeur1,valeur2));
     
        printf ("la difference des  deux nombres: %d\n",mafonctiondifference(valeur1,valeur2));
     
        return 0;
     
    }
    dans fonction.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef _FONCTION
    #define _FONCTION
    #include <stdlib.h>
    int mafonctionsomme (int a , int b);
     
    int mafonctiondifference(int a,int b;
    #endif
    dans fonction.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "fonction.h"
     
    int mafonctionsomme (int a , int b)
    {
        return a+b;
    }
     
    int mafonctiondifference(int a,int b)
    {
        return a-b;
    }
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sans_titre.c:29: erreur: expected «;», «,» or «)» before «{» token
    en tout cas l'erreur porte su l'accolade juste après main () pourtant cela me semble correct ..

    merci pour vos réponses !!


  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par razily Voir le message
    dans fonction.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef _FONCTION
    #define _FONCTION
    #include <stdlib.h>
    int mafonctionsomme (int a , int b);
    
    int mafonctiondifference(int a,int b;
    #endif

  3. #3
    Débutant Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Points : 154
    Points
    154
    Par défaut
    mais c'est vrai !! c'est tellement difficile de détecter une erreur comme çà vu qu'il y a plusieurs fichiers !! maintenant quand j'execute y a ces erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /tmp/ccIDT8db.o: In function `main':
    sans_titre.c:(.text+0x7c): undefined reference to `mafonctionsomme'
    sans_titre.c:(.text+0xa4): undefined reference to `mafonctiondifference'
    Compilation échouée.
    et quand j'ai essayé de changer le #include"fonction.h" par "fonction.c" çà marche et je ne comprends plus s'il faut insérer le .h ou le .c dans main !!
    j'ai vu sur le site qu'il insère le headers .h dans main !!
    est ce que quelqu'un peut m'expliquer cela ??
    autre remarque aussi , si vous executez ce code , il faudrait que vous tapez 3 chiffres sépraés pour que çà marche !! et il fai les calculs sur les deux premiers , en tout cas c'est un problème de saut à la ligne !! probablement !!

    mais en tout cas Merci à toi Tusbar d'avoir corrigé sur ce petit point (parenthèse) car je ne l'ai jamais remarqué !!


  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par razily Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <stdio.h>
    #include <stdlib.h>
    #include "fonction.h"

  5. #5
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par razily Voir le message
    mais c'est vrai !! c'est tellement difficile de détecter une erreur comme çà vu qu'il y a plusieurs fichiers !! maintenant quand j'execute y a ces erreurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /tmp/ccIDT8db.o: In function `main':
    sans_titre.c:(.text+0x7c): undefined reference to `mafonctionsomme'
    sans_titre.c:(.text+0xa4): undefined reference to `mafonctiondifference'
    Compilation échouée.
    et quand j'ai essayé de changer le #include"fonction.h" par "fonction.c" çà marche et je ne comprends plus s'il faut insérer le .h ou le .c dans main !!
    j'ai vu sur le site qu'il insère le headers .h dans main !!
    est ce que quelqu'un peut m'expliquer cela ??
    Facile !!!

    Dans ton .h, tu définis un(des) prototype(s)

    Mais comme tu ne les définis pas comme "extern", le linker s'attend à les trouver dans le module où ils sont déclarés.

    En incluant "fonction.h" dans "fonction.c", tu "écrases" les déclarations.
    En incluant "fonction.h" dans "main.c", tu déclares juste.. mais il n'y a pas de fonctions correspondantes..

    Si tu fais :

    fonction.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int mafonction..();
    main.c


    fonction.c

    rien (ou l'inclusion si tu veux, mais pas recommandé)

    ça va marcher (à condition de lier avec le .o)

  6. #6
    Membre régulier Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Points : 78
    Points
    78
    Par défaut Intrigué
    Bonjour souviron,

    Je suis assez étonne par ta réponse, car j'ai toujours programmé en ne faisant pas ce que tu conseilles de faire

    J'ai 3 fichiers
    main.c
    fonction.c
    fonctions.h

    Voici l'inclusion que je ferai
    main.c -> fonction.h
    fonction.c -> fonction.h
    fonction.h -> les lib comme stdio
    Et ca marche

    du coup je cherche a comprendre, est ce que c'est Visual qui me joue des tours lors de la compilation ou est ce correct ?

  7. #7
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    du coup je cherche a comprendre, est ce que c'est Visual qui me joue des tours lors de la compilation ou est ce correct ?
    Non, c'est correct. Les fonctions sont extern par défaut, et il n'est pas nécessaire de le faire explicitement. La déclaration de leur prototype dans un .h et l'inclusion de ce .h dans un .c ne sert pas à les rendre extern mais permet au compilateur de connaître le type retourné par les fonctions et le type des paramètres.

    fonction.c doit normalement inclure fonction.h (pour assurer la cohérence définition/déclaration au niveau de l'unité de compilation)

    Si pour la compilation de l'unité "fonction", on a besoin d'inclure un autre .h (par exemple <stdio.h> parce qu'il définit FILE), la question se pose de l'inclure dans fonction.c ou fonction.h . Si l'inclusion dans le .c permet la compilation, alors il doit être inclus dans le .c et non dans le .h .

  8. #8
    Membre régulier Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Points : 78
    Points
    78
    Par défaut
    Merci pour votre réponse diogene, j'y vois un peu plus clair et surtout, je m'aperçois que j'ai toujours "fait une erreur" avec l'inclusion des bibliothèques standard dans le header. C'est vrai que maintenant, ça me parait plus logique dans les sources.
    En tout cas, j'y vois nettement plus clair

    Merci pour ces precisions

    Et merci aussi pour les cours et tutoriels C et pour la FAQ C

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Facile !!!

    Dans ton .h, tu définis un(des) prototype(s)

    Mais comme tu ne les définis pas comme "extern", le linker s'attend à les trouver dans le module où ils sont déclarés.

    En incluant "fonction.h" dans "fonction.c", tu "écrases" les déclarations.
    En incluant "fonction.h" dans "main.c", tu déclares juste.. mais il n'y a pas de fonctions correspondantes..
    Euh, non, pas du tout. et 'extern' n'a rien à voir. Devant un prototype de fonction, il a une valeur purement documentaire en C.

    Si tu fais :

    fonction.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int mafonction..();
    main.c


    fonction.c

    rien (ou l'inclusion si tu veux, mais pas recommandé)

    ça va marcher (à condition de lier avec le .o)
    L'inclusion est tout à fait recommandée :

    http://video.google.com/videoplay?do...17817010204120

Discussions similaires

  1. Bête erreur de syntaxe mais je ne vois pas
    Par ETVigan dans le forum Langage
    Réponses: 4
    Dernier message: 02/05/2010, 18h37
  2. Erreur grossière mais je ne vois pas
    Par Oxygn44 dans le forum Langage
    Réponses: 5
    Dernier message: 10/11/2008, 10h36
  3. Erreur mais je ne vois pas où
    Par aureliegro dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/05/2007, 10h28
  4. erreur de syntaxe, mais je ne vois pas
    Par Argorate dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/08/2006, 12h12
  5. Réponses: 7
    Dernier message: 30/10/2005, 12h54

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