Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
841 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  portage bizarre linux-windows

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

portage bizarre linux-windows

n°1509328
ptitchep
Posté le 31-01-2007 à 21:04:28  profilanswer
 

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
mood
Publicité
Posté le 31-01-2007 à 21:04:28  profilanswer
 

n°1509397
zapan666
Tout est relatif
Posté le 01-02-2007 à 01:13:34  profilanswer
 

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 !
n°1509401
0x90
Posté le 01-02-2007 à 02:00:24  profilanswer
 

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


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1509418
ptitchep
Posté le 01-02-2007 à 08:54:12  profilanswer
 


 

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
n°1509818
ptitchep
Posté le 01-02-2007 à 21:17:43  profilanswer
 

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
n°1511639
ptitchep
Posté le 07-02-2007 à 03:43:25  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  portage bizarre linux-windows

 

Sujets relatifs
configuration d'un client db2 sur linuxOu telecharger un Client DB2 pour linux
analyser le type d'un fichier en c sous windows[VB/VBA/VBS] Ajouter un réseau sans fil sous Windows XP
IE freeze avec Windows Media PlayerApplication Windows et bdd MySQL sur internet = SOAP ?
Créer un projet WindowsConvertir un chemin windows en chemin linux
Plus de sujets relatifs à : portage bizarre linux-windows


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR