Bonsoir.

J'ai un bug assez étrange je trouve. J'ai dans mon moteur 3d un tableau de patches, créé à partir d'une image de 1025x1025.

J'initialise les variables avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
bool TGeoMipMapping::Init( int iPatchSize )
{...
m_iPatchSize= iPatchSize; //iPatchSize a pour valeur 17
m_iNumPatchesPerSide= m_uiSize/m_iPatchSize; //m_uisize a pour valeur 1025 (la taille d'un coté de l'image)
m_pPatches= new S_PATCH [SQR( m_iNumPatchesPerSide )];
...}
Donc, mon tableau a finalement une taille de 3600 (60*60)
Or dans un des méandres de mon code, il y a ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
int GetPatchNumber( int PX, int PZ )
    {    return ( ( PZ*m_iNumPatchesPerSide )+PX );    }
 
void TGeoMipMapping::RenderPatch( int PX, int PZ, bool bMultiTex, bool bDetail )
{...
   int iPatch= GetPatchNumber( PX, PZ );
...
   if( m_pPatches[GetPatchNumber( PX, PZ+1 )].m_iLOD<=m_pPatches[iPatch].m_iLOD || PZ==m_iNumPatchesPerSide )
        patchNeighbor.m_bUp= true;
    else
        patchNeighbor.m_bUp= false;
...
}
que j'ai remplacé par ceci pour savoir où était le bug:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
void TGeoMipMapping::RenderPatch( int PX, int PZ, bool bMultiTex, bool bDetail )
{...
   int iPatch= GetPatchNumber( PX, PZ );
...
    int ipatchtemp = GetPatchNumber( PX, PZ+1 );
    int t = m_pPatches[ipatchtemp].m_iLOD;
    if( m_pPatches[ipatchtemp].m_iLOD<=m_pPatches[iPatch].m_iLOD || PZ==m_iNumPatchesPerSide )
        patchNeighbor.m_bUp= true;
    else
        patchNeighbor.m_bUp= false;
...
 }
Le programme plante sur (int t = m_pPatches[ipatchtemp].m_iLOD; ) parce que, logiquement, PZ a atteint 59, et en faisant (59+1)*60 + n'importe quelle valeur de PX, je dépasse mon tableau qui a une taille maxi de 3600.
Maintenant la question : comment se fait-il que lorsque que je lance le prog en faisant ctrl+F5 (sans debug), le programme plante là dessus, avec seulement F5 (debug), il ne plante pas, et en mode release(CTRL F5) non plus ? Est ce Visual qui ajoute des routines de vérification aléatoirement ? Ou bien est ce moi qui ai loupé quelque chose sur les tableaux en C++ ?