Problème C

Fermé
Syzko Messages postés 11 Date d'inscription lundi 13 janvier 2014 Statut Membre Dernière intervention 22 mai 2014 - 22 mai 2014 à 01:51
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 23 mai 2014 à 09:19
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

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié par [Dal] le 23/05/2014 à 09:20
Salut Syzko,

Suit les conseils avisés de fiddy.

Puisque tu utilises Visual Studio, tu devrais aussi te servir de son debogueur, qui va t'aider à identifier la partie de ton code responsable du crash.

https://loulou.developpez.com/tutoriels/cpp/debogueur-visual-studio/
https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2015/debugger/debugging-in-visual-studio?view=vs-2015&redirectedfrom=MSDN


Dal
1
Syzko Messages postés 11 Date d'inscription lundi 13 janvier 2014 Statut Membre Dernière intervention 22 mai 2014
22 mai 2014 à 01:53
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
22 mai 2014 à 09:53
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,
0
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 22/05/2014 à 16:47
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
0
Syzko Messages postés 11 Date d'inscription lundi 13 janvier 2014 Statut Membre Dernière intervention 22 mai 2014
22 mai 2014 à 17:58
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...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 22/05/2014 à 21:24
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
0