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 :

probleme inclusions/definitions multiples


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut probleme inclusions/definitions multiples
    Bonjour , je suis en train de faire un programme de gestion de processus.Cependant j'ai un petit problème avec l'inclusion de variables globales situées dans un fichier .h .Pour y remédier j'ai essayé avec le mot clé "extern" mais le problème persiste . Pourriez-vous donc m'éclairer svp?
    les erreurs en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    gcc tp3_main.o tp3_aff.o -o tp3_main
    tp3_aff.o: In function `verifaff':
    tp3_aff.c:(.text+0x7): undefined reference to `str1'
    tp3_aff.c:(.text+0x1c): undefined reference to `str2'
    tp3_aff.c:(.text+0x31): undefined reference to `str3'
    tp3_aff.c:(.text+0x46): undefined reference to `str4'
    tp3_aff.c:(.text+0x5b): undefined reference to `str5'
    tp3_aff.c:(.text+0x70): undefined reference to `str6'
    tp3_aff.c:(.text+0x85): undefined reference to `str7'
    tp3_aff.c:(.text+0x9a): undefined reference to `str8'
    le fichier auxquelles elles font réferences :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //str.h
    #ifndef STR_H
    #define STR_H
     
    extern char *str1;
    extern char *str2;
    extern char *str3;
    extern char *str4;
    extern char *str5;
    extern char *str6;
    extern char *str7;
    extern char *str8;
     
    #endif
    le fichier main.c(je n'ai mis que le code qui intervient dans l'erreur)
    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
     
    //main.c
    #include"tp3_str.h"
    #include"tp3_aff.h"
    #include <stdlib.h>
    #include <stdio.h>
     
     
    int main(int argc,char *argv[])
    {
    	char *str1=" _____                                                              |";
    	char *str2="|  __ \\                                                             |";
    	char *str3="| |__) |  _ __    ___     ___    ___   ___   ___   _   _   ___      |";
    	char *str4="|  ___/  |  __|  / _ \\   / __|  / _ \\ / __| / __| | | | | / __|     |";
    	char *str5="| |      | |    | (_) | | (__  |  __/ \\__ \\ \\__ \\ | |_| | \\__ \\     |";
    	char *str6="| |      | |    | (_) | | (__  |  __/ \\__ \\ \\__ \\ | |_| | \\__ \\     |";
    	char *str7="|_|      |_|     \\___/   \\___|  \\___| |___/ |___/  \\__,_| |___/     |";
    	char *str8="                                                                    |";
    }
    et enfin l'autre fichier de fonctions:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    //aff.c
    #include"tp3_str.h"
    #include"tp3_aff.h"
     
     
    void verifaff()
    {
    	printf("%s \n",str1);
    	printf("%s \n",str2);
    	printf("%s \n",str3);
    	printf("%s \n",str4);
    	printf("%s \n",str5);
    	printf("%s \n",str6);
    	printf("%s \n",str7);
    	printf("%s \n",str8);
    }
     
    void affprocess1()
    {
    	printf(" %s ",str1);
    	/*//printf("Père: %d ,Fils: %d [0]\n",getpid());*/
    	printf("%s \n",str2);
    	printf("%s \n",str3);
    	printf("%s \n",str4);
    	printf("%s \n",str5);
    	printf("%s \n",str6);
    	printf("%s \n",str7);
    	printf("%s \n",str8);
    }
    void affprocessn()
    {
    	printf(" %s ",str1);
    	/*printf("Père: %d ,Fils: %d [0]\n",getpid(),fork());*/
    	printf("%s \n",str2);
    	printf("%s \n",str3);
    	printf("%s \n",str4);
    	printf("%s \n",str5);
    	printf("%s \n",str6);
    	printf("%s \n",str7);
    	printf("%s \n",str8);
    }
    voila , votre aide me serait d'un grand secours car après avoir essayé différentes méthodes ces erreurs d'inclusions et de définitions persistent.
    En vous remerciant d'avance.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    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 186
    Points : 17 126
    Points
    17 126
    Par défaut
    extern signifie en gros "déclaration non définissante".

    Il faut quand même définir la variable quelque part.
    La variable doit être définie une et une seule fois (comme une fonction...)

    En général, il suffit de définir la variable dans un fichier .c (à part ou non)

    par exemple
    [CODE truc.h]extern int truc;[/CODE]
    [CODE truc.c]int truc;[/CODE]
    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
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    D'accord , j'avais compris en grandes lignes le fonctionnement du extern , mais je croyais que dans le cas de l'utilisation de la variable dans plusieurs fichiers, on ne pouvait pas définir plusieurs fois celle-ci.
    Je te remercie.

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    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 186
    Points : 17 126
    Points
    17 126
    Par défaut
    justement, on ne peut pas définir plusieurs fois la variable, mais on peut la déclarer plusieurs fois.

    Dans cet exemple, getTruc et truc sont déclarés dans les trois unités de compilations (les trois .o), mais ne sont définis que dans un seul.

    Code truc.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern const int truc;
    int getTruc(void);
    Code truc.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "truc.h"
    const int truc = 3;
    Code machin.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "truc.h"
    int getTruc(void){return truc;}
    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "truc.h"
    #include <stdio.h>
    int main(int argc, char** argv){
    printf("truc = %d (= %d)", getTruc(), truc);
    }

    Dans ton code, les variables externes ne sont pas définies du tout, d'où les "undefined reference"
    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
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par RasWisdom Voir le message
    D'accord , j'avais compris en grandes lignes le fonctionnement du extern , mais je croyais que dans le cas de l'utilisation de la variable dans plusieurs fichiers, on ne pouvait pas définir plusieurs fois celle-ci.
    Je te remercie.
    En fait, la compilation séparée (plusieurs fichiers compilés séparément puis liés en final) se passe en 2 phase
    1) chaque fichier est analysé au niveau sémantique. A ce niveau, le compilo a besoin de s'assurer que toutes les variables utilisées sont connues du programmeur. Mais comme une variable n'est définie qu'une fois, la solution a été de rajouter un mot clef indiquant au compilo "je connais cette variable mais je la définis ailleurs" => extern. Bien entendu il te faut avoir défini cette variable quelque part. Pour simplifier on la défini dans le source qui contient le main

    2) édition de lien entre les sources pour créer l'exécutable => l'ensemble des références à la variable est reliée à la zone mémoire représentée par la variable, zone créée lors de la définition

    Accessoirement, on peut aussi utiliser extern pour bypasser une variable locale et référencer la globale. exemple

    Code c : 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
    int toto=100;        // Variable globale
     
    int main()
    {
        int toto=5;      // Variable locale qui prend le pas sur la globale
     
        printf("toto=%d\n", toto);        // Affiche 5
     
        {
            extern int toto;    // Référence la globale dans ce sous-bloc
     
            printf("toto=%d\n", toto);  // Affiche 100
            toto=200;
            printf("toto=%d\n", toto);  // Affiche 200
        }
     
        printf("toto=%d\n", toto);        // Affiche toujours 5
    }

    Personnellement je fracasserais la tronche d'un développeur qui me fait ça mais juste pour dire que c'est quand-même possible...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2012
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Je vous remercie.

Discussions similaires

  1. Probleme definition multiple de variables
    Par ASRaider dans le forum C++
    Réponses: 5
    Dernier message: 30/12/2013, 16h07
  2. probleme de définition multiple
    Par gdpasmini dans le forum C
    Réponses: 40
    Dernier message: 05/07/2006, 14h57
  3. Probleme d'imbrication multiple
    Par Gwipi dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/03/2006, 18h36
  4. [POO] Problème inclusion dans une classe
    Par LordBob dans le forum Langage
    Réponses: 11
    Dernier message: 22/11/2005, 16h21
  5. Probleme inclusion
    Par bourbaki2003 dans le forum C++
    Réponses: 7
    Dernier message: 28/10/2005, 10h25

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