Exception non gérée / violation d'acces en ecriture [Résolu/Fermé]

Signaler
-
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
-
Bonjour,
Pour mes cours nous avons un travail a faire en langage c , il s'agit d'un pile ou face qui enregistre les statistiques. Nous devons creer un menu qui permet a l'utilisateur de choisir ce qu'il veut faire (voir les stat, jouer, reinitialiser les stat, .. ) . J'ai fait le code mais je ne comprend pas ce qui se passe car au moment de rejouer et de faire un choix entre l'option 1 et l'option 3, le message suivant apparait :

Exception de première chance à 0x0fe6e30e (msvcr100d.dll) dans pile_face.exe : 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x00000031.


Le code source est le suivant :
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main()
{
int pile_face;
int valeur_ordi;
int partie_jouee = 0;
int compteur_def = 0;
int compteur_vict = 0;
int menu;
char continuer;
float pourcentage_vict = 0;
{
printf (" Pile ou Face : Le jeu ! \n");
printf ("-_-_-_-_-_-_-_-_-_-_-_-_-\n\n");

printf("\n Que voulez-vous faire ?\n");
printf("\n Pour jouer tapez 1");
printf ("\n Pour reinitialiser les statistiques tapez 2");
printf ("\n Pour consulter vos statistiques tapez 3");
printf ("\n Pour quitter l'application tapez 4\n");
scanf("%c%*c",&menu);

}
menu='1';
while (menu=='1')
{
partie_jouee++;
printf ("\nEntrez 1 pour pile ou 2 pour face:");

scanf ("%d%*c",&pile_face);

srand( time( NULL ) );
valeur_ordi=(rand() % 2)+1;

printf ("La piece est tombee sur : %d \n",valeur_ordi);
if (pile_face == valeur_ordi)
{
	printf ("Vous avez gagne\n");
	compteur_vict = compteur_vict +1;
}
else 
{
	printf ("Vous avez perdu\n");
	compteur_def = compteur_def +1;

}

printf ("Pour continuer, tapez 1. Sinon, tapez 3.  \n");
scanf ("%d%*c", menu);

}
while (menu=='2')
{
int partie_jouee = 0;
int compteur_def = 0;
int compteur_vict = 0;
float pourcentage_vict = 0;

printf("\n Que voulez-vous faire ?\n");
printf("\n Pour jouer tapez 1");
printf ("\n Pour reinitialiser les statistiques tapez 2");
printf ("\n Pour consulter vos statistiques tapez 3");
printf ("\n Pour quitter l'application tapez 4\n");
scanf("%d%*c",&menu);
}
while (menu=='3')
{
printf("Voici vos statistiques\n\n");
printf("Parties jouees: %d\n\n",partie_jouee);
printf("Parties gagnees: %d\n\n",compteur_vict);
printf("Parties perdues: %d\n\n",compteur_def);
pourcentage_vict=(((float)compteur_vict/(float)partie_jouee)*100);
printf("Taux de reussite : %f %\n\n", pourcentage_vict);
}

while (menu=='4')
{
printf ("Merci d'avoir joue avec moi !");
getchar();
getchar();

return 0;
}
}




Merci de m'aider parce que je ne comprend rien ...

Bonne journée à tous et merci d'avance !

3 réponses


Bonjour

Tu as oublié un & :
scanf ("%d%*c", menu); 

alors qu'il faut, comme tu as mis ailleurs
scanf ("%d%*c", &menu);
Oui j'ai vu mais ca ne change rien ..
Maintenant ma console se ferme immediatement apres avoir fait le premier scanf .. jpeux meme plus jouer ..
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 236
Houlà ! c'est quoi ces while en pagaille ?
srand ne s'utilise qu'une seule fois par programme, c'est l'initialisation de la graine du générateur aléatoire.
printf("Taux de reussite : %f %\n\n", pourcentage_vict);
pas de souci avec '%\' ? vire le '%' juste pour voir.
Tes scanf ne sont pas bon, ou tes test, si menu est de type 'int', il faut bien passé %d, par contre, il ne faut pas comparer avec '1' qui est un caractère dont la valeur entière dépend de la table ASCII.
Bref, beaucoup d'erreurs, difficile de te dire comment corriger, il faudrait réécrire correctement. Normalement une seule boucle while devrait suffire.