portage bizarre linux-windows

portage bizarre linux-windows - C++ - Programmation

Marsh Posté le 31-01-2007 à 21:04:28    

Bonjour
 
Je développe sous linux un jeu type Total annihilation (ou AOE...).
Comme mes amis qui me servent gentiment de testeurs sont sous windows, je dois recompiler sous windows. J'utilise OpenGl et SDL donc je n'ai pas ou peu de soucis à la compilation.
 
Par contre à l'execution, j'ai un bug bizarre uniquement sous windows. Lorsqu'une unité se déplace sur la ligne de cases tout en bas de la carte, j'ai un retour au bureau, segfault apparemment. J'ai donc pensé que c'était une histoire de tableau et de mauvaise adresse mais je ne la trouve pas et surtout je ne comprend pas pourquoi cela ne fonctionne pas sous windows et correctement sous linux.
 
bout de code:

Code :
  1. void ActionAVANCER::unTour(const Carte* carte,Serveur* serveur)
  2. {
  3.       ...
  4.      Pave f(position, unit->getTailleX()/2,unit->getTailleY()/2,unit->getTailleZ()/2, direction);
  5.      int indiceCase=carte->positionOK(&f,unit->getCategorie());  //demande à la carte si la nouvelle position est valide
  6.      ...
  7. }
  8. int Carte::positionOK(const Pave* forme,int categorie) const
  9. {
  10.   static Point centre(0,0,0);
  11.   static const Vecteur v(0,1,0);
  12.   //on considère qu'une case de la carte est un pavé très fin:
  13.   static Pave f(centre,
  14.  LARGEUR_CASE,HAUTEUR_CASE,0.1,
  15.  v);
  16.   /*on rcupre la plus grande dimension de la forme (sauf le z)
  17.     et on teste toutes les cases dont la distance est inf  a et qui sont de l'eau ou infranchissables.
  18.   */
  19.  
  20.   int indiceX,indiceY;
  21.   //d'abord on rcupre la case de la position:
  22.   indiceY=int(forme->getCentre().y/HAUTEUR_CASE);
  23.   indiceX=int(forme->getCentre().x/LARGEUR_CASE);
  24.   //on compte combien de cases reprsente la plus grande dimension du pav
  25.   float dx=forme->getLx()/2, dmax=forme->getLy()/2;
  26.   if(dx>dmax)
  27.     dmax=dx;
  28.   //on prend le nombre de cases que cela reprsente et on ajoute 1 pour etre sur
  29.   int dX,dY;
  30.   dY=int(dmax/HAUTEUR_CASE) +1;
  31.   dX=int(dmax/LARGEUR_CASE) +1;
  32.   /*Pour chaque case, si elle est infranchisable, on test la collision.
  33.     si il y a collision, on renvoie le numéro de la case
  34.   */
  35.   indiceY-=dY;
  36.   indiceX-=dX;
  37.   //on sauvegarde indiceX
  38.   int sauv=indiceX;
  39. #warning ici il faudra grer la catgorie pour les bateaux ou les avions
  40.   for (int i=0;i<=2*dY;i++)
  41.   {
  42.     for(int j=0;j<=2*dX;j++)
  43.     {
  44.       int calc=indiceY*largeur+indiceX;
  45.       if(calc>=0 && calc<int(largeur*largeur))
  46. if(cases[calc]>=DEBUT_CASES_EAU)
  47. {
  48.           //on remplit le pavé avec la position de la case pour tester la collision
  49.   centre.x=indiceX*LARGEUR_CASE+LARGEUR_DEMI_CASE;
  50.   centre.y=indiceY*HAUTEUR_CASE+HAUTEUR_DEMI_CASE;
  51.   f.setCentre(centre);
  52.  
  53.   if(forme->siCollision(f))
  54.     return calc;
  55. }
  56.       indiceX++;
  57.     }
  58.     indiceX=sauv;
  59.     indiceY++;
  60.   }
  61.   return -1;
  62. }


 
 
 


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 31-01-2007 à 21:04:28   

Reply

Marsh Posté le 01-02-2007 à 01:13:34    

ptitchep a écrit :


Par contre à l'execution, j'ai un bug bizarre uniquement sous windows. Lorsqu'une unité se déplace sur la ligne de cases tout en bas de la carte, j'ai un retour au bureau, segfault apparemment. J'ai donc pensé que c'était une histoire de tableau et de mauvaise adresse mais je ne la trouve pas et surtout je ne comprend pas pourquoi cela ne fonctionne pas sous windows et correctement sous linux.


L'allocation est pas différente sous Windows ? Du coup, peut être que sous linux tu dépasse sur une zone "libre" mais pas sous windows car l'espace mémoire est pas alloué de la même manière

 

(note : j'ai pas vérifié  si je dis n'importe quoi ou pas [:cupra] )

 

(renote : la variable categorie n'est pas utilisé dans la fonction positionOk)

Message cité 1 fois
Message édité par zapan666 le 01-02-2007 à 01:13:52

---------------
my flick r - Just Tab it !
Reply

Marsh Posté le 01-02-2007 à 02:00:24    

t'as tenté de vérifier ton code avec valgrind ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 01-02-2007 à 08:54:12    


 

zapan666 a écrit :


(renote : la variable categorie n'est pas utilisé dans la fonction positionOk)


 
ouais c'est pour plus tard  (d'où le #warning) si l'unité sera de catégorie BATEAU, les cases infranchissables seront celles qui correspondent à de la terre et non à de l'eau.
 

0x90 a écrit :

t'as tenté de vérifier ton code avec valgrind ?


non je ne sais pas ce que c'est. Après une rapide recherche google, j'ai envie d'essayer. On va voir si ça m'indique quelque chose.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 01-02-2007 à 21:17:43    

Apparemment, Valgrind n'existe que sous linux...
Je l'ai installé quand même mais je n'ai pas d'erreur (sous linux donc) au moment cité plus haut. J'en ai d'autres et quelques fuites de mémoire qui je connais déjà.
notamment:
==5736== Conditional jump or move depends on uninitialised value(s)
 
et
==5736== Invalid read of size 8
ou
==5736== Invalid read of size 4
 
je vais chercher sur google mais si qqn a le temps de m'expliquer ces erreurs, c'est pas de refus.
 


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 07-02-2007 à 03:43:25    

En tout cas je ne sais toujours pas pourquoi ça bug sous windows puisqu'avant de consulter mon tableau de cases, je vérifie que l'indice soit correct...


Message édité par ptitchep le 07-02-2007 à 03:43:57

---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed