From 01447538e99f128a36ce1aff38b38b088092fb24 Mon Sep 17 00:00:00 2001 From: Mylloon Date: Wed, 16 Nov 2022 16:29:39 +0100 Subject: [PATCH] opt + fix a memory leak --- includes/struct.h | 24 ++++++--------- src/jeu.c | 26 +++++----------- src/liste.c | 76 ++++++++++++++++++++++++----------------------- src/plateau.c | 12 +++----- 4 files changed, 59 insertions(+), 79 deletions(-) diff --git a/includes/struct.h b/includes/struct.h index 5d3ca20..2b03dc2 100644 --- a/includes/struct.h +++ b/includes/struct.h @@ -5,7 +5,7 @@ #include /* 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 */ enum PLATEAU_DATA { LONGEUR = 8, LARGEUR = 8 }; @@ -18,21 +18,18 @@ struct jeton { }; typedef struct jeton Jeton; -/* Créer un nouveau jeton */ -Jeton *nouveau_jeton(void); - /* Ajoute un nouveau jeton */ Jeton *ajoute_jeton(int position_i, int position_j, int couleur); /* Élement de la liste */ struct element { - Jeton *jeton_act; + Jeton *jeton; struct element *suivant; }; typedef struct element Element; /* Créer un nouvel élément pour la liste */ -Element *nouvel_element(void); +Element *nouvel_element(Jeton *jeton); /* Liste chaînée */ struct list { @@ -44,10 +41,10 @@ typedef struct list Liste; Liste *nouvelle_liste(void); /* 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 */ -int supprime_liste(Element *element_actuel, Jeton *jeton); +void supprime_liste(Element *element_actuel, Jeton *jeton); /* Libère la liste en mémoire */ void free_liste(Liste *liste); @@ -65,14 +62,11 @@ typedef struct joueur Joueur; /* Créer un nouveau joueur */ Joueur *nouveau_joueur(int pion); -/* Ajoute un nouveau joueur */ -Joueur *ajoute_joueur(int pion, char *nom); +/* Ajoute un jeton d'un joueur */ +void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton); -/* Ajoute un jeton d'un joueur à la liste */ -void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton); - -/* Supprime le jeton d'un joueur de la liste */ -void supprime_jeton_liste(Joueur *joueur, Jeton *jeton); +/* Retire le jeton d'un joueur */ +void retire_jeton_joueur(Joueur *joueur, Jeton *jeton); /* Jeu contenant nos 2 joueurs et le plateau de jeu */ struct jeu { diff --git a/src/jeu.c b/src/jeu.c index ce18178..f9d9afb 100644 --- a/src/jeu.c +++ b/src/jeu.c @@ -1,13 +1,5 @@ #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 *jeton = malloc(sizeof(Jeton)); jeton->couleur = couleur; @@ -19,17 +11,7 @@ Jeton *ajoute_jeton(int pos_i, int pos_j, int couleur) { Joueur *nouveau_joueur(int pion) { Joueur *joueur = malloc(sizeof(Joueur)); - joueur->nom = pion > 0 ? "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->nom = pion == NOIR ? "NOIR" : "BLANC"; joueur->couleur = pion; joueur->liste_jeton = nouvelle_liste(); joueur->nb_jeton = 0; @@ -53,5 +35,11 @@ void free_jeu(Jeu *jeu) { free_liste(jeu->j2->liste_jeton); free(jeu->j2); + for (int i = 0; i < LONGEUR; ++i) { + for (int j = 0; j < LARGEUR; ++j) { + free(jeu->plateau[i][j]); + } + } + free(jeu); } diff --git a/src/liste.c b/src/liste.c index be43865..dbf5f2c 100644 --- a/src/liste.c +++ b/src/liste.c @@ -1,7 +1,9 @@ #include "../includes/struct.h" +#include -Element *nouvel_element(void) { +Element *nouvel_element(Jeton *jeton) { Element *element = malloc(sizeof(Element)); + element->jeton = jeton; element->suivant = NULL; return element; } @@ -13,49 +15,49 @@ Liste *nouvelle_liste(void) { return liste; } -void ajoute_jeton_liste(Joueur *joueur, Jeton *jeton) { - joueur->nb_jeton = joueur->nb_jeton + 1; - Element *ajout = nouvel_element(); - ajout->jeton_act = jeton; - ajoute_liste(joueur->liste_jeton->premier, ajout); +void ajoute_jeton_joueur(Joueur *joueur, Jeton *jeton) { + // Change le jeton + jeton->couleur = joueur->couleur; + + // 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) { - if (actuel == NULL) { - actuel = nouveau; - } else if (actuel->jeton_act->pos_i != nouveau->jeton_act->pos_i || - actuel->jeton_act->pos_j != nouveau->jeton_act->pos_j) { - ajoute_liste(actuel->suivant, nouveau); +void ajoute_liste(Liste *liste, Element *nouveau) { + Element *ptr = liste->premier; + while (ptr) { + ptr = ptr->suivant; } + ptr = nouveau; } -void supprime_jeton_liste(Joueur *joueur, Jeton *jeton) { - if (joueur->liste_jeton->premier->jeton_act != jeton) { - if (supprime_liste(joueur->liste_jeton->premier, jeton)) { - joueur->nb_jeton = joueur->nb_jeton - 1; - } - - } 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; +void retire_jeton_joueur(Joueur *joueur, Jeton *jeton) { + Element *tmp = joueur->liste_jeton->premier; + if (tmp->jeton == jeton) { + joueur->liste_jeton->premier = tmp->suivant; free(tmp); - - return 1; } 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); } } diff --git a/src/plateau.c b/src/plateau.c index 1990d83..51d5eb3 100644 --- a/src/plateau.c +++ b/src/plateau.c @@ -8,20 +8,16 @@ void remplissage_debut(Jeu *jeu) { } // D4 - jeu->plateau[3][3]->couleur = BLANC; - ajoute_jeton_liste(jeu->j2, jeu->plateau[3][3]); + ajoute_jeton_joueur(jeu->j2, jeu->plateau[3][3]); // E4 - jeu->plateau[3][4]->couleur = NOIR; - ajoute_jeton_liste(jeu->j1, jeu->plateau[3][4]); + ajoute_jeton_joueur(jeu->j1, jeu->plateau[3][4]); // E5 - jeu->plateau[4][4]->couleur = BLANC; - ajoute_jeton_liste(jeu->j2, jeu->plateau[4][4]); + ajoute_jeton_joueur(jeu->j2, jeu->plateau[4][4]); // D5 - jeu->plateau[4][3]->couleur = NOIR; - ajoute_jeton_liste(jeu->j1, jeu->plateau[4][3]); + ajoute_jeton_joueur(jeu->j1, jeu->plateau[4][3]); } char recupere_case(Jeton *plateau[LONGEUR][LARGEUR], int case_i, int case_j) {