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 :

Violation d'accès lors de la lecture


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut Violation d'accès lors de la lecture
    Bonjour tout le monde
    J'aimerai vous exposer mon problème car je ne vois vraiment pas comment faire ^^
    Voilà enfait, j'ai une classe Personnage et une classe Fenêtre. Dans la fonction afficher de Personnage j'utilise la surface de ma fenêtre. Or Visual ne sait pas si j'ai déjà créer une Fenêtre donc il me dit "Violation d'accès" ^^
    Pour info je créer ma fenêtre avec un constructeur ainsi que mon Personnage.
    Enfait, j'aimerai savoir si c'est possible de dire :
    "Si la fenêtre est créer, Alors ça renvoie à la fonction, Sinon rien"
    Si quelqu'un à une idée

    Merci d'avance.

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Peut-être qu'avec un bout de code on comprendrait mieux ?

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    Terrain.h :
    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
    //Terrain.h
     
    //#ifndef Terrain
    //#define Terrain
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include "graphique.h"
    #include <SDL/SDL.h>
     
     
    class Terrain : public graphique
    {
     
    public :
    		void refresh();
    		Terrain(int alpha, int beta, int gamma, int Largeur, int Hauteur);
           SDL_Surface* getSurfaceEcran(); 
    	   SDL_Surface* getSurfaceFond(); 
    	   int PositionFondX();
    	   int PositionFondY();
    	   void chargerImage();
           void afficherImage(int posx, int posy);
     
    };
     
    //#endif
    Personnage.h
    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
    //Personnage.h
     
    //#ifndef personnage
    //#define personnage
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include "graphique.h"
    #include <SDL/SDL.h>
     
     
    class Personnage : public graphique
    {
     
    public :
    		Personnage(int vitesse);
           void afficherPerso(int posIx, int posIy);
     
    };
     
    //#endif
    Pour la précision Terrain et la classe que j'appelais Fenêtre tout à l'heure
    La class graphique est la class mère dans laquelle je met tout les attributs que partagent ces 2 class.

    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
    int main(int argc, char *argv[])
    {
     
    SDL_Event event;
     
        SDL_Init(SDL_INIT_VIDEO);
     
    //créer un terrain
        Terrain terrain(0,100,0, 500, 500);
    	terrain.refresh();
     
    //une image en fond d'écran
    	terrain.chargerImage();
    	terrain.afficherImage(0, 0);
    	terrain.refresh();
     
    //créer un Perso
        Personnage perso(50);
    		terrain.refresh();
     
     
    SDL_EnableKeyRepeat(10, 10); /* Activation de la répétition des touches */
     
    int continuer = 1;
       while (continuer)
        {
     
            SDL_WaitEvent(&event);
            switch(event.type)
            {
     
    case SDL_MOUSEBUTTONUP:
           if((event.button.x >= terrain.PositionFondX() && event.button.x <= terrain.PositionFondX() + terrain.getSurfaceFond()->w) && (event.button.y >= terrain.PositionFondY() && event.button.y <= terrain.PositionFondY() + terrain.getSurfaceFond()->h))
    		{
     
    	perso.afficherPerso(50, 50);
     
    		}
                    break;
    		}
     
    terrain.refresh();
     
    	}
     
        pause();
     
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    Enfait la compilation marche, mais l'erreur aparait quand je clik, et donc quand je renvois la fonction .afficherPerso.

    .afficherPerso :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     void Personnage::afficherPerso(int posIx, int posIy)
     {
    	 positionImagePerso.x = posIx;
    	 positionImagePerso.y = posIy;
    	 SDL_BlitSurface(imagePerso, NULL, ecran, &positionImagePerso);
    	 SDL_Flip(ecran);
     }
    L'erreur se situe au niveau du "blitSurface".
    Voilà

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    D'accord donc j'ai bien fait de demander parce que c'était vraiment pas évident qu'il s'agissait d'un problème lié à SDL
    Au passage il existe un forum dédié.

    Il manque encore quelques informations, par exemple qu'est-ce que positionImagePerso ?

    Je suis bien incapable de t'aider à déboguer cela dit, je n'ai jamais utilisé SDL...
    On dit appeler et non renvoyer une fonction par contre, dans ce contexte.

    MAT.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 89
    Par défaut
    Pour développez en SDL, je te conseille vivement Code::Blocks. Il est
    mieux...

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oulà, ça sent la mauvaise conception! Que terrain hérite de graphique ok, c'est normal, mais personnage y'a rien de logique. Je privilégirai une composition.
    Donc dans ta classe personnage, je mettrai un pointeur vers un écran. Si ce pointeur est valide, alors la fonction afficher() sera ok, sinon elle ne doit rien faire (ou bien renvoyer un code d'erreur)...

    En même temps, je connais pas bien la SDL, alors peut être que je me trompe. J'ai juste parler sémantique ici.

    Bonne continuation !

  7. #7
    scr
    scr est déconnecté
    Membre éprouvé
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par défaut
    Citation Envoyé par poukill Voir le message
    Oulà, ça sent la mauvaise conception! Que terrain hérite de graphique ok, c'est normal, mais personnage y'a rien de logique
    Je ne vois pas trop ce qu'il y a de logique et de illogique !
    Quelle différence entre terrain et personnage ? Finalement ce sont deux objets a dessiner dans la fenêtre graphique ?
    Pourrais tu préciser ta pensée...

    Je suis quand même plutôt d'accord avec ta solution du pointeur vers l'objet graphique plutôt que de dériver la classe mais je ferais la même chose pour le terrain.

    Dans le code, il manque la classe graphique, j'aurai bien aimé y jetter un oeil...

  8. #8
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    +1
    Effectivement j'avais pas fait gaffe pour le terrain, je pensais pas terrain comme quelque chose à afficher...
    Donc j'hériterai pas pour les deux... L'héritage est souvent utilisé de manière abusive car ça peut simplifier le code, mais ça ne convient pas...

    Enfin, c'est sur que la classe graphique, il faudrait bien savoir ce qu'il y a dedans ! !

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 83
    Par défaut
    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
    // Graphique.h
     
    #ifndef Graphique
    #define Graphique
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <SDL/SDL.h>
     
     
    class graphique 
    {
    protected :
    	SDL_Surface *ecran;
        SDL_Surface *imageTerrain;
    	SDL_Surface *imagePerso;
        SDL_Rect positionImageFond;
    	SDL_Rect positionImagePerso;
        int vito;
        bool terra;
        int skateur;
    	int tailleH;
    	int tailleL;
    	int couleurA;
    	int couleurB;
    	int couleurC;
     
     
    };
     
    #endif
    Bon beh voilà graphique.h, enfait elle ne contient que mes attributs c'est plus simple comme ça je peux les utiliser dans Personnage et Terrain XD
    Mais vu que je suis débutant en prog ce n'est peut être pas vraiment le bon moyen Sinon je comprends pas trop comment créer un pointeur vers l'objet graphique, ou Terrain plutot vu que c'est lui qui affiche ma Fenêtre ?

    Merci pour vos réponses

  10. #10
    scr
    scr est déconnecté
    Membre éprouvé
    Inscrit en
    Juin 2005
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 127
    Par défaut
    Citation Envoyé par Fullmetal82 Voir le message
    Sinon je comprends pas trop comment créer un pointeur vers l'objet graphique, ou Terrain plutot vu que c'est lui qui affiche ma Fenêtre ?
    Déclarer une variable de type graphique* dans la classe plutôt que de la faire dériver de graphique

Discussions similaires

  1. Violation d'accès lors de la lecture
    Par moooona dans le forum MFC
    Réponses: 2
    Dernier message: 27/05/2010, 17h52
  2. Violation d'accès lors de la lecture
    Par Adeel.dev dans le forum SDL
    Réponses: 1
    Dernier message: 21/05/2010, 20h23
  3. Réponses: 5
    Dernier message: 01/12/2009, 01h06
  4. Réponses: 7
    Dernier message: 13/08/2009, 09h01
  5. Réponses: 5
    Dernier message: 02/01/2009, 10h37

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