opt + fix a memory leak

This commit is contained in:
Mylloon 2022-11-16 16:29:39 +01:00
parent 2d408a24f7
commit 01447538e9
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 59 additions and 79 deletions

View file

@ -5,7 +5,7 @@
#include <stdlib.h> #include <stdlib.h>
/* Une case est soit vide, soit occupé par un des joueurs, noir ou blanc */ /* Une case est soit vide, soit occupé par un des joueurs, noir ou blanc */
enum CASE_PLAT { VIDE, BLANC = -2, NOIR = 2 }; enum CASE_PLAT { VIDE, BLANC, NOIR };
/* Propriété globale du jeu */ /* Propriété globale du jeu */
enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 }; enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 };
@ -18,21 +18,18 @@ struct jeton {
}; };
typedef struct jeton Jeton; typedef struct jeton Jeton;
/* Créer un nouveau jeton */
Jeton *nouveau_jeton(void);
/* Ajoute un nouveau jeton */ /* Ajoute un nouveau jeton */
Jeton *ajoute_jeton(int position_i, int position_j, int couleur); Jeton *ajoute_jeton(int position_i, int position_j, int couleur);
/* Élement de la liste */ /* Élement de la liste */
struct element { struct element {
Jeton *jeton_act; Jeton *jeton;
struct element *suivant; struct element *suivant;
}; };
typedef struct element Element; typedef struct element Element;
/* Créer un nouvel élément pour la liste */ /* Créer un nouvel élément pour la liste */
Element *nouvel_element(void); Element *nouvel_element(Jeton *jeton);
/* Liste chaînée */ /* Liste chaînée */
struct list { struct list {
@ -44,10 +41,10 @@ typedef struct list Liste;
Liste *nouvelle_liste(void); Liste *nouvelle_liste(void);
/* Ajoute un élément à la liste */ /* Ajoute un élément à la liste */
void ajoute_liste(Element *element_actuel, Element *nouvel_element); void ajoute_liste(Liste *liste, Element *nouvel_element);
/* Supprime un élément de la liste */ /* Supprime un élément de la liste */
int supprime_liste(Element *element_actuel, Jeton *jeton); void supprime_liste(Element *element_actuel, Jeton *jeton);
/* Libère la liste en mémoire */ /* Libère la liste en mémoire */
void free_liste(Liste *liste); void free_liste(Liste *liste);
@ -65,14 +62,11 @@ typedef struct joueur Joueur;
/* Créer un nouveau joueur */ /* Créer un nouveau joueur */
Joueur *nouveau_joueur(int pion); Joueur *nouveau_joueur(int pion);
/* Ajoute un nouveau joueur */ /* Ajoute un jeton d'un joueur */
Joueur *ajoute_joueur(int pion, char *nom); void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton);
/* Ajoute un jeton d'un joueur à la liste */ /* Retire le jeton d'un joueur */
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton); void retire_jeton_joueur(Joueur *joueur, Jeton *jeton);
/* Supprime le jeton d'un joueur de la liste */
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton);
/* Jeu contenant nos 2 joueurs et le plateau de jeu */ /* Jeu contenant nos 2 joueurs et le plateau de jeu */
struct jeu { struct jeu {

View file

@ -1,13 +1,5 @@
#include "../includes/plateau.h" #include "../includes/plateau.h"
Jeton *nouveau_jeton(void) {
Jeton *jeton = malloc(sizeof(Jeton));
jeton->couleur = NOIR;
jeton->pos_i = -1;
jeton->pos_j = -1;
return jeton;
}
Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) { Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) {
Jeton *jeton = malloc(sizeof(Jeton)); Jeton *jeton = malloc(sizeof(Jeton));
jeton->couleur = couleur; jeton->couleur = couleur;
@ -19,17 +11,7 @@ Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) {
Joueur *nouveau_joueur(int pion) { Joueur *nouveau_joueur(int pion) {
Joueur *joueur = malloc(sizeof(Joueur)); Joueur *joueur = malloc(sizeof(Joueur));
joueur->nom = pion > 0 ? "NOIR" : "BLANC"; joueur->nom = pion == NOIR ? "NOIR" : "BLANC";
joueur->couleur = pion;
joueur->liste_jeton = nouvelle_liste();
joueur->nb_jeton = 0;
return joueur;
}
Joueur *ajoute_joueur(int pion, char *n) {
Joueur *joueur = malloc(sizeof(Joueur));
joueur->nom = n;
joueur->couleur = pion; joueur->couleur = pion;
joueur->liste_jeton = nouvelle_liste(); joueur->liste_jeton = nouvelle_liste();
joueur->nb_jeton = 0; joueur->nb_jeton = 0;
@ -53,5 +35,11 @@ void free_jeu(Jeu *jeu) {
free_liste(jeu->j2->liste_jeton); free_liste(jeu->j2->liste_jeton);
free(jeu->j2); free(jeu->j2);
for (int i = 0; i < LONGEUR; ++i) {
for (int j = 0; j < LARGEUR; ++j) {
free(jeu->plateau[i][j]);
}
}
free(jeu); free(jeu);
} }

View file

@ -1,7 +1,9 @@
#include "../includes/struct.h" #include "../includes/struct.h"
#include <stdlib.h>
Element *nouvel_element(void) { Element *nouvel_element(Jeton *jeton) {
Element *element = malloc(sizeof(Element)); Element *element = malloc(sizeof(Element));
element->jeton = jeton;
element->suivant = NULL; element->suivant = NULL;
return element; return element;
} }
@ -13,49 +15,49 @@ Liste *nouvelle_liste(void) {
return liste; return liste;
} }
void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton) { void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton) {
joueur->nb_jeton = joueur->nb_jeton + 1; // Change le jeton
Element *ajout = nouvel_element(); jeton->couleur = joueur->couleur;
ajout->jeton_act = jeton;
ajoute_liste(joueur->liste_jeton->premier, ajout); // Ajoute le jeton à la liste des jetons du joueur
Element *element = nouvel_element(jeton);
ajoute_liste(joueur->liste_jeton, element);
joueur->nb_jeton++;
} }
void ajoute_liste(Element *actuel, Element *nouveau) { void ajoute_liste(Liste *liste, Element *nouveau) {
if (actuel == NULL) { Element *ptr = liste->premier;
actuel = nouveau; while (ptr) {
} else if (actuel->jeton_act->pos_i != nouveau->jeton_act->pos_i || ptr = ptr->suivant;
actuel->jeton_act->pos_j != nouveau->jeton_act->pos_j) {
ajoute_liste(actuel->suivant, nouveau);
} }
ptr = nouveau;
} }
void supprime_jeton_liste(Joueur *joueur, Jeton *jeton) { void retire_jeton_joueur(Joueur *joueur, Jeton *jeton) {
if (joueur->liste_jeton->premier->jeton_act != jeton) { Element *tmp = joueur->liste_jeton->premier;
if (supprime_liste(joueur->liste_jeton->premier, jeton)) { if (tmp->jeton == jeton) {
joueur->nb_jeton = joueur->nb_jeton - 1; joueur->liste_jeton->premier = tmp->suivant;
}
} else {
joueur->liste_jeton->premier = joueur->liste_jeton->premier->suivant;
joueur->nb_jeton = joueur->nb_jeton - 1;
}
}
int supprime_liste(Element *act, Jeton *data) {
if (act->suivant == NULL) {
fprintf(stderr, "N'est pas dans la liste, pas possible de supprimer\n");
return 0;
} else if (act->suivant->jeton_act == data) {
printf("C'est (%d;%d)\n", act->suivant->jeton_act->pos_i,
act->suivant->jeton_act->pos_j);
Element *tmp = act->suivant;
act->suivant = act->suivant->suivant;
free(tmp); free(tmp);
return 1;
} else { } else {
return supprime_liste(act->suivant, data); supprime_liste(tmp, jeton);
}
joueur->nb_jeton--;
jeton->couleur = VIDE;
}
void supprime_liste(Element *act, Jeton *data) {
if (act->suivant == NULL) {
fprintf(stderr, "Élement introuvable dans la liste\n");
exit(EXIT_FAILURE);
} else if (act->suivant->jeton == data) {
Element *tmp = act->suivant;
printf("=> (%d;%d)\n", tmp->jeton->pos_i, tmp->jeton->pos_j);
act->suivant = tmp->suivant->suivant;
free(tmp);
} else {
supprime_liste(act->suivant, data);
} }
} }

View file

@ -8,20 +8,16 @@ void remplissage_debut(Jeu *jeu) {
} }
// D4 // D4
jeu->plateau[3][3]->couleur = BLANC; ajoute_jeton_joueur(jeu->j2, jeu->plateau[3][3]);
ajoute_jeton_liste(jeu->j2, jeu->plateau[3][3]);
// E4 // E4
jeu->plateau[3][4]->couleur = NOIR; ajoute_jeton_joueur(jeu->j1, jeu->plateau[3][4]);
ajoute_jeton_liste(jeu->j1, jeu->plateau[3][4]);
// E5 // E5
jeu->plateau[4][4]->couleur = BLANC; ajoute_jeton_joueur(jeu->j2, jeu->plateau[4][4]);
ajoute_jeton_liste(jeu->j2, jeu->plateau[4][4]);
// D5 // D5
jeu->plateau[4][3]->couleur = NOIR; ajoute_jeton_joueur(jeu->j1, jeu->plateau[4][3]);
ajoute_jeton_liste(jeu->j1, jeu->plateau[4][3]);
} }
char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) { char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) {