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.