Compilation error: invalid operands to binary != ...

Compilation error: invalid operands to binary != ... - C - Programmation

Marsh Posté le 20-04-2017 à 22:03:53    

Hello tout le monde,
 
J'essaye d'aider ma soeur en première année d'informatique mais là ça dépasse mes connaissances.
A la compilation elle rencontre l'erreur ci dessous:
error: invalid operands to binary != (have 'piece_t' and 'int')
Pourriez vous m'expliquer simplement ce qui cloche dans son code?

Code :
  1. #define JOUEUR_1 1
  2. #define JOUEUR_0 0
  3. #define JOUEUR_VIDE -1
  4. #define PIECE_NON_PROMUE 0
  5. #define PIECE_PROMUE 1
  6. #define FAUX 0
  7. #define VRAI 1
  8. #define VIDE -1
  9. #define T 11
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. struct piece_s
  15. {
  16. int joueur;
  17. int type;
  18. int statut;
  19. }; typedef struct piece_s piece_t;
  20. struct coordonnees_s
  21. {
  22. int x; // ligne du tableau;
  23. int y; // colonne du tableau;
  24. }; typedef struct coordonnees_s coordonnees_t;
  25. typedef struct coup_s coup_t; //maillon de coups
  26. struct coup_s
  27. {
  28. coordonnees_t depart; //sauvegarder les coordonees de la piece de depart
  29. coordonnees_t arrivee; //sauvegarder les coordonnees d'arriver la piece
  30. int promotion; //booleen
  31. int capture; //booleen
  32. coup_t *suivant;
  33. coup_t *precedant;
  34. };
  35. struct liste_s
  36. {
  37. coup_t *debut;
  38. int nb_de_coups;
  39. coup_t *fin; //ladresse de fin du dernier maillon
  40. }; typedef struct liste_s liste_t;
  41. struct partie_s
  42. {
  43. piece_t tablier[T][T]; // T=taille
  44. liste_t coup_joue;
  45. int bool_joueur;
  46. int joueur;
  47. }; typedef struct partie_s partie_t;
  48. typedef struct maillon_capture_s maillon_capture_t;
  49. struct maillon_capture_s
  50. {
  51.     coordonnees_t depart; //sauvegarder les coordonees de la piece de depart
  52. coordonnees_t arrivee; //sauvegarder les coordonnees d'arriver la piece
  53.     int promotion; //booleen
  54. int capture; //booleen
  55. coordonnees_t coord_capture;
  56. maillon_capture_t *suivant;
  57. };
  58. typedef struct liste_capture_s liste_capture_t;
  59. struct liste_capture_s
  60. {
  61. liste_capture_t *liste_capture;
  62. maillon_capture_t *debut;
  63. int taille;
  64. };
  65. //c'est un pointeur qui nous permetra de sauvegarder la position de la derniere piece mise dans la reserve
  66. liste_capture_t *liste_capture;
  67. //prend en arguments un joueur, un type et un statut, et renvoie une piece.
  68. piece_t piece_creer(int joueur, int type, int statut);
  69. //prend en argument une piece et renvoie son joueur.
  70. int piece_joueur(piece_t piece);
  71. //prend en argument un caractere et renvoie la piece correspondante.
  72. piece_t piece_identifier(char type);
  73. //prend en argument une piece et renvoie le caractere qui lui est associe.
  74. char piece_caractere(piece_t piece);
  75. //prend en argument une piece et affiche le caractere qui lui est associe .
  76.   void piece_afficher(piece_t piece);
  77. //
  78. void changer_joueur(partie_t *partie);
  79. //
  80. void changer_statut(piece_t *piece);
  81. //
  82. int case_vide(piece_t caase);
  83. //
  84. void modifier_case(partie_t *partie, piece_t piece, coordonnees_t coord );
  85. //
  86. void affiche_plateau(partie_t *partie);
  87. //
  88. void deplacemet(partie_t *partie, coordonnees_t coord_de_depart, coordonnees_t coord_darrivee);
  89. //
  90. void annuler_deplacement(partie_t *partie);
  91. //
  92. int* saisie_case();
  93. //
  94. partie_t *partie_creer();
  95. //
  96. coup_t *extraire_debut_liste(liste_t *liste);
  97. //
  98. void partie_detruire(partie_t *partie);
  99. //
  100. void partie_sauvegarder(partie_t* partie, const char* chemain);
  101. //
  102. char partie_charger(partie_t* partie, const char* chemain);
  103. //
  104. partie_t *partie_nouvelle();
  105. piece_t piece_creer(int joueur, int type, int statut)
  106. {
  107. piece_t piece;
  108. piece.joueur=joueur;
  109. piece.type=type;
  110. piece.statut=statut;
  111. return piece;
  112. }
  113. //**********************************************_________________________************************************************
  114.  
  115. int piece_joueur(piece_t piece)
  116. {
  117. return piece.joueur;
  118. }
  119.  
  120. //**********************************************_________________________*************************************************
  121.  
  122. piece_t piece_identifier(char type)
  123. {
  124. int i=0;
  125. char tab_type[]= "malloc(15*sizeof(char))";
  126. piece_t piece=piece_creer(JOUEUR_VIDE,'.',VIDE);
  127.  
  128. strcpy(tab_type,"plnbrsgkdjcfta" );
  129.  
  130. if(isupper(type))
  131. {
  132.  for(i=0;i<8; i++)
  133.  {
  134.   if(toupper(tab_type[i])==type)
  135.   {
  136.    return piece_creer(JOUEUR_0,type,PIECE_PROMUE);
  137.   }
  138.  }
  139.  for(i=0; i<14; i++)
  140.  {
  141.   if (toupper(tab_type[i])==type)
  142.   {
  143.    return piece_creer(JOUEUR_0, type, PIECE_PROMUE);
  144.   }
  145.  }
  146. }
  147. else
  148. {
  149.  for (i = 0; i < 8; ++i)
  150.  {
  151.   return piece_creer(JOUEUR_1, type, PIECE_PROMUE);
  152.  }
  153. }
  154.  
  155. return piece;
  156. }
  157. //*********************************************_________________________**************************************************
  158.  
  159. char piece_caractere(piece_t piece)
  160. {
  161. return piece.type;
  162. }
  163.  
  164. //*********************************************_________________________****************************************************
  165.  
  166. void piece_afficher(piece_t piece)
  167. {
  168. printf("%3c",piece.type );
  169. }
  170.  
  171. //***********************************************________________________*******************************************************//
  172. int case_vide(piece_t caase)
  173. {
  174. if (caase.type == '.')
  175. {
  176.  return 1;
  177. }
  178. else
  179. {
  180.  return 0;
  181. }
  182. }
  183.  
  184.  
  185. //*************************************___________________________________**********************************/
  186.  
  187. void modifier_case(partie_t *partie, piece_t piece, coordonnees_t coord )
  188. {
  189. partie->tablier[coord.x][coord.y]=piece;
  190. }
  191.  
  192. //*************************************_____________________________________********************//
  193.  
  194. void changer_joueur ( partie_t *partie)
  195. {
  196. if ( partie->joueur ==0)
  197. {
  198.  partie->joueur=1;
  199. }
  200. else
  201. {
  202.  partie->joueur=0;
  203. }
  204. }
  205.  
  206. //**************************************________________________________________******************************//
  207.  
  208. void affiche_plateau(partie_t *partie)
  209. {
  210. int i,j;
  211. printf("  " );
  212. for(i=0; i<T; i++)
  213. {
  214.  printf("%3d", i);
  215. }
  216. printf("\n" );
  217. for (i = 0; i < T; ++i)
  218. {
  219.  printf("%2d\n", i);
  220.  
  221.  for ( j = 0; i < T; ++i)
  222.  {
  223.   piece_afficher(partie->tablier[i][j]);
  224.  }
  225.  printf("\n" );
  226. }
  227. }
  228.  
  229. //***********************************______________________________*****************************//
  230. void changer_statut(piece_t *piece)
  231. {
  232. char *tab1=malloc(7*sizeof(char));
  233. char *tab2=malloc(7*sizeof(char));
  234. int i=0;
  235.  
  236. strcpy(tab1, "djcfta" );
  237. strcpy(tab2, "plnbrs" );
  238.  
  239. if (isupper(piece->type))
  240. {
  241.  for (i = 0; i <6; ++i)
  242.  {
  243.   tab1[i]=toupper(tab1[i]);
  244.   tab2[i]=toupper(tab2[i]);
  245.  }
  246. }
  247. if (piece->statut ==PIECE_PROMUE)
  248. {
  249.  for ( i = 0; i < 6; ++i)
  250.  {
  251.   if (tab1[i]==piece->type)
  252.   {
  253.    piece->type=tab2[i];
  254.    break;
  255.  
  256.   }
  257.  }
  258. }
  259. if (isupper(piece->type))
  260.   {
  261.    for (i = 0; i < 6; ++i)
  262.    {
  263.     tab1[i]=toupper(tab1[i]);
  264.     tab2[i]=toupper(tab2[i]);
  265.    }
  266.   }
  267.   if (piece->statut==PIECE_PROMUE)
  268.   {
  269.    for ( i = 0; i < 6; ++i)
  270.    {
  271.     if (tab1[i]==piece->type)
  272.     {
  273.      piece->type=tab2[i];
  274.      break;
  275.     }
  276.    }
  277.    piece->statut=PIECE_NON_PROMUE;
  278.   }
  279.   else
  280.   {
  281.    for (i = 0; i < 6; ++i)
  282.    {
  283.     if (tab2[i]==piece->type)
  284.     {
  285.      piece->type=tab1[i];
  286.      break;
  287.     }
  288.    }
  289.    piece->statut=PIECE_PROMUE;
  290.  
  291.   }
  292.   free(tab1);
  293.   free(tab2);
  294. }
  295. //****************************************************_________________________________________*******************************//
  296. void deplacemet(partie_t *partie, coordonnees_t coord_de_depart, coordonnees_t coord_darrivee)
  297. {
  298.  
  299. int i=0,j=0;
  300. int bool_capture=FAUX, bool_promotion=FAUX, reponse=FAUX;
  301. coup_t *nv_coup=malloc(sizeof(coup_t));
  302.  
  303. if(!case_vide(partie->tablier[coord_darrivee.x][coord_darrivee.y]))
  304. {
  305.  if (partie->bool_joueur==JOUEUR_1)
  306.  {
  307.   j=1;
  308.   i=T-1;
  309.   while(!case_vide(partie->tablier[i][j]) && (j<T-1))
  310.   {
  311.    j++;
  312.   }
  313.   while(!case_vide(partie->tablier[i][j]) && (i>0))
  314.   {
  315.    i--;
  316.   }
  317.   partie->tablier[coord_darrivee.x][coord_darrivee.y].joueur=JOUEUR_0;
  318.  }
  319.  else
  320.  {
  321.   i=0;
  322.   j=T-2;
  323.  
  324.   while(!case_vide(partie->tablier[i][j]) && (j>0))
  325.   {
  326.    j--;
  327.   }
  328.   while(!case_vide(partie->tablier[i][j]) && (i<T-1))
  329.   {
  330.    i++;
  331.   }
  332.   partie->tablier[coord_darrivee.x][coord_darrivee.y].joueur=JOUEUR_1;
  333.  }
  334.  bool_capture=VRAI;
  335.  
  336.  maillon_capture_t *nv_coup=malloc(sizeof(nv_coup));
  337.  nv_coup->coord_capture.x=i;
  338.  nv_coup->coord_capture.y=j;
  339.  if (liste_capture->T != 0)
  340.  {
  341.   nv_coup->suivant = liste_capture->debut;
  342.  }
  343.  else
  344.  {
  345.   nv_coup->suivant=NULL;
  346.  }
  347.  liste_capture->debut=nv_coup;
  348.  liste_capture->T=T++;
  349.  if(isupper(partie->tablier[i][j].type))
  350.  {
  351.   partie->tablier[i][j].type=tolower(partie->tablier[i][j].type);
  352.  }
  353.  else
  354.  {
  355.   partie->tablier[i][j].type=toupper(partie->tablier[i][j].type);
  356.  }
  357.  
  358.  modifier_case(partie,partie->tablier[coord_de_depart.x][coord_de_depart.y],coord_de_depart);
  359.  modifier_case(partie,partie->tablier[T-1][0],coord_de_depart);
  360.  
  361.  
  362.  if (partie->tablier[coord_darrivee.x][coord_darrivee.y].statut == PIECE_NON_PROMUE)
  363.  {
  364.   if (partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'G' && partie->tablier[coord_darrivee.x][coord_darrivee.y] != 'K' && partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'g' && partie->tablier[coord_darrivee.x][coord_darrivee.y] != 'k')
  365.  
  366.   {
  367.    if ((partie->bool_joueur == JOUEUR_1 && coord_darrivee.x < 4) || (partie->bool_joueur == JOUEUR_0 && coord_darrivee.x > 6))
  368.    {
  369.     if (tolower(partie->tablier[coord_darrivee.x][coord_darrivee.y].type == 'p') && (coord_darrivee.x == 1 || coord_darrivee.x ==9))
  370.     {
  371.      changer_statut(&partie->tablier[coord_darrivee.x][coord_darrivee.y]);
  372.      bool_promotion = VRAI;
  373.     }
  374.     else if ((partie->tablier[coord_darrivee.x][coord_darrivee.y].type == 'l') && (coord_darrivee.x == 1) || (partie->tablier[coord_darrivee.x][coord_darrivee.y].type == 'L' && coord_darrivee.x == 9))
  375.     {
  376.      changer_statut(&partie->tablier[coord_darrivee.x][coord_darrivee.y]);
  377.      bool_promotion = VRAI;
  378.     }
  379.     else if ((partie->tablier[coord_darrivee.x][coord_darrivee.y].type == 'n' && coord_darrivee.x < 3) || (partie->tablier[coord_darrivee.x][coord_darrivee.y].type == 'N' && coord_darrivee.x > 7))
  380.     {
  381.      changer_statut(&partie->tablier[coord_darrivee.x][coord_darrivee.y]);
  382.      bool_promotion = VRAI;
  383.     }
  384.     else
  385.     {
  386.      do
  387.      {
  388.       printf("voulez vous proumouvoire la piece jouee ? \n si oui tappez : 1\n si non tappez : 0\n" );
  389.       scanf("%d",&reponse);
  390.      }while(reponse != VRAI && reponse != FAUX);
  391.  
  392.      if (reponse)
  393.      {
  394.       changer_statut(&partie->tablier[coord_darrivee.x][coord_darrivee.y]);
  395.       bool_promotion = VRAI;
  396.  
  397.      }
  398.     }
  399.  
  400.    }
  401.   }
  402.  }
  403.  
  404.  nv_coup->promotion=bool_promotion;
  405.  nv_coup->capture=bool_capture;
  406.  nv_coup->depart=coord_de_depart;
  407.  nv_coup->arrivee=coord_darrivee;
  408.  
  409.  ajouter_coup_fin(partie,nv_coup);
  410. }
  411. }
  412.  
  413. /************************************************_____________________________******************************************/
  414.  
  415. void annuler_deplacement(partie_t *partie)
  416. {
  417. coup_t *dernier_coup=partie->coup_joue.fin;
  418.  
  419. if (partie->coup_joue.nb_de_coups != 1)
  420. {
  421.  dernier_coup->precedant->suivant=NULL;
  422.  partie->coup_joue.fin=dernier_coup->precedant;
  423. }
  424.  
  425. partie->coup_joue.nb_de_coups--;
  426.  
  427.  
  428. modifier_case(partie,partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y], dernier_coup->depart);
  429. modifier_case(partie,partie->tablier[T-1][0],dernier_coup->arrivee);
  430.  
  431. if (dernier_coup->capture == VRAI)
  432. {
  433.  dernier_coup = liste_capture->debut;
  434.  modifier_case(partie,partie->tablier[liste_capture->debut->coord_capture.x][liste_capture->debut->coord_capture.y],dernier_coup->arrivee);
  435.  modifier_case(partie,partie->tablier[T-1][0],liste_capture->debut->coord_capture);
  436.  liste_capture->debut=dernier_coup->suivant;
  437.  dernier_coup->suivant=NULL;
  438.  liste_capture->T--;
  439.  free(dernier_coup);
  440.  
  441.  partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].joueur=(partie->bool_joueur+1)%2;
  442. }
  443. if (isupper(partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].type))
  444. {
  445.  partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].type=tolower(partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].type);
  446. }
  447. else
  448. {
  449.  partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].type=toupper(partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].type);
  450. }
  451.  
  452. if (dernier_coup->promotion==PIECE_PROMUE)
  453. {
  454. changer_statut(&partie->tablier[dernier_coup->depart.x][dernier_coup->depart.y]);
  455. }
  456.  
  457. free(dernier_coup);
  458.  
  459. while(partie->bool_joueur==partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y].joueur)
  460. {
  461. dernier_coup=extraire_fin_liste(&partie->coup_joue);
  462. changer_statut(&partie->tablier[dernier_coup->arrivee.x][dernier_coup->arrivee.y]);
  463.  
  464. free(dernier_coup);
  465. }
  466. }
  467.  
  468. //**************************************************_________________________________***************************//
  469. int* saisie_case() {
  470.     int* saisie = calloc(6, sizeof(int));
  471. printf("Veuillez entrer l'un des choix suivants :\n\t1. Effectuer un deplacement\n\t2. Annuler le dernier deplacement\n\t3. Quitter la partie\n...? " );
  472. scanf("%u", &saisie[0]);
  473. while (saisie[0] < 1 || saisie[0] > 3)
  474.         {  printf("Erreur, aucun numero correspondant, veuillez recommencer\n...? " );
  475.  scanf("%u", &saisie[0]);
  476. }
  477.  
  478. if (saisie[0] == 1) {
  479.  printf("Entrez les coordonnees de depart et d'arrivee sous forme de quatre entiers consecutifs et de 1 pour une demande de promotion avant le deplacement, qui sera attribue seulement si possible, 0 sinon\nExemple : 2 5 3 6 1 deplace la piece situee en (2, 5) en (3, 6) avec une demande de promotion\n...? " );
  480.  scanf("%u %u %u %u %u", &saisie[1], &saisie[2], &saisie[3], &saisie[4], &saisie[5]);
  481.  while (saisie[1] > 10 || saisie[2] > 10 || saisie[3] > 10 || saisie[4] > 10 || saisie[5] > 1) {
  482.   printf("Erreur toutes les coordonnees doivent etre comprises entre 0 et 10 et la demande de promotion 1 ou 0, entrez a nouveau\n...? " );
  483.   scanf("%u %u %u %u %u", &saisie[1], &saisie[2], &saisie[3], &saisie[4], &saisie[5]);
  484.  }
  485. }
  486.  
  487. return saisie;
  488. }
  489.  
  490. //********************************************______________________________________************************************//
  491.  
  492. partie_t *partie_creer()
  493. {
  494.     partie_t *partie =  malloc(sizeof(*partie_t));
  495.  
  496.     partie->coup_joue.debut=NULL;
  497.     partie->coup_joue.fin=NULL;
  498.     partie->coup_joue.nb_de_coups=0;
  499.  
  500.     return partie;
  501. }


 
Merci par avance pour votre aide  


---------------
G-Orwell
Reply

Marsh Posté le 20-04-2017 à 22:03:53   

Reply

Marsh Posté le 20-04-2017 à 23:06:06    

piece_t piece_creer(int joueur, int type, int statut)
{
piece_t piece;
piece.joueur=joueur;
piece.type=type;
piece.statut=statut;
return piece;
}
 
Sauf que tu ne crées rien ici.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-04-2017 à 23:09:26    

Eh ben, en voila du code.

 

Tu as activé les warnings sur ton compilateur? Obligatoire!!!

 

Premier problème:
>#define T 11
>liste_capture->T
Heu... Ca risque pas de fonctionner ça. :o C'est peut-être "liste_capture->taille"? J'ai pas vérifié si c'est logique.

 

edit: Envoyé trop tôt...

 

Ce machin

Code :
  1. if (partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'G' && partie->tablier[coord_darrivee.x][coord_darrivee.y] != 'K' && partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'g' && partie->tablier[coord_darrivee.x][coord_darrivee.y] != 'k')

il lui manque des bouts, je suppose que c'est

Code :
  1. if (partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'G' && partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'K' && partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'g' && partie->tablier[coord_darrivee.x][coord_darrivee.y].type != 'k')

.

 

Et tu peux apparamment pas faire un ++ sur un #define.

 

Après le reste à toi de voir, j'ai pas le temps ni l'envie de comprendre 500 lignes de code. :o

 

Active les warnings (GCC: -Wall) (et prends les en compte :o )


Message édité par rat de combat le 20-04-2017 à 23:14:06
Reply

Marsh Posté le 20-04-2017 à 23:26:23    

Merci à vous deux.
Merci à toi rat de combat.
il manquait en effet .type  à la ligne que tu as indiqué.


---------------
G-Orwell
Reply

Sujets relatifs:

Leave a Replay

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