déclaration de tableaux dans header // erreur compilation

déclaration de tableaux dans header // erreur compilation

by Victor Benjamin Cartier-Negadi -
Number of replies: 5

Bonjour,

Nos tableaux contenants les différents quartiers et liens de notre ville étaient initialisés dans ville.cc, jusque là tout fonctionne.
Etant donné que nous avons besoin d'y accéder depuis d'autres modules, il serait judicieux  de les initialisés dans ville.h plutôt.

voici les deux tableaux en question:

std::vector<quartier> Quartiers;

std::vector<std::vector<unsigned int> > Links_tab(0,std::vector <unsigned int> (2));

Soucis lorsque nous essayons de compiler le projet à l'aide de "make" dans le terminal une fois le déplacement éffectué nous obtenons l'erreur suivante sur mac os:


duplicate symbol '_Quartiers' in:

    ville.o

    graphic.o

duplicate symbol '_Links_tab' in:

    ville.o

    graphic.o

duplicate symbol '_Quartiers' in:

    ville.o

    projet.o

duplicate symbol '_Links_tab' in:

    ville.o

    projet.o

ld: 4 duplicate symbols for architecture x86_64



 et l'erreur suivante sur la VM:


multiple definition of 'Links_tab'

multiple definition of 'Quartiers'

Makefile :30: recipe for target 'projet' failed 



Nous avons bien sur vérifié à plusieurs reprises le makefile. Au début nous pensions à une redondance d'include des différents headers mais ca ne semble pas être le cas. 

Les modules projet et graphic ont été décortiqués sans trouver quoi que ce soit...



Merci par avance


Tags:
In reply to Victor Benjamin Cartier-Negadi

Re: déclaration de tableaux dans header // erreur compilation

by Aurélien Bloch -

Salut,

Si tu déclares des variables dans ton ".h" ces variables seront redéclarées dans chaque ".o" qui l'inclue.
Ceci explique surement les définitions multiples.

Aurelien.

In reply to Aurélien Bloch

Re: déclaration de tableaux dans header // erreur compilation

by Victor Benjamin Cartier-Negadi -

  1. D'accord merci beaucoup. Mais comment faire alors pour avoir accès à ces tableaux en dehors du modules si ces derniers sont déclarés dans le fichier source .cc ? C'est à dire y avoir accès dans un autre module. 
In reply to Victor Benjamin Cartier-Negadi

Re: déclaration de tableaux dans header // erreur compilation

by Nathan Antoine Hervé Benavides -

tu doit créé un getteur,

sinon ta variable devient une variable globale ce qui est interdit

In reply to Nathan Antoine Hervé Benavides

Re: [SOLVED ] déclaration de tableaux dans header // erreur compilation

by Victor Benjamin Cartier-Negadi -

Bonjour,

Il suffisait de déclarer la classe ville en static dans le header afin qu'il n'y ait pas de soucis de duplication lors de la compilation. 

Merci pour votre aide,

Victor CN

In reply to Victor Benjamin Cartier-Negadi

Re: [pas vraiment SOLVED ] déclaration de tableaux dans header // erreur compilation

by Ronan Boulic -

static n'est pas la solution: en fait vous dupliquez votre tableau localement dans chaque fichier source où le fichier en-tête est inclus.

c'est pour cette raison que dans le slide 2 du cours sur static, on trouve "Ne JAMAIS mettre dans l’interface d’un module"

https://moodlearchive.epfl.ch/2019-2020/mod/resource/view.php?id=1015939


Un message précédent donnait la vraie solution : le module qui gère (localement) votre tableau doit:

- faire lui-même des traitements parce qu'il a accès direct à l'information.

- ou fournir des getter/setter au module de niveau supérieur qui a besoin de certaines valeurs