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 multiple definition


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut erreur multiple definition
    Bonjour a tous,

    Voila je debute en c, et j ai un peu de mal avec les variables globales. J ai un fichier header dont voila le contenu

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #ifndef COMMON_H
    #define COMMON_H
     
    #include <stdio.h> 
    #include <math.h>                      
    #include <malloc.h>                    
    #include <stdlib.h>                     
    #include <string.h>		
    #include <time.h>
     
    #define zero	(double)0.0
    #define one		(double)1.0
    #define two		(double)2.0
    #define three	(double)3.0
    #define four	(double)4.0
    #define five    (double)5.0
    #define six		(double)6.0
    #define seven	(double)7.0
    #define eight	(double)8.0
    #define pi      (double)acos(-one)
     
    extern int nmesh;
    extern int multigrid,testcase;
    extern double tol,cll,clr;
    extern double **dt;
    extern double *p2h;
    extern double **increment;
    extern int *nelems,*nnodes,*fcc;
    extern int ***pbc_list;
    extern int **nb_elem_pbc;
     
    struct Vector{double x,y;};
    struct Vertex{int nod1,nod2,nod3;};
    struct node
    {
    	double u;
    	int *elem;
    	double x,y;
    } **nod;
    struct edge
    {
    	int nod1,nod2;
    	double length;
    	int bd_mark;
    };
    struct triangle
    {
    	double u;
        Vector bary;
    	Vertex vert;
    	int neigh[3];
    	Vector norm[3];
    	double area;
    	edge edg[3];
    	int parent;
    	int child[4];
    } **tri;
     
    void read_input();
    void mesh_init();
    void mesh_refin();
    void write_mesh();
    void geometry();
    void initialize();
    void permut(int*,int*,int*);
    void solver();
    void lmg();
    void restriction(int,triangle*,triangle*);
    void restriction_res(int,double[],double[],triangle*);
    void interpolation(int,triangle*,triangle*,double[]);
    void forcing(int*,int*,int,int,triangle*,triangle*,
    			 node*,node*,int**,int**);
    void runge_kutta(int*,int,triangle*,node*,int**,double*);
    void right_hand_side(int*,int,triangle*, node*,int**,double[]);
    void right_hand_side2(int*,int,triangle*, node*,int**,double[]);
    void cal_err(int,double[],double*,int*);
    void output_struc();
    void output_unstruc();
    void mesh_conn();
    #endif
    et voici le fichier main

    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
     
    #include "common.h"
     
    using namespace std;
     
    int nmesh;
    int multigrid,testcase;
    double tol,cll,clr;
    double **dt;
    double *p2h;
    double **increment;
    int *nelems,*nnodes,*fcc;
    int ***pbc_list;
    int **nb_elem_pbc;
     
    int main(int argc, char *argv[])
    {
    	read_input();
    	mesh_init();
    	write_mesh();
    	geometry();
    	initialize();
    	solver();
    	output_struc();
    	output_unstruc();
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    j utilise dev-c++ et a la compilation j ai les messages suivants

    multiple definition of nmesh
    first defined here
    multiple definition of multigrid
    first defined here
    ..........
    ainsi de suite pour toutes les variables

    quelqu un pourrait m aider ?
    merci

  2. #2
    Membre éprouvé Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 866
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 866
    Par défaut
    Salut.

    Tu écris dans ton common.h
    Celà ne sert à rien.

    Si tu n'utilise ta variable nmesh que depuis ton main(), alors déclare la comme (variable locale) et retire la déclaration que tu as dans common.h

    Si tu veux l'utiliser comme variable globale depuis plusieurs fichiers qui ont #include "common.h", alors retire la déclaration dans ton main() et retire le mot clé extern dans ton common.h.

    Idem pour les autres variables...

    En fait, tu peux utiliser extern sur une fonction si tu as besoin d'utiliser celle-ci mais qu'elle est déclarée ailleurs.

    Autre chose, le n'existe pas en C ANSI; retire-le (tu n'en a pas besoin)

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    salut

    merci pour ta reponse. alors effectivement ces variables sont utilisees par d autres fonctions contenues dans d autres fichiers que le main.c, donc j ai mis un include dans l entete de chaque fichier. j ai fait comme tu m as dis, a savoir retirer le mot cle extern dans le common.h et enleve les declarations dans le main.c. mais ca ne marche toujours pas, j ai toujours les meme messages

  4. #4
    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 naffrancois Voir le message
    salut

    merci pour ta reponse. alors effectivement ces variables sont utilisees par d autres fonctions contenues dans d autres fichiers que le main.c, donc j ai mis un include dans l entete de chaque fichier. j ai fait comme tu m as dis, a savoir retirer le mot cle extern dans le common.h et enleve les declarations dans le main.c. mais ca ne marche toujours pas, j ai toujours les meme messages
    Ce que j'ai posté devrait fonctionner. Montre le code qui ne compile pas.

    Mais il est souhaitable d'éviter les globales, qui peuvent introduire un tas de problèmes, à commencer par la compréhension du code...

    Si tu y tiens, fait le correctement :

    http://emmanuel-delahaye.developpez....e=Page4#LXVIII

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    merci pour votre aide, je dois partir, je m y rejetterai demain matin
    Francois

  6. #6
    Membre averti
    Étudiant
    Inscrit en
    Juillet 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2009
    Messages : 17
    Par défaut
    Verifie bien que tes variable declarer dans ton .h ne soit presente nulle part
    et que tu ne les ai pas encore declarer dans tes autres .c qui utilisent eux aussi ces meme variables...

    Bon courage...

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par kain_tn Voir le message
    Si tu veux l'utiliser comme variable globale depuis plusieurs fichiers qui ont #include "common.h", alors retire la déclaration dans ton main() et retire le mot clé extern dans ton common.h.
    Non surtout pas. C'est justement ce genre de pratique qui provoque le problème de "multiple définition".
    Il faut bien déclarer la variable dans "common.h" avec le extern et la définir une fois dans un .c.

    L'idéal étant bien entendu de ne pas utiliser de telles variables globales.

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Par défaut
    Emmanuel, j ai donc fait comme vous m avez dit et ca compile parfaitement, merci beaucoup ! Quant a l utilisation de variables globales, bien que je ne sois pas un expert en programmation, je suis assez d accord avec le fait de ne pas les utiliser, autant que faire se peut. Mais le code sur lequel je bosse (pas celui la !) est tres tres gros, travailler localement reviendrait donc a faire passer en argument a de tres nombreuses fonctions enormement de variables... donc pour la lisibilite je ne suis pas sur que cela arrange quoi que ce soit ! en tout cas merci a vous tous

    Francois

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Bonjour,

    Dans le cas où le programme a besoin de nombreuses variables globales, il serait judicieux d'utiliser un variable de contexte. Cette variable de contexte contiendrait les variables globales. Un des avantages de cette méthode est qu'on ne passe qu'une variable comme argument à une fonction.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par jowo Voir le message
    Dans le cas où le programme a besoin de nombreuses variables globales, il serait judicieux d'utiliser un variable de contexte. Cette variable de contexte contiendrait les variables globales. Un des avantages de cette méthode est qu'on ne passe qu'une variable comme argument à une fonction.
    Précision, parce que le mot n'apparait pas : cette "variable de contexte" est bien sûr un pointeur sur une structure en règle générale, et/ou un entier servant de handle (l'entier est alors en général l'indice de la structure en question dans un tableau privé de structures).

    C'est quasiment l'équivalent exact du paramètre "this", caché, du C++ lors d'un appel de méthode.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  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 naffrancois Voir le message
    Emmanuel, j ai donc fait comme vous m avez dit et ca compile parfaitement, merci beaucoup ! Quant a l utilisation de variables globales, bien que je ne sois pas un expert en programmation, je suis assez d accord avec le fait de ne pas les utiliser, autant que faire se peut. Mais le code sur lequel je bosse (pas celui la !) est tres tres gros, travailler localement reviendrait donc a faire passer en argument a de tres nombreuses fonctions enormement de variables... donc pour la lisibilite je ne suis pas sur que cela arrange quoi que ce soit ! en tout cas merci a vous tous

    Francois
    Alors on utilise une structure de contexte dont on passe l'adresse. La structure contient les données nécessaires. de plus ça favorise organisation du code : on obtient un groupe de données (visibles ou non), associé à une série de fonctions de traitements de ces données, ce qui est la base de la programmation objet...

    Si les données ne sont pas visibles, on parle de type abstrait de données :
    http://emmanuel-delahaye.developpez....its-donnees-c/

  12. #12
    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 naffrancois Voir le message
    Bonjour a tous,

    Voila je debute en c, et j ai un peu de mal avec les variables globales. J ai un fichier header dont voila le contenu

    j utilise dev-c++ et a la compilation j ai les messages suivants

    multiple definition of nmesh
    first defined here
    multiple definition of multigrid
    first defined here
    ..........
    ainsi de suite pour toutes les variables
    Déjà, il faut compiler en C, si tu veux écrire un programme en C (et en C, il n'y a pas de 'namespace')...
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    In file included from C:\dev\hello\main.c:1:
    C:\dev\hello\common.h:50: error: syntax error before "Vector"
    C:\dev\hello\common.h:50: warning: no semicolon at end of struct or union
    C:\dev\hello\common.h:51: warning: type defaults to `int' in declaration of `vert'
    C:\dev\hello\common.h:51: error: ISO C forbids data definition with no type or storage class
    C:\dev\hello\common.h:53: error: syntax error before "norm"
    C:\dev\hello\common.h:53: warning: type defaults to `int' in declaration of `norm'
    C:\dev\hello\common.h:53: error: ISO C forbids data definition with no type or storage class
    C:\dev\hello\common.h:55: error: syntax error before "edg"
    C:\dev\hello\common.h:55: warning: type defaults to `int' in declaration of `edg'
    C:\dev\hello\common.h:55: error: ISO C forbids data definition with no type or storage class
    C:\dev\hello\common.h:58: error: syntax error before '}' token
    C:\dev\hello\common.h:58: warning: type defaults to `int' in declaration of `tri'
    C:\dev\hello\common.h:58: error: ISO C forbids data definition with no type or storage class
    C:\dev\hello\common.h:60: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:61: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:62: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:63: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:64: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:65: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:67: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:68: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:69: error: syntax error before "triangle"
    C:\dev\hello\common.h:69: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:70: error: syntax error before "triangle"
    C:\dev\hello\common.h:70: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:71: error: syntax error before "triangle"
    C:\dev\hello\common.h:71: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:72: error: syntax error before "triangle"
    C:\dev\hello\common.h:73: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:74: error: syntax error before "triangle"
    C:\dev\hello\common.h:74: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:75: error: syntax error before "triangle"
    C:\dev\hello\common.h:75: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:76: error: syntax error before "triangle"
    C:\dev\hello\common.h:76: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:78: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:79: warning: function declaration isn't a prototype
    C:\dev\hello\common.h:80: warning: function declaration isn't a prototype
    C:\dev\hello\main.c:3: error: syntax error before "namespace"
    C:\dev\hello\main.c:3: warning: type defaults to `int' in declaration of `std'
    C:\dev\hello\main.c:3: error: ISO C forbids data definition with no type or storage class
    C:\dev\hello\main.c:15: warning: unused parameter 'argc'
    C:\dev\hello\main.c:15: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 0 seconds)
    17 errors, 26 warnings
    Ceci compile correctement en 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
     
    #ifndef COMMON_H
    #define COMMON_H
     
    #define zero 0.0
    #define one 1.0
    #define two 2.0
    #define three 3.0
    #define four 4.0
    #define five 5.0
    #define six 6.0
    #define seven 7.0
    #define eight 8.0
    #define pi acos(-one)
     
    extern int nmesh;
    extern int multigrid, testcase;
    extern double tol, cll, clr;
    extern double **dt;
    extern double *p2h;
    extern double **increment;
    extern int *nelems, *nnodes, *fcc;
    extern int ***pbc_list;
    extern int **nb_elem_pbc;
     
    struct Vector
    {
       double x, y;
    };
    struct Vertex
    {
       int nod1, nod2, nod3;
    };
    struct node
    {
       double u;
       int *elem;
       double x, y;
    }
    **nod;
    struct edge
    {
       int nod1, nod2;
       double length;
       int bd_mark;
    };
    struct triangle
    {
       double u;
       struct Vector bary;
       struct Vertex vert;
       int neigh[3];
       struct Vector norm[3];
       double area;
       struct edge edg[3];
       int parent;
       int child[4];
    }
    **tri;
     
    void read_input (void);
    void mesh_init (void);
    void mesh_refin (void);
    void write_mesh (void);
    void geometry (void);
    void initialize (void);
    void permut (int *, int *, int *);
    void solver (void);
    void lmg (void);
    void restriction (int, struct triangle *, struct triangle *);
    void restriction_res (int, double[], double[], struct triangle *);
    void interpolation (int, struct triangle *, struct triangle *, double[]);
    void forcing (int *, int *, int, int, struct triangle *, struct triangle *,
                  struct node *, struct node *, int **, int **);
    void runge_kutta (int *, int, struct triangle *, struct node *, int **, double *);
    void right_hand_side (int *, int, struct triangle *, struct node *, int **, double[]);
    void right_hand_side2 (int *, int, struct triangle *, struct node *, int **, double[]);
    void cal_err (int, double[], double *, int *);
    void output_struc (void);
    void output_unstruc (void);
    void mesh_conn (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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include "common.h"
     
    #include <stdlib.h>
     
    int nmesh;
    int multigrid, testcase;
    double tol, cll, clr;
    double **dt;
    double *p2h;
    double **increment;
    int *nelems, *nnodes, *fcc;
    int ***pbc_list;
    int **nb_elem_pbc;
     
    int main (void)
    {
       read_input ();
       mesh_init ();
       write_mesh ();
       geometry ();
       initialize ();
       solver ();
       output_struc ();
       output_unstruc ();
     
       system ("PAUSE");
       return EXIT_SUCCESS;
    }

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/04/2011, 10h58
  2. Erreur de compilation "multiple definition of"
    Par cereal dans le forum Débuter
    Réponses: 3
    Dernier message: 22/02/2010, 17h29
  3. Erreur de "multiple definition"
    Par mess-mate dans le forum wxWidgets
    Réponses: 6
    Dernier message: 06/10/2008, 14h42
  4. Réponses: 8
    Dernier message: 19/09/2006, 15h42
  5. multiple definition
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 10/09/2003, 13h16

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