Problème de coordonnées...

Problème de coordonnées... - C - Programmation

Marsh Posté le 23-05-2007 à 15:43:09    

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...

Reply

Marsh Posté le 23-05-2007 à 15:43:09   

Reply

Marsh Posté le 23-05-2007 à 18:54:20    

Une idée... ???

Reply

Marsh Posté le 23-05-2007 à 19:32:33    

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.
Reply

Sujets relatifs:

Leave a Replay

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