Votre question

Le faux bug du langage C !!![RESOLU]

Tags :
  • Programmation
Dernière réponse : dans Programmation
11 Mai 2006 20:37:32

Bonjours,

durant la création d'un jeu 2D genre mario j'ai employé dans une fonction une variable static et un return. Le return ne fermant pas la fonction la variable static prend une valeur aléatoire.

Pour contourner le bug il suffit d'attribuer une valeur à un variable dans la condition et de la retournée après l'avoir fermée

Aisse vraiment un bug ? . Si oui comment pervenir de ce bug ?

Voila le script :

<code type="c">SDL_Surface * saut( SDL_Surface *Perso, SDL_Surface *PersoDroite, SDL_Surface *PersoGauche, SDL_Surface *PersoFace, SDL_Surface *PersoDos, SDL_Rect *CooPerso, int *bSaut, int *bMonte, int nHauteurInitiale, int nVitesseSaut)
{

//Déclare les entiers
static int nTps1 = 0;
int nTps2 = 0;
fprintf(stderr, " %Ld\n", nTps1);
// Prends le temps actuel
nTps2 = SDL_GetTicks();

// Si ca fait plus de 30ms
if ( nTps2 - nTps1 > 30 )
{

// Si on a pas attiend la hauteur max et que l'on monte
if ( CooPerso->y > nHauteurInitiale - 50 && *bMonte)

// On monte le perso
CooPerso->y -= nVitesseSaut;

// Si on est en haut
else if ( CooPerso->y/nVitesseSaut == (nHauteurInitiale - 50)/nVitesseSaut && *bMonte )

// On descend
*bMonte = 0;

// Si on a pas atteind le sol et que l'on descend
else if ( CooPerso->y < nHauteurInitiale && !(*bMonte))

// On descend le perso
CooPerso->y += nVitesseSaut;

// Si on a réatteind le seul
else if ( CooPerso->y/nVitesseSaut == nHauteurInitiale/nVitesseSaut && !(*bMonte))

// On saute plus
*bSaut = 0;

if ( CooPerso->y == nHauteurInitiale )

Perso = PersoFace;

else if ( CooPerso->y == nHauteurInitiale - nVitesseSaut*2 )

Perso = PersoGauche;

else if ( CooPerso->y == nHauteurInitiale - nVitesseSaut*4 )

Perso = PersoDos;

else if ( CooPerso->y == nHauteurInitiale - nVitesseSaut*6 )

Perso = PersoDroite;

else if ( CooPerso->y == nHauteurInitiale - nVitesseSaut*8 )

Perso = PersoFace;

else if ( CooPerso->y == nHauteurInitiale - nVitesseSaut*10 )

Perso = PersoGauche;

// Redefinis nTps1
nTps1 = nTps2;

return Perso;

}

}
</code>

Merci de vos réponses à venir.

Autres pages sur : faux bug langage resolu

a b L Programmation
11 Mai 2006 22:23:28

Et si tu mets le return ça marche ?
Quel compilateur utilises-tu ?

Faudrait voir sur un exemple simple la différence en regardant le code compilé en assembleur.
11 Mai 2006 23:24:02

J'utilise Dev C++ en IDE donc le compilateur c'est mingw32 et plus precisement gcc car c'est du C.

Si je mets le return après l'acolade fermante la variable static fonctionne correctement. Sinon elle prend une valeur alèatoire.

Au niveau de regarder le resultat en assembleur, je ne suis pas capable de le faire. si tu pourrais le faire stp.
Contenus similaires
11 Mai 2006 23:49:44

je ne comprends pas vraiment le sens de cette phrase :
Citation :
Le return ne fermant pas la fonction la variable static prend une valeur aléatoire.

Ton code est de toute manière incorrecte.
  1. <code type="c">SDL_Surface * saut(...)
  2. {
  3. //Déclare les entiers
  4. static int nTps1 = 0;
  5. ...
  6. // Si ca fait plus de 30ms
  7. if ( nTps2 - nTps1 > 30 )
  8. {
  9. ...
  10. // Redefinis nTps1
  11. nTps1 = nTps2;
  12. return Perso;
  13. }
  14. }

Ta fonction ne renvoie pas forcement quelque chose ce qui est incohérent avec le prototype de ta fonction. De la à ce que ça décalle ta pile et que ta variable static en soit affecté ça ne m'étonne pas vraiment.
12 Mai 2006 21:30:12

Ok bon ba maintenant je comprend mieu merci de votre aide. Le problème venais de la syntaxe erroné et pas du compilateur.

@+ et Merci encore
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS