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

  FORUM HardWare.fr
  Programmation
  C

  Problème de coordonnées...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de coordonnées...

n°1564057
Toegarf
Posté le 23-05-2007 à 15:43:09  profilanswer
 

Tout d'abord les structures :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. /* Plateau */
  5. struct plateau_s {
  6.   char** bille; //pointeur sur le plateau de jeu
  7.   int plateau_taille; //taille du plateau
  8. };
  9. /* ColorKiller */
  10. struct colorkiller_s {
  11.   struct liste_s** bille; //pointeur sur les billes en jeu
  12.   struct plateau_s* plateau; //pointeur sur le plateau de jeu
  13.   int** score; //pointeur sur le tablmeau des scores
  14.   /* Parametres de jeu : */
  15.   int nombre_ajoute; //nombre de billes ajoutee a  chaque tour
  16.   int nombre_couleur; //nombre de couleurs
  17.   int nombre_deplacement; //nombre de deplacements autorises
  18.   int nombre_groupe; //nombre de billes qu'un groupe devra comprendre pour etre supprime
  19.   /* Statut de la partie : */
  20.   char* tour_couleur; //couleur dont c'est le tour de jouer
  21.   int tour_nombre; //nombre de tours depuis le debut de la partie
  22.   int tour_joueur; //numeros du joueur en cours
  23. };
  24. /* Coordonnees */
  25. struct coordonnees_s {
  26.   int* x;
  27.   int* y;
  28. };


 
Voila le code de la fonction qui merdouille :  

Code :
  1. struct coordonnees_s bille_selection_nom (struct colorkiller_s* colorkiller) {
  2.   struct coordonnees_s tmp_coordonnees;
  3.   struct liste_s* bille;
  4.   char tmp_nom[20];
  5.   char* tmp_couleur;
  6.   printf("bille : selection : nom = " );
  7.   fgets (tmp_nom, sizeof (tmp_nom), stdin);
  8.   bille = liste_recherche_element_nom (colorkiller->bille, tmp_nom);
  9.   printf("%d\n",&(bille->position_x));
  10.   printf("%d\n",&(bille->position_y));
  11.   tmp_coordonnees.x = &(bille->position_x);
  12.   tmp_coordonnees.y = &(bille->position_y);
  13.   printf("%d\n",tmp_coordonnees.x);
  14.   printf("%d\n",tmp_coordonnees.y);
  15.   tmp_couleur = case_etat (colorkiller, tmp_coordonnees);
  16.   if (tmp_couleur == NULL) tmp_couleur = "rien";
  17.   if (strcmp (tmp_couleur, colorkiller->tour_couleur) != 0) printf ("bille : selection : cette bille ne vous appartient pas\n" );
  18.   while (strcmp (tmp_couleur, colorkiller->tour_couleur) != 0) {
  19.     printf("bille : selection : nom = " );
  20.     fgets (tmp_nom, sizeof (tmp_nom), stdin);
  21.     bille = liste_recherche_element_nom (colorkiller->bille, tmp_nom);
  22.     tmp_coordonnees.x = &(bille->position_x);
  23.     tmp_coordonnees.y = &(bille->position_y);
  24.     tmp_couleur = case_etat (colorkiller, tmp_coordonnees);
  25.     if (tmp_couleur == NULL) tmp_couleur = "rien";
  26.     if (strcmp (tmp_couleur, colorkiller->tour_couleur) != 0) printf ("bille : selection : cette bille ne vous appartient pas\n" );
  27.   }
  28.   printf("bille : selection : OK\n" );
  29.   return tmp_coordonnees;
  30. }


 
Ma fonction liste recherche element nom :  

Code :
  1. struct liste_s* liste_recherche_element_nom (struct liste_s** liste, char* nom) {
  2.   if ((*liste)->nom == NULL && (*liste)->couleur == NULL && (*liste)->position_x == NULL && (*liste)->position_y == NULL) return NULL;
  3.   if (strcmp((*liste)->nom, nom) == 0)
  4.     return *liste;
  5.   else
  6.     return liste_recherche_element_nom (&(*liste)->suivant, nom);
  7. }


 
Ma fonction case etat :  

Code :
  1. char* case_etat (struct colorkiller_s* colorkiller, struct coordonnees_s coordonnees) {
  2.   struct liste_s* bille;
  3.   if (liste_recherche_element (colorkiller->bille, coordonnees.x, coordonnees.y) != NULL) {
  4.     bille = liste_recherche_element (colorkiller->bille, coordonnees.x, coordonnees.y);
  5.     printf("[%d][%d] : %s\n",coordonnees.x,coordonnees.y,bille->couleur);
  6.     return bille->couleur;
  7.   }
  8.   printf("[%d][%d] : vide\n",coordonnees.x,coordonnees.y);
  9.   return NULL;
  10. }


 
Pour finir la sortie terminal :  

Code :
  1. nom : Rémi
  2. couleur : Orange
  3. X = 2
  4. Y = 0
  5. ñ
  6. nom : Alexandre
  7. couleur : Rouge
  8. X = 2
  9. Y = 2
  10. ñ
  11. [2][0] : Orange
  12. bille : selection : nom = Rémi
  13. 8
  14. 12
  15. 8
  16. 12
  17. [8][12] : vide
  18. bille : selection : cette bille ne vous appartient pas
  19. bille : selection : nom = Rémi
  20. [8][12] : vide
  21. bille : selection : cette bille ne vous appartient pas
  22. bille : selection : nom = Alexandre
  23. [8][12] : vide
  24. bille : selection : cette bille ne vous appartient pas
  25. bille : selection : nom = rien
  26. [8][12] : vide
  27. bille : selection : cette bille ne vous appartient pas
  28. bille : selection : nom =


 
Le probleme c'est que les coordonnees des elements restent constantes...
Je ne vois pas comment m'en sortir...

mood
Publicité
Posté le 23-05-2007 à 15:43:09  profilanswer
 

n°1564237
Toegarf
Posté le 23-05-2007 à 18:54:20  profilanswer
 

Une idée... ???

n°1564251
Sve@r
Posté le 23-05-2007 à 19:32:33  profilanswer
 

Toegarf a écrit :

Une idée... ???


 
Le problème, c'est que ton code a vraiment beaucoup trop de commentaires. Tu devrais en élaguer un peu.
 
En dehors de ça, je pense que tu dois mélanger les pointeurs.
Par exemple: pourquoi ta structure "coordonnée_s" stocke des pointeurs et non des valeurs
Autre chose: pourquoi le pointeur déclaré comme "pointeur sur les billes en jeu" est en réalité un pointeur sur un pointeur ?
 
Et surtout: pourquoi ta fonction qui merdouille renvoie l'intégralité d'une structure ? A mon avis, en dehors du fait que renvoyer une structure est toujours plus gourmand que renvoyer un simple pointeur sur la structure, le problème vient que quand tu renvoies ta structure (que tu recopies donc forcément dans la fonction appelante) et que ta structure en question contient des pointeurs ben tu ne recopies que les pointeurs et non les pointés (shallow copy au lieu de deep copy).
 
Je ne sais pas si je suis bien clair. Mais si tu arrives à comprendre pourquoi le code suivant donne deux fois le contenu de la variable HOME (alors qu'il est sensé afficher le PATH et le HOME) tu auras une idée de ce qui se passe dans tes structures

Code :
  1. int main()
  2. {
  3.     char *path;
  4.     char *home;
  5.     path=getenv("PATH" );
  6.     home=getenv("HOME" );
  7.     printf("path=[%s] - home=[%s]\n", path, home);
  8. }


Message édité par Sve@r le 23-05-2007 à 19:37:24

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

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

  Problème de coordonnées...

 

Sujets relatifs
Probleme avec Opera[Résolu]Problème d'affichage avec FCKEditor
problème de date[RESOLU] Problème unlink
Problème de requete, COUNT, GROUP BY etc.Problème de type ambigu dans global.asax...
[ Resolu] Problème de lien ![vba] problème Replace / concaténation
Help problème debogage avec mon jeu vba[openGL] Probleme de systeme de coordonnées fenetre
Plus de sujets relatifs à : Problème de coordonnées...


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