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'édition de liens en C++ (LNK2019), sous VC++ 2010


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Problème d'édition de liens en C++ (LNK2019), sous VC++ 2010
    Bonjour à tous ceux qui m'aideront ou auront essayé de le faire, ainsi qu'à toute la communauté !

    Je ne tourne pas autour du pot et vous explique de suite mon problème.
    Je dois développer un jeu en C++ pour un projet à l'école, mais je bloque sur un soucis qui, je pense, vient de mes déclarations de fonctions, de l'initialisation de mes variables et de l'utilisation des deuxièmes en tant que paramètres des premières. Pour info je travaille avec VisualC++ 2010 et suis sous Windows 7.

    J'ai donc créé une classe AffichageManager qui lance tel ou tel affichage (accueil, menu, jeu...) selon la touche enfoncée, une classe EventManager qui "écoute" les touches appuyées et enfin une classe Fenetre qui est mère de PageAccueil et PageMenu.
    Voici la façon dont j'ai pensé le développement du jeu :
    D'abord je crée une fonction LancementAffichage() qui, après avoir instancié un objet de chaque classe, exécute la création de la fenêtre grâce au constructeur de la classe Fenetre.
    Ensuite l'instance de Fenetre exécute l'affichage de l'accueil (LancementAccueil(PageAccueil pageAccueil)).
    Enfin l'instance de EventManager attend que l'utilisateur appuie sur une touche pour effectuer telle ou telle action.

    Mon problème se trouve au niveau de la construction des liens puisque j'ai un message d'erreur LNK2019 me signalant"unresolved external symbol "public: void __thiscall EventManager::KeyEvent(class PageAccueil,class PageMenu,class AudioManager)" (?KeyEvent@EventManager@@QAEXVPageAccueil@@VPageMenu@@VAudioManager@@@Z) referenced in function "public: void __thiscall AffichageManager::LancementAffichage(void)" (?LancementAffichage@AffichageManager@@QAEXXZ)

    Voici le code de AffichageManager et EventManager, là où je pense se situe l'erreur, mais peut-être je me trompe...
    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
    #include "StdAfx.h"
    #include "AffichageManager.h"
    #include "Fenetre.h"
    #include "PageAccueil.h"
    #include "PageMenu.h"
    #include "EventManager.h"
    #include "AudioManager.h"
     
     
    AffichageManager::AffichageManager(void)
    {
    }
     
     
    AffichageManager::~AffichageManager(void)
    {
    }
     
     
     
     
     
    void AffichageManager::LancementAffichage()
    {
    	Fenetre *f = new Fenetre(800, 600, 32, SDL_HWSURFACE);
    	AudioManager aM = AudioManager();
     
    	PageAccueil pA = PageAccueil();
    	PageMenu pM = PageMenu();
    	EventManager *eM = new EventManager();
     
    	f->LancementAccueil(pA);
    	aM.PlayMusic("menu");
    	eM->KeyEvent(pA, pM, aM);
    }
    EventManager :
    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
    #include "StdAfx.h"
    #include "EventManager.h"
     
     
    EventManager::EventManager(void)
    {
    }
     
     
    EventManager::~EventManager(void)
    {
    }
     
     
     
     
     
    void KeyEvent(PageAccueil pageAccueil, PageMenu pageMenu, AudioManager audioManager)
    {
    	int continuer = 1;
    	SDL_Event evenement;
     
    	while (continuer)
    	{
    		// On attend un évènement clavier et on switch selon la touche pressée
    		SDL_WaitEvent(&evenement);
    		switch(evenement.type)
    		{
    			case SDL_QUIT:
    				continuer = 0;
    				break;
     
    			case SDL_KEYDOWN:
    				switch(evenement.key.keysym.sym)
    				{
    					case SDLK_a:
    						continuer = 0;
    						break;
    					case SDLK_s:
    						audioManager.PauseSon();
    						break;
    					case SDLK_RETURN:
    						pageAccueil.Affichage();
    						break;
    					case SDLK_ESCAPE:
    						pageMenu.Affichage();
    						break;
    				}
    				break;
    		}
    	}
    }
    Je ne mets pas les ".h" car les fonctions sont déclarées comme indiquées lors de leur définitions.


    Merci beaucoup pour toute l'aide que vous pourrez m'apporter,

    Paicito


    PS: post replacé car initialement mis dans la mauvaise rubrique du site...

  2. #2
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    hello,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void EventManager::KeyEvent(PageAccueil pageAccueil, PageMenu pageMenu, AudioManager audioManager)
    {
    	int continuer = 1;
    	SDL_Event evenement;
            ...
    ça marchera surement mieux conne ça

    et un petit conseil si je puis me permettre, passe tes objets par référence si possible, ça évitera des copies d'objets.
    jmv

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci mille fois jmv,

    Erreur idiote mais il me semble que j'ai passé trop de temps à en réparer d'autres, du coup les choses les plus basiques me passent devant...
    Pour le passage en référence tu as bien raison, c'est juste que je voulais m'éviter des ereurs dues aux relations adresse/donnée.

    Encore merci, et bonne fin de dimanche !

  4. #4
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je relance ce post car j'ai encore un problème que j'avais essayé de contourner en créant une classe gérant l'affichage (AffichageManager).
    Or, bien que la solution ait été mise en place avec succès l'erreur persiste.

    Pour info je travaille avec la librairie graphique SDL.
    Avec cette librairie, pour afficher une image dans une fenêtre il faut la "coller" dessus grâce à la fonction SDL_BlitSurface().
    J'explique donc mon problème :
    Lorsque je souhaite afficher une image à partir de la classe PageAccueil, je fais appel à une fonction définie dans sa classe mère (Fenetre::AffichageImage(int PositionImageX, int PositionImageY, const char *URLimage)). Cette fonction récupère les différentes propriétés rentrées en paramètres et les utilisent pour "coller" l'image sur la fenêtre ouverte par le constructeur de la classe mère, représentée par le pointeur "fenetre".

    C'est exactement là où se trouve mon problème, apparemment la fonction ne semble pas pouvoir accéder aux données représentées par fenetre.
    Voici le message affiché par le debugger : Unhandled exception at 0x68128c3a in MonJeu.exe: 0xC0000005: Access violation reading location 0xcdcdcdf9.


    Voici le code de la classe Fenetre :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    #include "stdafx.h"
    #include "Fenetre.h"
     
     
     
     
     
    Fenetre::Fenetre()
    {
    }
     ////////////////////////////////////////////////////////////////////////////////
     ////////// Constructeur, en paramètres la configuration de la fenêtre //////////
     ////////////////////////////////////////////////////////////////////////////////
    Fenetre::Fenetre(int largeur, int hauteur, int nbCouleurs, Uint32 flags)	// Le type Uint32 est un type SDL pour les paramètres des fonctions
    {
    	setLargeur(largeur);
    	getLargeur();
    	setHauteur(hauteur);
    	getHauteur();
    	setNbCouleurs(nbCouleurs);
    	getNbCouleurs();
    	setFlags(flags);
    	getFlags();
     
     
    	 //////////////////////////////////////////////////////////////////////////////
    	 /////////// Initialisation de la fenêtre supportant                            ///////////
    	 /////////// l'application directement à la construction de l'objet ///////////
    	 //////////////////////////////////////////////////////////////////////////////
    	// Initialisation de la video et du son et de l'écriture//
    	SDL_Init(SDL_INIT_VIDEO);
     
    	// Chargement de l'icone de la fenêtre avant le chargement de ladite fenêtre.
    	SDL_WM_SetIcon(IMG_Load("Media/Images/Icones/icone.bmp"), NULL);
     
    	// Insertion des valeurs de configuration de la fenetre grace au constructeur de la classe Fenetre. 
    	fenetre = SDL_SetVideoMode(getLargeur(), getHauteur(), getNbCouleurs(), getFlags());
     
    	// Titre de la fenetre //
    	SDL_WM_SetCaption("Bomberman", NULL);
     
    };
     
     
     
     
     
     /////////////////////////////////////////////////
     ////////// Début des Getters / Setters //////////
     /////////////////////////////////////////////////
    void Fenetre::setLargeur(int newLargeur)
    {
    	_largeur = newLargeur;
    };
     
    int Fenetre::getLargeur()
    {
    	return	_largeur;
    };
     
     
    void Fenetre::setHauteur(int newHauteur)
    {
    	_hauteur = newHauteur;
    };
     
    int Fenetre::getHauteur()
    {
    	return _hauteur;
    };
     
     
    void Fenetre::setNbCouleurs(int newNbCouleur)
    {
    	_nbCouleurs = newNbCouleur;
    };
     
    int Fenetre::getNbCouleurs()
    {
    	return _nbCouleurs;
    };
     
     
    void Fenetre::setFlags(Uint32 newFlags)
    {
    	_flags = newFlags;
    };
     
    Uint32 Fenetre::getFlags()
    {
    	return _flags;
    };
     /////////////////////////////////////////////////
     /////////// Fin des Setters / Getters ///////////
     /////////////////////////////////////////////////
     
     
     
     
     
     ////////////////////////////////////////////////////////////
     /////////// Fonction affichant la page d'accueil ///////////
     ////////////////////////////////////////////////////////////
    void Fenetre::LancementAccueil(Fenetre *pageAccueil)
    {
    	//pageAccueil = new PageAccueil();
     
    	// Instanciation d'un objet PageAccueil avec exécution de son affichage
    	pageAccueil->Affichage();
     
    	// Mise en attente du programme jusqu'à action de l'utilisateur //
    	//pageAccueil->AttenteEvent();
    };
     
     
     
     
     
     ////////////////////////////////////////////////
     /////////// Fonction Affichage Image ///////////
     ////////////////////////////////////////////////
    void Fenetre::AffichageImage(int positionImageX, int positionImageY, const char *urlImage)
    {
    	SDL_Surface *nouvelleImage = NULL;
     
    	SDL_Rect positionImage;
    	positionImage.x = positionImageX;
    	positionImage.y = positionImageY;
     
     
    	// Chargement des images et collage sur l'écran.
    	nouvelleImage = IMG_Load(urlImage);
    	SDL_BlitSurface(nouvelleImage, NULL, fenetre, &positionImage);
     
    	// Mise à jour de l'écran.
        SDL_Flip(fenetre);
     
    	// Lidération de la mémoire utilisée.
    	SDL_FreeSurface(nouvelleImage);
    };
     
     
     
     
     
     //////////////////////////////////////////
     /////////// Fonction Ecriture  ///////////
     //////////////////////////////////////////
    void Fenetre::Ecrire(const char *TexteAEcrire, int positionTexteX, int positionTexteY, int tailleTexte, int CouleurRouge, int CouleurVerte, int CouleurBleu)
    {
    	SDL_Surface *texte;
     
    	// Déclaration de la du pointeur vers la police //
    	TTF_Font *police;
     
    	// Couleur de l'écriture //
    	SDL_Color couleur = {CouleurRouge, CouleurVerte, CouleurBleu};
     
    	// On initialise SDL_TTF //
    	TTF_Init(); 
     
    	// On ouvre la police //
    	police = TTF_OpenFont("police.ttf", tailleTexte);
     
    	// On stocke le texte et ses caractéristiques dans la variable de type SDL_SURFACE //
    	texte = TTF_RenderText_Blended(police, TexteAEcrire, couleur);
     
    	// Position de l'écriture //
    	SDL_Rect positionTexte;
    	positionTexte.x = positionTexteX;
    	positionTexte.y = positionTexteY;
     
    	// On colle le texte sur l'écran //
    	SDL_BlitSurface(texte, NULL, fenetre, &positionTexte);
     
    	// Fermeture de la police ensuite on quitte TTF_Quit //
    	TTF_CloseFont(police); 
     
    	// Lidération de la mémoire utilisée.
    	SDL_FreeSurface(texte);
     
    	// Mise à jour de l'écran.
        SDL_Flip(fenetre);
    };
     
     
     
     
     
     ////////////////////////////////////////////////////////////////////
     /////////// Fonction redéfinie dans les classes filles ///////////
     ////////////////////////////////////////////////////////////////////
    void Fenetre::Affichage()
    {
    }
     
     
     
     
     
     ////////////////////////////////////////////
     /////////// Desctructeur Fenêtre ///////////
     ////////////////////////////////////////////
    Fenetre::~Fenetre(void)
    {
    	// Libération de la mémoire //
    	SDL_Quit();
        TTF_Quit(); 	
    };
    La classe PageAccueil :
    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
    #include "StdAfx.h"
    #include "PageAccueil.h"
     
     
     
     
    PageAccueil::PageAccueil()
    {
     
    }
     
     
     
     
     
     //////////////////////////////////////////////////
     ////////// Fonction affichant l'accueil //////////
     //////////////////////////////////////////////////
    void PageAccueil::Affichage()
    {
    	// On affiche l'image de fond //
    	AffichageImage(0, 0, "Media/Images/Background/background.png");
     
    	Ecrire("Appuyer sur Entrée pour commencer le jeu...", 90, 550, 35, 0, 0, 0);
    }
     
     
     
     
     ////////////////////////////////////
     /////////// Desctructeur ///////////
     ////////////////////////////////////
    PageAccueil::~PageAccueil(void)
    {
    }


    Merci encore infiniment à qui pourra m'aider...

    Paicito

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouvelleImage = IMG_Load(urlImage);
    L'url est bonne ? Quel est le retour de la fonction (!=0) ?

  6. #6
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Salut 3DArchi,

    Tout d'abord merci pour ton aide.

    Oui l'URL est bonne, en fait j'ai une erreur au niveau du pointeur fenetre qui représente les données de la fenêtre ("fenetre = SDL_SetVideoMode(getLargeur(), getHauteur(), getNbCouleurs(), getFlags())") rentrées au niveau du constructeur de la classe mère Fenetre.
    Suite à l'exception m'indiquant un "access violation", j'ai une erreur au niveau de ladite variable fenetre : "CXX0030: error expression cannot be evaluated".
    Si je commente la ligne en question: SDL_BlitSurface(nouvelleImage, NULL, fenetre, &positionImage) de la fonction AfficherImage(), et bien l'erreur revient au niveau de SDL_Flip(fenetre) de la même fonction.
    Si ça peut aider...

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Ca me fait penser à un jardinage tout ça. Tu peux mettre un point d'arrêt au début de la fonction et déroulé pas à pas en surveillant tes pointeurs et leur validité ?

  8. #8
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Finalement tu m'as convaincu sans le vouloir de tout refaire et de revoir les héritages (inutiles).
    Merci bien et bonne continuation...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème d'édition de lien
    Par Kodamas dans le forum Autres éditeurs
    Réponses: 10
    Dernier message: 05/06/2006, 13h50
  2. [g++] Problème d'édition de liens
    Par glKabuto dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 31/05/2006, 19h10
  3. [Dev-C++] Problème d'édition des liens
    Par shura dans le forum EDI
    Réponses: 5
    Dernier message: 30/08/2005, 09h35
  4. Problème à l'édition des liens avec BCC55 et Xerces
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 30/11/2003, 14h50

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