Problème C
Syzko
Messages postés
11
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 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
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,
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
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...
Si vous voyez éventuellement d'autre erreur que je ne vois pas...