Jeux Libres
       
           

» Les Forums » Aide à propos de la création de jeux vidéo » [Résolu][C++] Vector 3D


Aller à la page : 1.

[Résolu][C++] Vector 3D
Brouilles



Grade : Habitué
Inscrit le: 04 Fev 2012, 17:40
Ecrit le: 15 Juillet 2015, 21:10             Message non corrigé

Bonjour,
J'ai un petit problème avec mon code C++. J'ai un vector dynamique de 16*100*16. Tout fonctionne bien: déclaration, initialisation, code d'affichage DirectX mais dès que j'utilise une fonction de type get pour récuperer une valeur ça plante ... Et je vois pas pourquoi du tout. Lien pastebin

(J'utilise citation car la balise code ne voulais pas fonctionner ...)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
std::vector<std::vector<std::vector<Block>>> m_blockArray;
//Initialized Block array
for (int x = 0; x < 16; x++)
{
m_blockArray.push_back(vector<vector<Block>>());
for (int y = 0; y < 100; y++)
{
m_blockArray[x].push_back(vector<Block>());
for (int z = 0; z < 16; z++)
{
m_blockArray[x][y].push_back(Block());
m_blockArray[x][y][z].Block_load(D3DDevice, debug);

//m_blockArray[x][y][z].Block_load(D3DDevice, debug, x*2.0f, y*2.0f, z*2.0f);
/*if (rand() % 100 < 55)
m_blockArray[x][y][z].Block_setCubeType(CubeType::air);*/
}
}
}

Mais ici, code juste après plante.
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
//Calculate hidden face
for (int x = 0; x < 16; x++)
{
for (int y = 0; y < 100; y++)
{
for (int z = 0; z < 16; z++)
{
if (m_blockArray[x][y + 1][z].Block_getCubeType() == CubeType::block && y + 1 < 16) //Top
m_blockArray[x][y][z].BlockModel_setBlockFaceTop(false);

if (m_blockArray[x][y - 1][z].Block_getCubeType() == CubeType::block && y - 1 >= 0) //Bottom
m_blockArray[x][y][z].BlockModel_setBlockFaceBottom(false);

if (m_blockArray[x][y][z - 1].Block_getCubeType() == CubeType::block && z - 1 >= 0) //One
m_blockArray[x][y][z].BlockModel_setBlockFaceOne(false);

if (m_blockArray[x + 1][y][z].Block_getCubeType() == CubeType::block && x + 1 < 16) //Two
m_blockArray[x][y][z].BlockModel_setBlockFaceTwo(false);

if (m_blockArray[x][y][z + 1].Block_getCubeType() == CubeType::block && z + 1 < 16) //Third
m_blockArray[x][y][z].BlockModel_setBlockFaceThird(false);

if (m_blockArray[x - 1][y][z].Block_getCubeType() == CubeType::block && x - 1 >= 0) //Four
m_blockArray[x][y][z].BlockModel_setBlockFaceFour(false);
}
}
}

Je soupçonne que la class est pas bien initialisé mais je ne sais pas trop comment faire.

________
Site personnel et Portfolio.
  Profil




Visiteur
Ecrit le: 16 Juillet 2015, 08:08             Message non corrigé

Vecteur de vecteur de vecteur de block X) héhé ça m'a fait rire :P
Tu peux faire un typedef pour être plus précis faire plus jolie:
1
typedef std::vector<std::vector<std::vector<Block>>> BlocksArray3D;

Sinon, je pense que tu "plantes" dès la première boucle des tableaux non ?
Première loop [x=0, y=0, z=0], tu fais:
  • "m_blockArray[x][y + 1][z]" -> Jusqu'à là, OK.
  • "m_blockArray[x][y - 1][z]" -> Aïe! y - 1 = 0 - 1 = -1 ?!
  • "m_blockArray[x][y][z - 1]" -> Là aussi pour z.
  • "m_blockArray[x - 1][y][z]" -> Et pour x.

Enfin, le soucis peut se produire aussi quand les tableaux sont aux max:
  • "[x][y + 1][z]" y < 100 donc y_max = 99 -> 99 + 1 = 100 = en dehors du tableau.
  • "[x + 1][y][z]"
  • "[x][y][z + 1]"

Après, je n'ai pas de connaissances pousser sur Vector et je ne suis pas sur de sa réaction face à un indice négatif ou supérieur à son tableau, mais un SEGFAULT ne m'étonnerait pas.
Je pense qu'il faut revoir tes conditions ne tester que ce que tu peux tester.

Bon courage! :D
  Profil
Brouilles



Grade : Habitué
Inscrit le: 04 Fev 2012, 17:40
Ecrit le: 16 Juillet 2015, 09:20             Message non corrigé

Je ne pense que le problème vient de la, le code fonctionner très bien avec les tableaux static. Mais malheureusement j'avais une limite de taille. Je vais voir. Je ne sais pas trop d'ou peut venir l'erreur, je pensais plus dans l'initialisation du block dans le vector, car le code fonctionnais parfaitement en tableaux normal.

________
Site personnel et Portfolio.
  Profil
Brouilles



Grade : Habitué
Inscrit le: 04 Fev 2012, 17:40
Ecrit le: 16 Juillet 2015, 09:25             Message non corrigé

ça vient pas la le problème, car quand je fais juste return 1; à ma fonction get par exemple ça fonctionne et les -1 du tableau retourne juste 0. C'est ma variable private qui ne doit pas être déclaré correctement, la class ne doit pas être bien initialiser à mon avis. A mon vis le problème vient de ces lignes m_blockArray.push_back(vector<vector<Block>>()); et m_blockArray[x].push_back(vector<Block>());.

________
Site personnel et Portfolio.
  Profil
Lo



Grade : Maître
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 16 Juillet 2015, 09:29             Message non corrigé

Si ça fonctionnait avec des tableaux normaux, je pencherai plutôt pour un problème de dépassement de taille. :P

Peut être spécifier une taille max lors de la construction de ton vecteur.



________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil
 


Aller à la page : 1.


Hébergeur du site : David
Version PHP : 5.4.45-0+deb7u2
Uptime : 16 jours 6 heures 39 minutes
Espace libre : 1599 Mo
Dernière sauvegarde : 09/12/2018
Taille de la sauvegarde : 1109 Mo


4957977 pages ont été consultées sur le site !
Dont 2276 pages pendant les 24 dernières heures.

Page générée en 0.677 secondes


Nos sites préférés
- Création d'un jeu de plateforme de A à Z avec SDL
- Zelda ROTH : Jeux amateurs sur le thème de Zelda
- Zeste de Savoir : la connaissance pour tous et sans pépins
- YunoHost : s'héberger soi-même en toute simplicité
- Site de Fvirtman : recueil de projets et de codes en C et C++
- Par ici la sortie : le site des idées de sorties


  © 2005-2018 linor.fr - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.