Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/02/2013, à 14:31

G.I.Bdeking

multiple definition of...

Bonjour à tous! je poste aujourd'hui ce message car, dans les méandres de mon programme, j'ais rencontré ces erreurs:

Compiling: 
obj/Debug/Jeu::aff.o: In function `clic(int, int)':
Jeu.h:8: multiple definition of `plateau'
Jeu.h:8: first defined here
Jeu::aff.o: In function `__static_initialization_and_destruction_0':
Jeu.h:28: multiple definition of `caseActuelle'
Jeu.h:28: first defined here
Jeu::aff.o:(.bss+0x100): multiple definition of `valCase'
Jeu.o:(.bss+0x100): first defined here
Jeu::aff.o:(.bss+0x1c8): multiple definition of `bat1'
Jeu.o:(.bss+0x1c8): first defined here
Jeu::aff.o:(.bss+0x1cc): multiple definition of `bat2'
Jeu.o:(.bss+0x1cc): first defined here
Jeu::aff.o:(.bss+0x1d0): multiple definition of `bg'
Jeu.o:(.bss+0x1d0): first defined here
Jeu::aff.o:(.bss+0x1d4): multiple definition of `quadriageX' .............................................................................................................................. ......................................
............................................
..........................................
Process terminated with status 1 (0 minutes, 4 seconds)
26 errors, 0 warnings

Voila... c'est assez embrouillé... voici le code complet:

Main.cpp:

#include "Jeu.h"
#include "init.h"
#include "Define.h"

///Jeu jeu;

using namespace std;


int main(int argc, char **argv)
{
    int valBatM(1);

    bool fin(false);

    ///initialisation de base de la SDL
	SDL_Event event;
	SDL_Surface *screen;

	if(!init(screen)){
	cout<<"problème de chargement des fonctions de base du jeu, code d'erreur: vista (aie aie aie...)"<<endl;
	SDL_Quit;}

	///Initialisation
	if(SDL_Init(SDL_INIT_VIDEO)!=0) {
		cout << "Probleme pour initialiser SDL: " << SDL_GetError() << endl;
		return 1;
	}

    ///Mettre un titre à la fenêtre
    SDL_WM_SetCaption("mine battle V0.01", NULL);

	///Ouvrir une fenetre
	screen = SDL_SetVideoMode(WIDTH,HEIGHT, 32,
			SDL_DOUBLEBUF | SDL_HWSURFACE);
    if(screen==NULL)
    	fin = true;

	///Boucle generale
	while(!fin)
	{
		///Traiter les evenements (notez l'utilisation de PollEvent)
		while(SDL_PollEvent(&event))
		{
			switch(event.type)
			{
				case SDL_QUIT:
					fin=true;
					break;
					///si on appuye sur une touche:
				case SDL_KEYUP:
				    switch (event.key.keysym.sym)
				    {
				        case SDLK_q:
                           fin = true;
                            break;
				    }
				    break;

					///Si on appuye sur un bouton de la souris:
				case SDL_MOUSEBUTTONUP:
				    ///si ce bouton est celui de gauche
				    if (event.button.button == SDL_BUTTON_LEFT)
				    ///démarrage de la classe Jeu:
					//jeu.clic(event.button.x, event.button.y);
					break;
				default:
					break;
			}

            SDL_Delay(10);
		}

    SDL_Flip(screen);
    SDL_Delay(50);
	//jeu.aff(screen);

	}

	SDL_Quit();

	return 0;
}

init.h:

#ifndef INIT_H_INCLUDED
#define INIT_H_INCLUDED
#include "Define.h"

using namespace std;

bool init(SDL_Surface *screen)
{
    int i,j;

    ///On met toutes les cases à Vide
	for(i=0;i<caseEcran;i++)
		for(j=0;j<caseEcran;j++)
			plateau[i][j] = Vide;

    //Valeur par défaut pour les surfaces
    bat1=NULL;
    bat2=NULL;
    bg=NULL;

      	int x, y, X, Y;

    ///initialisation de la valeur des cases du plateau cases
    valCase[0][0][0]=0;
    valCase[0][0][1]=0;

    for (y=0;y<caseEcran;y++)
    {
        for (X=1;X<caseEcran;X++)
            valCase[X][y][0]=WIDTH/caseEcran*X;

        X = 0;
    }
    for (x=0;x<caseEcran;x++)
    {
        for (Y=1;Y<caseEcran;Y++)
            valCase[x][Y][1]=HEIGHT/caseEcran*Y;

        Y = 0;
    }


    //Vérification de l'allocation des surfaces
    if(bat1!=NULL)
            SDL_FreeSurface(bat1), bat1 = NULL;

    if(bat2!=NULL)
            SDL_FreeSurface(bat2), bat2 = NULL;

    if(bg!=NULL)
            SDL_FreeSurface(bg), bg = NULL;

    if(quadriageX!=NULL)
            SDL_FreeSurface(quadriageX), quadriageX = NULL;

    if(quadriageY!=NULL)
            SDL_FreeSurface(quadriageY), quadriageY = NULL;


    //On charge toutes les images dans les surfaces associées
    bat1 = SDL_LoadBMP("o.bmp");
    bat2 = SDL_LoadBMP("x.bmp");
    bg = SDL_LoadBMP("bg.bmp");
    quadriageX = SDL_LoadBMP("quadriageX.bmp");
    quadriageY = SDL_LoadBMP("quadriageY.bmp");

    //On teste le retour du chargement
    if((bat1==NULL))
    	{
    	cout << "Probleme de chargement de O.bmp, l'Image existe-t'elle?" << endl;
    	return false;
    	}
    else if((bat2 == NULL))
        {
        cout<< "Probleme de chargement de X.bmp, l'Image existe-t'elle?" << endl;
    	return false;
        }
    else if((bg== NULL))
        {
        cout<< "Probleme de chargement de l'Image de fond (bg.bmp), l'Image existe-t'elle?" << endl;
    	return false;
        }
    else if((quadriageX==NULL))
        {
            cout<<"Probleme de chargement de l'Image quagriageX.bmp, l'Image existe-t'elle?"<<endl;
        }
    else if((quadriageY==NULL))
        {
            cout<<"Probleme de chargement de l'Image quagriageY.bmp, l'Image existe-t'elle?"<<endl;
        }

    //Mis en place de la transparence
    if(SDL_SetColorKey(bat1,SDL_SRCCOLORKEY,0)==-1)
        cout << "Erreur avec la transparence du batiment 1" << endl;

    if(SDL_SetColorKey(bat2,SDL_SRCCOLORKEY,0)==-1)
        cout << "Erreur avec la transparence du batiment 2" << endl;

    return true;
}
bool unInit(SDL_Surface *screen)
{
    ///On libére les surfaces
    SDL_FreeSurface(bat1);
    SDL_FreeSurface(bg);
    SDL_FreeSurface(bat2);
}

#endif // INIT_H_INCLUDED

Define.h

#ifndef DEFINE_H_INCLUDED
#define DEFINE_H_INCLUDED

#include <string.h>
#include <cstdlib>
#include <SDL.h>
#include <iostream>


///Longueur (en pixel) de l'écran
const int WIDTH = 1000;
const int HEIGHT = 600;


///Le nombre de case dans les dimentions x ou y.
const int caseEcran = 5;


enum Case {Vide=0,batiment1,batiment2};
Case plateau[caseEcran][caseEcran];


    	///La position du clic actuelle (quelle case)
        int caseActuelle[caseEcran][caseEcran];

        ///La position où bliter l'image sur les "cases" (ces valeurs ne doivent pas changer en cours de programme!)
        int valCase[caseEcran][caseEcran][2];

    	///Initialisation des surface
    	SDL_Surface *bat1, *bat2, *bg, *quadriageX, *quadriageY;

    	///Variable pour un tour
    	Case batiments;

        ///Variable qui sert à savoir quel batiment est sélectionné [se référer à la fonction clavier]
    	int batM;

#endif // DEFINE_H_INCLUDED

comVar.h

#ifndef COMVAR_H_INCLUDED
#define COMVAR_H_INCLUDED

enum Case {Vide=0,batiment1,batiment2};
Case plateau[caseEcran][caseEcran];


    	///La position du clic actuelle (quelle case)
        int caseActuelle[caseEcran][caseEcran];

        ///La position où bliter l'image sur les "cases" (ces valeurs ne doivent pas changer en cours de programme!)
        int valCase[caseEcran][caseEcran][2];

    	///Initialisation des surface
    	SDL_Surface *bat1, *bat2, *bg, *quadriageX, *quadriageY;

    	///Variable pour un tour
    	Case batiments;

        ///Variable qui sert à savoir quel batiment est sélectionné [se référer à la fonction clavier]
    	int batM;


#endif // COMVAR_H_INCLUDED

Jeu.h

#ifndef JEU_H_INCLUED
#define JEU_H_INCLUED

#include "Define.h"
//#include "comVar.h"

void clic(int x, int y)
{
    int i,j;
    int w,h;

    ///On recupere la largeur et l'hauteur d'une case
    w = WIDTH/caseEcran;
    h = HEIGHT/caseEcran;

    ///Calcul de la case associée
    i = y/h;
    j = x/w;

    //caseActuelle[i][j]

    //Si la case est vide, on met à jour son type et la variable batiments
    if(plateau[i][j]==Vide)
    	{
	plateau[i][j] = batiments;
	batiments = batiment1;
	}
}

#endif

Si je met Le fichier Jeu.h en commentaire, le code compile et tout se passe bien...

Bon, à vous!

PS: Je suis sous code::block; J'ais la biblio SDL;Kubuntu


"Le désir sincère d'aider est l'essence du logiciel libre. Trouvez y un poste où vous serez utiles, même si ce n'est que de répondre aux libristes sur des forum, et vous trouverez votre place dans ce nouveau monde."

Hors ligne

#2 Le 24/02/2013, à 05:41

Melrock

Re : multiple definition of...

Bonjour,

Déjà c'est très bizarre ta façon de mettre du code exécutable dans des *.h ...
Je ne vois pas vraiment l'intérêt.

Ce serait bien que tu nous donne la commande de compilation.
Si tu compiles uniquement Main.cpp, je ne comprends pas les messages d'erreur (puisque tu as protégé tes *.h contre les inclusions multiples).

Bien sûr, si tu essaies de compiler directement tes *.h ou si tu as d'autres sources *.c ou *.cpp qui les incluent et que tu as oubliés de mentionner, c'est normal : tu définis plusieurs fois les mêmes variables et le compilateur te dis que tu définis plusieurs fois les mêmes variables : tout va bien.

A+


Tout problème a sa solution, donc s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne

#3 Le 24/02/2013, à 06:11

J5012

Re : multiple definition of...

manque les D de included dans jeu.h (les deux premieres lignes)

Hors ligne

#4 Le 24/02/2013, à 09:39

lann

Re : multiple definition of...

Tu définis au moins deux fois la variable plateau :

dans Define.h : Case plateau[caseEcran][caseEcran];
dans comVar.h : Case plateau[caseEcran][caseEcran];

Je ne sais pas si tu fais du C ou du C++ mais comme l'a dit Melrock : c'est bizarre de mettre le code dans un fichier header. D'habitude on ne met que les définitions de fonction ou variable dans les .h
Les fichiers .c ont quant à eux le code exécutable à proprement parlé.

Si tu fais du C++, dans le fichier .h, tu définis tes classes
Pour l'instant tu en as aucune

Dernière modification par lann (Le 24/02/2013, à 13:34)


<Modéré>

Hors ligne

#5 Le 24/02/2013, à 11:07

Melrock

Re : multiple definition of...

Oui, comVar.h et Define.h sont complètement redondants, mais c'est pas ça : si j'ai bien lu, comVar.h n'est inclus nulle part ...
A mon avis, il en manque la moitié.
Comment, sinon, Code::Blocks inventerait un "aff.o" ?


Tout problème a sa solution, donc s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne

#6 Le 24/02/2013, à 13:24

G.I.Bdeking

Re : multiple definition of...

En fait, il y a 4 autres fichiers mais ceux-ci sont vides, la réponse de lann était la solution à mon problème, merchi, et c'était tellement bête...
désolé pour le dérangement tongue. Je n'ais pas vu l’intérêt de créer une classe pour un truc qui est utilisé qu'une fois dans mon programme.

Et merci!


"Le désir sincère d'aider est l'essence du logiciel libre. Trouvez y un poste où vous serez utiles, même si ce n'est que de répondre aux libristes sur des forum, et vous trouverez votre place dans ce nouveau monde."

Hors ligne

#7 Le 25/02/2013, à 03:03

Melrock

Re : multiple definition of...

G.I.Bdeking a écrit :

la réponse de lann était la solution à mon problème

Alors que comVar.h n'est inclu nulle part ?
Il communique par télépathie avec ton projet ?

Je crois qu'il y a quelque chose qui m'échappe ... yikes


Tout problème a sa solution, donc s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.

Hors ligne