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 d'exécution de fichier


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 132
    Points : 35
    Points
    35
    Par défaut problème d'exécution de fichier
    salut,
    bon voila tout court mon problème j'ai trois fichiers :
    irda.h
    irda.c
    test.c
    j'ai deux variables globales déclaré dans irda.h :
    int kode ;
    int button_pressed ;
    quand je compile ces fichiers le message suivant apparait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [root@emblin remote_control]# arm-linux-gcc *.o irrecord.c test.c -o test -lpthread
    /tmp/ccW73Iso.o:(.bss+0x0): multiple definition of `button_pressed'
    /tmp/cccMUSim.o:(.bss+0x0): first defined here
    /tmp/ccW73Iso.o:(.bss+0x4): multiple definition of `Newkode'
    /tmp/cccMUSim.o:(.bss+0x4): first defined here
    collect2: ld returned 1 exit status
    à noter que j'ai bien vérifié que ces deux variables sont déclarés une seulle fois
    merci

  2. #2
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    No comment sur les globales. Juste pour votre problème, avez-vous mis un guard ou un #pragma once à votre .h ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 132
    Points : 35
    Points
    35
    Par défaut
    l'entête de mon fichier est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #if !defined(__IRRECORD_H__)
    #define __IRRECORD_H__
    //-----------------------------------------------------------------------------
    #if defined(__cplusplus)
    extern "c" {
    #endif

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    On peut voir le fichier.c qui les utilise ces var glob

  5. #5
    Nouveau membre du Club
    Inscrit en
    Novembre 2007
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 132
    Points : 35
    Points
    35
    Par défaut
    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
    #include "irrecord.h"
    #include "pthread.h"
    pthread_t get_button_pressed ;
     
    int main()
    {
     
    pthread_create(&get_button_pressed, NULL, get_remote_code, NULL);
    while(1)
    {
    	if ( Newkode == 1  )
    	{
    	Newkode = 0 ;
    	printf("la valeur de cccccces%d",button_pressed);
    	}
    }
    }

  6. #6
    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
    Si tu definis tes variables globales dans un .h, tu vas avoir des définitions multiples (si ton .h est inclus dans plusieurs .c).

    défini tes variables globales dans un .c et, dans le .h correspondant, déclare les en extern

  7. #7
    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 kris1 Voir le message
    bon voila tout court mon problème j'ai trois fichiers :
    irda.h
    irda.c
    test.c
    j'ai deux variables globales déclaré dans irda.h :
    int kode ;
    int button_pressed ;
    Mauvaise conception.
    1 - On ne définit pas d'objet ni de fonctions dans un header.
    2 - On utilise pas de globales sauf nécessité absolue[1].
    3 - Si on y est obligé (à démontrer...), on le fait correctement en mettant un préfixe indiquant que c'est une globale (G_), en plaçant la déclaration dans un header protégé contre les inclusions multiples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* data.h */
    #ifndef DATA_H
    #define DATA_H
     
    extern int G_kode ;
    extern int G_button_pressed ;
     
    #endif
    et la définition dans un .c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /* data.c */
    #include "data.h"
     
    int G_kode ;
    int G_button_pressed ;
    http://emmanuel-delahaye.developpez....s.htm#globales

    -----------------
    [1] Je rappelle que les pthreads ont un champ (void*pdata) qui est fait pour passer des adresses de contextes...

    http://emmanuel-delahaye.developpez....ds.htm#donnees

  8. #8
    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 Pierre Maurette Voir le message
    <...>#pragma once à votre .h ?
    Non standard. Aucun intérêt.

  9. #9
    Membre averti Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Points : 390
    Points
    390
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    <...>#pragma once à votre .h ?
    Non standard. Aucun intérêt.
    Ça, c'est du lourd... Relisez votre norme (§6.10.6) et épargnez-vous, ainsi qu'à moi, vos lapalissades grincheuses.

  10. #10
    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 Pierre Maurette Voir le message
    Ça, c'est du lourd... Relisez votre norme (§6.10.6) et épargnez-vous, ainsi qu'à moi, vos lapalissades grincheuses.
    Je ne vois pas le rapport avec une 'LaPalissade'...

    En tout cas, il n'y a aucun '#pragma once' dans n1124.

    Quand à §6.10.6, oui, #pragma existe depuis C90 (voire avant, je n'en sais rien), et alors ? Soit le paramètre (ici, 'once', non standard C99) est connu et interprété, mais la norme ignore comment (donc comportement indéfini), soit il est inconnu et il est proprement ignoré (ça, c'est un comportement standard spécifié).

    En définitive, c'est bien ce que je dis, c'est inutile, ou alors il faut préciser le contexte ce que tu as omis, d'où ma réaction.

  11. #11
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Il me semble que l'on définir des variables globales ( pas trop ) dans un un fichier entête .h à condition qu'elles soient statiques.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef DATA_H
    #define DATA_H
     
    static int G_kode ;
    static  int G_button_pressed ;
     
    #endif
    A vérifier...

  12. #12
    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 dj.motte Voir le message
    Il me semble que l'on définir des variables globales ( pas trop ) dans un un fichier entête .h à condition qu'elles soient statiques.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef DATA_H
    #define DATA_H
     
    static int G_kode ;
    static  int G_button_pressed ;
     
    #endif
    A vérifier...
    Purée, mais tais-toi donc... Et apprends le C une bonne fois pour toutes, ça évitera la pollution...

    Si on fait ça, on va créer une instance de la variable par inclusion réussie et si on écrit dans une, ça ne pas modifier les autres par magie... Alors réfléchis un peu avant de poster une ânerie, ça nous fera des vacances...
    Date d'inscription: décembre 2002
    Ca fait plus de 5 ans que tu bricoles en C et tu ne comprends toujours pas les bases ?

    Arrête les frais, fait autre chose, des crêpes, par exemple. C'est bon les crêpes...

  13. #13
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Emanuel vous écrivez :
    Si on fait ça, on va créer une instance de la variable par inclusion réussie et si on écrit dans une, ça ne pas modifier les autres par magie... Alors réfléchis un peu avant de poster une ânerie, ça nous fera des vacances...
    Ce n'est pas la peine d'être déplaisant pour si peu. Je ne comprends pas ce que tu veux dire, si on écrit dans l'une ça ne va pas écrire dans l'autre par magie ?

    Pourquoi en écrivant dans la première de cette variable cela devrait en modifier l'autre ? Franchement ton explication est un peu juste.

  14. #14
    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 dj.motte Voir le message
    Je ne comprends pas ce que tu veux dire, si on écrit dans l'une ça ne va pas écrire dans l'autre par magie ?

    Pourquoi en écrivant dans la première de cette variable cela devrait en modifier l'autre ? Franchement ton explication est un peu juste.
    Quel est le but d'une globale ? C'est d'être une variable persistante accessible de partout en lecture et en écriture.

    Par exemple (simplifié) dans data.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "data.h"
    int G_a;
    dans data.h :
    dans un source x.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "data.h"
     
    x_f()
    {
       G_a = 123;
    }
    et dans un autre source y.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "data.h"
     
    y_f()
    {
       printf ("G_a = %d\n", G_a);
    }
    Ca, cest le fonctionnement 'canonique'.

    Mais si tu mets 'static' dans le .h,
    tu définis 3 variables G_a distinctes et de portée limitée au module courant :
    • une dans data.c (non utilisée)
    • une dans x.c (écrite et jamais lue)
    • une dans y.c (lue, mais jamais écrite, donc valant 0)

    Je te laisse tirer les conclusions...

  15. #15
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    D'abord je ne mets jamais de variables globales de un .h.
    C'était juste pour tester.

    Le test suivant ne semble pas poser de problème :


    dans data.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef __DATA_H
     #define _DATA_H
     
      static int g_x ;
      static int g_y ;
     
    #endif
    dans data.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
    #include "data.h"
     
    void  do1()
    {  g_x = 10 ;
       g_y = 20 ;
       printf("do1 = %d %d\n", g_x, g_y ) ;
    }

    dans test.c
    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
     
    #include <stdio.h>
    #include "data.h"
     
    extern void do1();
     
    void  do2()
    {  g_x = 100 ;
       g_y = 200 ;
       printf("do2 = %d %d\n", g_x, g_y ) ;
    }
     
    int main()
    {
       do1();
       do2();
       return 0 ;
    }
    ça compile bien pourtant.

  16. #16
    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 dj.motte Voir le message
    Le test suivant ne semble pas poser de problème :
    <...>
    ça compile bien pourtant.
    Bah, du code qui compile, ça ne signifie pas qu'il soit correct ni qu'il fasse ce qu'on attend de lui. S on veut démontrer quelquechose, il faut le faire correctement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    /* data.h */
    #ifndef DATA_H
    #define DATA_H
     
    static int g_x;
    static int g_y;
     
    void do1 (void);
     
    void data_print (void);
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* data.c */
    #include "data.h"
    #include <stdio.h>
     
    void do1 (void)
    {
       g_x = 10;
       g_y = 20;
    }
     
    void data_print (void)
    {
       printf ("data: %d %d\n", g_x, g_y);
    }
    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
    28
    29
    /* main.c */
    #include <stdio.h>
     
    #include "data.h"
     
    void do2 (void)
    {
       g_x = 100;
       g_y = 200;
    }
     
    int main (void)
    {
       printf ("main: %d %d\n", g_x, g_y);
       data_print ();
       printf ("\n");
     
       do1 ();
       printf ("main: %d %d\n", g_x, g_y);
       data_print ();
       printf ("\n");
     
       do2 ();
       printf ("main: %d %d\n", g_x, g_y);
       data_print ();
       printf ("\n");
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    main: 0 0
    data: 0 0
     
    main: 0 0
    data: 10 20
     
    main: 100 200
    data: 10 20
     
     
    Press ENTER to continue.
    On voit bien que les données de main et celles de data sont différentes et qu'il n'y a donc pas de 'globales', mais justes des statiques du même nom (ce qui est techniquement correct, voir voulu, mais dans ce cas pourquoi le .h ?)

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/05/2010, 11h10
  2. Réponses: 2
    Dernier message: 05/11/2009, 11h58
  3. Réponses: 3
    Dernier message: 23/12/2008, 12h24
  4. Réponses: 3
    Dernier message: 21/07/2008, 16h15

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