|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 4 ![]() |
Bonsoir à tous ceux qui vont lire ce message.
Je suis donc actuellement sur la création d'un petit jeu 2D pour me faire la main, et j'ai utilisé un système de tableau à deux dimensions pour pouvoir stocker les données du monde à charger (en gros, les différentes tiles). Pour cela, j'ai donc une classe WorldManager qui, lors de sa création, génère le tableau dynamiquement via une méthode WorldManager::constructeurTableauDynamique (cette dernière renvoyant un int**). J'utilise donc un pointeur sur pointeur sur int, et j'ai initialisé ce pointeur dans mon header de classe (WorldManager.h) de cette manière : int **worldTab. Ensuite, j'ai deux méthodes, une renvoyant un int, qui correspond à la valeur de la case appelée du tableau (prototype: int getWorldTab(int i , int j). Le return est écrit ainsi: return worldTab[i][j]; L'autre méthode est tout aussi simple, elle permet, à partir de i et de j, de remplir la case du tableau concernée (prototype: void setWorldTab(int i , int j , int set). Voila ce qu'il se passe dans la méthode: worldTab[i][j] = set; Mon problème est le suivant: lors de la compilation, aucun message d'erreur, mais lorsque j'initialise le tableau (en lançant le programme) dans mon constructeur pour pouvoir le remplir entièrement de 0, je fais appel à this->setWorldTab(i , j , 0); (this puisqu'il s'agit de la même classe), mon debugger m'indique un problème de segmentation lors du passage à la fonction setWorldTab (lorsque i = 0 et j = 0). Je ne comprends donc pas pourquoi mon pointeur worldTab ne pointe pas où il faut, un peu comme si il était perdu J'implore donc gracieusement votre aide amis développeurs, et j'espère que tout n'est pas trop confus... Voila mes WorldManager.cpp et WorldManager.h (ne faites pas attention aux autres classes créées et etc.., elles n'entrent pas en conflit, du moins à ce qu'il paraît): WorldManager.cpp: Code :
Code :
|
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 675 ![]() |
Il est fort possible que le problème soit quand même dans tes autres classes, elles peuvent en cas d'erreur écraser la mémoire de ton tableau...
Ne voyant pas d'erreurs flagrantes (même si la gestion manuelle, c'est moche... Utiliser un vector simplifierait le code), j'ai tenté de recompiler pour voir. Après nettoyage j'obtiens : Code :
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
||
|
|
00
|
|
|
#3 | ||||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 4 ![]() |
Je viens de tester le code nettoyé, et il fonctionne également chez moi... Le programme s’exécute naturellement sans aucun soucis. Cependant, je ne vois pas pourquoi l'autre plante toujours au même endroit, et je ne vois pas non plus pourquoi il y aurait un conflit avec les autres classes, puisque c'est juste après avoir créé dynamiquement le tableau que je l'initialise, sans rien entre les deux, or c'est bien là qu'il plante... Je vais continuer à repasser mon code au peigne fin, si quelqu'un a une idée sur le pourquoi du comment de ce problème de segmentation, je suis toujours preneur!
Edit: Étrangement, je viens de recompiler et de relancer et l'erreur ne se situe plus au même endroit... Je peux donc bien accéder aux deux méthodes set et get de mon tableau via le this->get/set... Cependant, c'est maintenant lorsque j'appel ces 2 méthodes en dehors de WorldManager (donc via un pointeur *worldManager) que mon programme ne fonctionne pas: dans une de mes classes, créée dans worldManager (il s'agit de blockManager, qui possède donc un pointeur sur worldManager), j'appel int x = worldManager->getWorldTab(i , j) où i = 89 et j = 46, et là mon debugger me renvoi encore une erreur de segmentation au niveau du return de getWorldTab... J'ai bien entendu vérifié que worldTab[89][46] existé (j'ai fait appel à this->getWorldTab(89 , 46) dans mon constructeur), et à ce niveau là pas de problème de segmentation... Je ne comprend vraiment donc pas d'où peut venir l'erreur... Je vais encore chercher, mais si vous pouvez m'aider, voilà mon BlockManager.cpp et .h: BlockManager.cpp: Code :
Code :
J'ai finalement trouvé pourquoi mon code ne fonctionnait pas... C'est tout bête, mais c'est en faisant des essais que je m'en suis rendu compte: en fait, j'ai créé dynamiquement mon worldManager via un pointeur dans une autre classe, et j'ai donné en argument à mon worldManager ce pointeur vers lui-même, puis ce pointeur est directement réutilisé dans le constructeur de worldManager pour le donner en argument à mon fameux blockManager, où il est "enregistré" pour être réutilisé dans toute la classe blockManager. Vous l'aurez constaté, ceci est totalement inutile: pas la peine de donner en argument son propre pointeur à worldManager, puisqu'il le possède déjà (il s'agit de "this"). Ainsi, en supprimant cet argument et en envoyant en argument à blockManager directement this, le programme fonctionne (après quelques autres modifications dans les méthodes de blockManager, bien évidemment), et n'envoi plus aucune erreur de segmentation... Je viens donc d'apprendre une chose assez intéressante du c++ sur les pointeurs par moi même, comme quoi, c'est bien en forgeant que l'on devient forgeron Cependant, je trouve tout de même cela étrange que l'autre pointeur ne fonctionne pas... Je suppose que l'on ne peut pas donner en argument un pointeur sur classe à cette même classe, car il semble se perdre dans sa propre classe |
||||
|
|
00
|
Copyright © 2000-2013 - www.developpez.com