Problème C

Quelqu'un peut m'expliquer le soucis dans ce bout de code svp ?
Merci d'avance.

#include "myheader.h"

Erreur Ajouter(Joueur** PpDebJoueur, Lexique** PpDebLexique){

char pseudoLu[LGPSEUDO];
char persoLu[LGPERSO];
int pointsLu;
Personnage* pPersoRech, *pDebPersonnage, *pPersoNouv = NULL;
Erreur codeMessage, codeErreur = PAS_ERREUR;
Joueur* pJoueurRech, *pJoueurNouv = NULL;

codeMessage = OBTENIR_PSEUDO;
fflush(stdin);
AfficherMessage(PpDebLexique, codeMessage);
gets_s(pseudoLu, LGPSEUDO);

pJoueurRech = RechercherJoueur(PpDebJoueur, pseudoLu);

if(pJoueurRech != NULL && strcmp(pseudoLu, (pJoueurRech->pseudo)) == 0)
return codeErreur = JOUEUR_DEJA_EXISTANT;

if (codeErreur != JOUEUR_DEJA_EXISTANT)
{

codeErreur = AjouterJoueur(pJoueurNouv, PpDebJoueur, pseudoLu);

codeMessage = OBTENIR_PERSO;
fflush(stdin);
AfficherMessage(PpDebLexique, codeMessage);
gets_s(persoLu, LGPERSO);

while ((strcmp(persoLu, "ZZZ") != 0) && (codeErreur = PAS_ERREUR)){

codeMessage = OBTENIR_POINTS;
fflush(stdin);
AfficherMessage(PpDebLexique, codeMessage);
scanf_s("%d", &pointsLu);
getchar();

pPersoRech = RechercherPerso(PpDebJoueur, persoLu);

if (pPersoRech != NULL && strcmp(persoLu, (pPersoRech->nomPerso)) == 0)
return codeErreur = PERSO_DEJA_EXISTANT;

if (codeErreur != PERSO_DEJA_EXISTANT)
codeErreur = AjouterPersonnage(PpDebJoueur, pPersoNouv,&pDebPersonnage, persoLu, pointsLu);

codeMessage = OBTENIR_PERSO;
fflush(stdin);
AfficherMessage(PpDebLexique, codeMessage);
gets_s(persoLu, LGPERSO);
}
CLEAR;
}
return codeErreur;
}

Erreur AjouterJoueur(Joueur* pJoueurNouv, Joueur** PpDebJoueur, char pseudoLu[]){

pJoueurNouv = (Joueur*)calloc(sizeof(Joueur), 1);

if (pJoueurNouv == NULL){
return ERREUR_MEMOIRE;
}
else
{
strcpy_s(pJoueurNouv->pseudo, LGPSEUDO, pseudoLu);
pJoueurNouv->pJoueurSvt = *PpDebJoueur;
(*PpDebJoueur) = pJoueurNouv;
pJoueurNouv->pDebPersonage = NULL;
}
return PAS_ERREUR;
}

Erreur AjouterPersonnage(Joueur** PpDebJoueur,Personnage* pPersoNouv,Personnage** PpDebPersonnage, char persoLu[], int pointsLu){

pPersoNouv = (Personnage*)calloc(sizeof(Personnage), 1);

if (pPersoNouv == NULL){
return ERREUR_MEMOIRE;
}
else
{
strcpy_s(pPersoNouv->nomPerso, LGPERSO, persoLu);//pPersoNouv->nomPerso
pPersoNouv->points = pointsLu;//pPersoNouv->points = pointsLu;
pPersoNouv->pPersoSvt = (*PpDebPersonnage);//pPersoNouv->pPersoSvt = *PpDebPersonnage;
(*PpDebJoueur)->pDebPersonage = pPersoNouv;
}
return PAS_ERREUR;

}

Joueur* RechercherJoueur(Joueur** PpDebJoueur, char pseudoLu[]){

Joueur* pJoueurRech = *PpDebJoueur;

while (pJoueurRech != NULL && strcmp(pseudoLu, pJoueurRech->pseudo))
{
pJoueurRech = pJoueurRech->pJoueurSvt;
}
return pJoueurRech;
}

Personnage* RechercherPerso(Joueur** PpDebJoueur, char persoLu[]){

Personnage* pPersoRech = (*PpDebJoueur)->pDebPersonage;

while (pPersoRech != NULL && strcmp(persoLu, pPersoRech->nomPerso))
{
pPersoRech = pPersoRech->pPersoSvt;
}
return pPersoRech;
}

Erreur Imprimer(Joueur* pDebJoueur, Lexique** PpDebLexique){

Joueur* pJoueur = pDebJoueur;
Erreur codeErreur = PAS_ERREUR;

if (pJoueur != NULL){

while (pJoueur != NULL){

printf("Nom du joueur : %s\n", pJoueur->pseudo);
int totalPoints = 0;
Personnage* pPerso = pJoueur->pDebPersonage;

while (pPerso != NULL)
{
puts("test");
printf("\tNom du personnage : %s\n", pPerso->nomPerso);
puts("\tPoints du personnage : ");
printf("\t\t%d\n", pPerso->points);
totalPoints += pPerso->points;
pPerso = pPerso->pPersoSvt;
}
pJoueur = pJoueur->pJoueurSvt;
printf("Total des points du joueur : %d\n", totalPoints);
}
}
else
codeErreur = LISTE_JOUEUR_VIDE;
CLEAR;
return codeErreur;
}

Erreur Supprimer(Joueur** PpDebJoueur, Lexique** PpDebLexique){

Erreur codeErreur = PAS_ERREUR;
char pseudoSupp[LGPSEUDO];
Joueur* pJoueurRech;
char pseudoLu[LGPSEUDO];

fflush(stdin);

printf("Entrez le nom du pseudo a supprimer: ");
gets_s(pseudoSupp, LGPSEUDO);

pJoueurRech = RechercherJoueur(PpDebJoueur, pseudoSupp);

if (pJoueurRech != NULL && strcmp(pseudoLu, (pJoueurRech->pseudo)) == 0)
codeErreur = JOUEUR_DEJA_EXISTANT;

if (codeErreur == JOUEUR_DEJA_EXISTANT)
SupprimerJoueur(PpDebJoueur, pJoueurRech, pseudoSupp);
else
codeErreur = JOUEUR_ABSENT;

CLEAR;
return codeErreur;
}

void SupprimerJoueur(Joueur** PpDebJoueur, Joueur* pJoueurRech, char pseudoSupp[]){

Joueur* pJoueur = (*PpDebJoueur), *pJoueurSauve = NULL;
Personnage* pPersoSauve = NULL;

SupprimerPerso(pJoueurRech,pPersoSauve);

if (pJoueur == *PpDebJoueur)
*PpDebJoueur = pJoueur->pJoueurSvt;
else
pJoueurSauve->pJoueurSvt = pJoueur->pJoueurSvt;
free(pJoueur);
}

void SupprimerPerso(Joueur* pJoueurRech, Personnage* pPersoSauve){

Personnage* pPersonnage = pJoueurRech->pDebPersonage;

while (pPersonnage != NULL){

pPersoSauve = pPersonnage->pPersoSvt;
pPersonnage = pPersonnage->pPersoSvt;
free(pPersonnage);
}
}

7 réponses

  1. Le problème se trouve a la recherche perso, lorsque j'ajoute un deuxième personnage ,le programme plante et cela est très frustrant.
    1. Contributeur
      Bonjour,

      Je n'ai pas tout lu car le programme est illisible.
      Mais quelques remarques :
      Personnage* pPersoRech, *pDebPersonnage, *pPersoNouv = NULL;
      Cela n'initialise ni pPersoRech à NULL, ni pDebPersonnage.
      Il faut l'écrire explicitement.

      fflush(stdin);
      Comportement indéterminé. A enlever. Si tu veux flusher le buffer clavier, il faut faire soi-même la fonction.

      CLEAR;
      Ca correspond à quoi ?

      gets_s()
      Tu l'as codé toi-même ? Peux-tu montrer cette fonction ?

      Merci de reposter ce code en prenant compte des erreurs et en utilisant la balise "code" (à droite du bouton "souligné" (liste déroulante, choisis "C")).
      Cdlt,
      1. Merci pour le fflush , le CLEAR est un #define système("cls") et je ne veux pas initialiser les 2 pointeurs a null mais qu un seul . Évidemment ce n est U une partie de code. Le gets_s permet de récupérer la chaine de caractère. Oui j ai écris le code. Mais le problème est dans la recherche du perso ... Quand j ajoute 2personnages il crache
        1. Contributeur
          Le problème en C est que l'erreur ne vient pas forcément de là où on pense... C'est pourquoi c'est mieux d'avoir d'être complet.

          A titre d'exemple :
          while ((strcmp(persoLu, "ZZZ") != 0) && (codeErreur =PAS_ERREUR)){
          Tu as mis "=" au lieu de "==". Le code du while ne sera donc jamais respecté.

          Peux-tu donc poster le code du gets_s() ?
          Pourquoi ne pas avoir utiliser fgets() ?

          Et je remets : ton code est illisible. Merci donc de le reposter en utilisant les balises "code".
          Cdlt,

          Google is your friend
          1. Je n'avais pas remarqué le '==' merci de m'avoir fait remarqué , je n'utilise pas le fgets_s car de 1) Je l'utilise pour récupérer des informations venant d'un fichier.et de 2 parce que j'obtiens une chaîne de caractère. Personnellement, j'ai appris comme ça. Mon code est très bien écrit sur Visual Studio mais c'est quand je le copie-colle désolé.
            Si vous voyez éventuellement d'autre erreur que je ne vois pas...
            1. Contributeur
              Pour la 3ème fois, merci de recopier le code en utilisant la balise "code".
              Sinon c'est illisible...
              Tu écris :
              <"code">Ici tu mets ton code corrigé<"/code"> (sans les guillemets).


              Google is your friend