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 :

EXC_BAD_ACCESS étrange - vecteurs


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Par défaut EXC_BAD_ACCESS étrange - vecteurs
    Citation Envoyé par nuKs Voir le message
    Bonsoir.
    Après plus de 2h de recherche, je me suis résigné à venir poster ici
    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
    NuMap::NuMap(const std::string &fileName) : _fileName(fileName)
    ,_map(15, std::vector< std::vector<int> >(11, std::vector<int>(10, 10)))
    // _map est bien initialisé
    ,name("New map")
    ,version("1")
    ,author("Unknown")
    ,tileset("common")
    ,_rootHandle(0)
    ,_headHandle(0)
    ,_casesHandle(0) {
    }
     
    void NuMap::setCase(const int idCase, const int z, const int value) {
    	const int y = std::ceil((float)idCase / 15.f);
    	const int x = idCase - ((y-1) * 15);
     
    	std::cout << "id" << idCase << "_" << "x" << x << "y" << y << std::endl; // tout est en ordre, le problème ne vient pas d'ici
    	std::cout << "size" << _map.size() << std::endl << std::endl; // ici ça marche... Avec des valeurs irréelles !
    	if(_map[x-1][y-1].size() < z) { // le plantage s'effectue ici. Pas dans la condition, mais bien lors de l'utilisation de la méthode size().
    		//_map[x][y].resize(1);
    		throw std::string("comment est-ce possible ?");
    	}
     
    	//_map[x][y].push_back(value);
    }
    L'appel provient d'une méthode d'une classe fille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool onMouseMove(const CEGUI::EventArgs& e) {
    	if(NuMapCEGUI::_buttonDown) {
    		const CEGUI::WindowEventArgs& we = static_cast<const CEGUI::WindowEventArgs&>(e); // peut-être me suis-je trompé ici ?
     
    		int senderID = std::atoi(we.window->getText().c_str());
    		NuMap::setCase(senderID, 1, 1); // z vaut toujours 1. Erreur lors de l'appel de cette fonction
    	}
    }
    Après avoir vérifié que mon algorithme fonctionne parfaitement, et qu'il n'est pas la cause du problème, j'obtient un vecteur _map avec plus d'un millions comme valeur de size() (merci GDB) alors qu'il est initialisé à 15 emplacements.

    Il n'y a pas de plantage lorsque les variables x et y ont des valeurs petites.

    Autre bizarrerie, avant que je mette idCase en const, il arrivait que GDB lui donne des sommes astronomiques aussi, mais que tout soit correcte lorsque j'affiche sa valeur avec cout. [Edit] Rectification, même en const, ce problème arrive [/Edit]

    Je vous en supplie ! Programmeurs de tous horizons, je vous en conjure ! Avez-vous une idée de l'atrocité que j'ai commis ?
    Merci d'avance
    Edit:
    J'ai trouvé d'où vient plus ou moins le problèmes. Dans la fonction appelante (Cf. onMouseMove), les variables this et senderID sont déclarés comme outofscope (à ni rien comprendre, vus que dans le cout, senderID est toujours noté comme < 200).

    Edit2:
    Avec un peu de bouleau, seul la variable this est maintenant déclarée comme outofscope. Lorsque je regarde un peu ce qu'elle contient, les variables publiques de la classe mères sont toutes notées en rouges (mais leur contenu est valide).

    Edit3:
    En fait je pense que la variable est déclarée comme outofscope par GDB mais reste bien fonctionnelle. Ca doit être du fait que GDB n'y a pas accès directement car c'est une variable locale.

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 59
    Par défaut
    Voilà, mon problème venait en fait tout bêtement de mon cast que j'ai changé comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool NuMapCEGUI::onMouseMove(const CEGUI::EventArgs& e) {
    	if(NuMapCEGUI::_buttonDown) {
    		const CEGUI::WindowEventArgs we = static_cast<const CEGUI::WindowEventArgs&>(e);
    		//std::cout << we;
    		CEGUI::PushButton *pushButton = dynamic_cast<CEGUI::PushButton *>(we.window);
    		int senderID = std::atoi(pushButton->getText().c_str());
    		setCase(senderID, 1, 1);
    	}
    }
    Edit: en réalité, le problème ne venait pas du cast, qui était tout à fait valide, mais du fait que onMouseMove soit une méthode callback. L'instance la contenant étant détruit au moment de l'appel, un plantage était inévitable.

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

Discussions similaires

  1. [Débutant] ordonnancement étrange avec des vecteurs
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 13
    Dernier message: 25/05/2011, 13h14
  2. [math] somme de plusieurs vecteurs à 3 dimensions
    Par teska dans le forum Mathématiques
    Réponses: 5
    Dernier message: 04/06/2003, 21h40
  3. Récuperer les coordonnées d'un vecteur
    Par kerzut dans le forum OpenGL
    Réponses: 5
    Dernier message: 15/04/2003, 11h51
  4. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40
  5. matrices * vecteur
    Par delire8 dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/09/2002, 14h15

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