Problème C
Syzko
Messages postés
11
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
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);
}
}
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
-
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 -
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.
-
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, -
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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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 -
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... -
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