voila, je voulais faire un programme avec un petit jeu qui modifie les variables et j'ai fait exprés de créer une fonction qui modifie a l'aide des pointeurs...voir si je savais m'en servir mais il se trouve que la compilation passe mais lors de l'execution, le programme plante aprés "vous vous faite attaquer !".
pouvez vous m'expliquer pourquoi déja ca plante ? et comment corriger ce problème.
#include <stdio.h> #include <stdlib.h>
int *ptVieRestante = NULL; //récupère la vie modifié aprés le combat int *ptExpRestante = NULL; //récupère l'expérience acquéri aprés le combat
void finCombat(int *ptVie,int *ptExp);
int main(void) { int nbEnnemis = 0; int attEnnemis = 0; int attJoueur = 0; int ptVieJoueur = 50; int ptVieEnnemis = 10; int expGagne = 0;
printf("Test d'un petit jeu ecrit en C avec les pointeurs"); printf("\nVous vous faite attaquer !");
printf("\n\n\n\tVotre vie lorsque vous sortez du combat : %d",*ptVieRestante); printf("\n\tVotre vie apres le service medical : %d",ptVieJoueur); printf("\n\n\n\tVotre experience lorsque vous sortez du combat : %d",*ptExpRestante); printf("\n\tVotre experience apres les cours : %d",expGagne);
return0; }
void finCombat(int *ptVie,int *ptExp) {
ptVieRestante = *ptVie; //on garde les résultat
ptExpRestante = *ptExp;
*ptVie += 10; // on modifie encore aprés le combat
*ptExp += 52; // pareil pour l'expérience. }
Tu utilises des variables globales.
Généralement quand on programme on évite de créer des variables pour tout et n'importe quoi. Tu les utilises justement sans raison valable ici, donc vire-moi ces variables globales et tente de faire marcher ton code en déclarant tes pointeurs dans des fonctions et non dans l'espace global (en-dehors des fonctions).
void finCombat(int *ptVie,int *ptExp) {
ptVieRestante = *ptVie; //on garde les résultat
ptExpRestante = *ptExp;
*ptVie += 10; // on modifie encore aprés le combat
*ptExp += 52; // pareil pour l'expérience. }
Tu appelles finCombat avec comme variables l'adresse de ptVieJoueur et expGagne.
Après, tu assignes les valeurs qui se trouvent sur ces adresses à deux pointeurs, en gros, tes pointeurs vont pointer vers des adresses inexistantes, donc planter.
void finCombat(int *ptVie,int *ptExp) {
ptVieRestante = ptVie; //on garde les résultat
ptExpRestante = ptExp;
*ptVie += 10; // on modifie encore aprés le combat
*ptExp += 52; // pareil pour l'expérience. }
Devrait mieux fonctionner
PS; Sinon, je confirme ce que les plusieurs personnes ont dit plus haut: ton code pourrait être beaucoup mieux réecris ;). En même temps je ne suis pas programmeur C mais C++, tant de globaux me font déjà trop peur, donc c'est subjectif
*ptVie += 10; // on modifie encore aprés le combat
*ptExp += 52; // pareil pour l'expérience.
ne modifie pas les valeurs !
le résultat reste le meme.
par exemple a la fin de la boucle il reste, pour les points de vie, 25. Et bien normalement dans la fonction ca devrait rajouter 10 donc résultat 35.
hélas non, les pointeurs ne modifie pas !
meme pour l'expérience. résultat identique aprés passage de la fonction
Pas de références en C et même je déconseille leur usage. Au moins, en passant des pointeurs, rien qu'avec l'appel de fonction, tu devines que la fonction va modifier ses arguments ; avec les refs...
Pas de références en C et même je déconseille leur usage. Au moins, en passant des pointeurs, rien qu'avec l'appel de fonction, tu devines que la fonction va modifier ses arguments ; avec les refs...
Les références ne sont pas du tout une erreur du C++, ils sont là pour que le code soit plus lisible d'un côté et plus explicite d'un autre. Mettre des * partout c'est bien joli mais ça le fait mal quand tu as une classe agissant/utilisant souvent un autre objet devant être initialisé au préalable. Car une copie de l'objet donnerait un code obsolète tandis que des astérix partout rendrait la lisibilité plus difficile; bref, ce n'est pas le sujet
printf("\n\n\n\tVotre vie lorsque vous sortez du combat : %d",*ptVieRestante); printf("\n\tVotre vie apres le service medical : %d",ptVieJoueur); printf("\n\n\n\tVotre experience lorsque vous sortez du combat : %d",*ptExpRestante); printf("\n\tVotre experience apres les cours : %d",expGagne);
Pas de références en C et même je déconseille leur usage. Au moins, en passant des pointeurs, rien qu'avec l'appel de fonction, tu devines que la fonction va modifier ses arguments ; avec les refs...
Les références ne sont pas du tout une erreur du C++,
En effet, c'est le C++ tout entier qui est une erreur. xD (pas à prendre au premier degré non plus) Mais même à l'époque où je faisais du C++ j'ai toujours trouvé que les réfs étaient une connerie sauf pour les références constantes.
Citation
ils sont là pour que le code soit plus lisible d'un côté et plus explicite d'un autre.
Je n'aime pas cacher les effets de bord.
Citation
Mettre des * partout c'est bien joli mais ça le fait mal quand tu as une classe agissant/utilisant souvent un autre objet devant être initialisé au préalable.
Je ne trouve pas, les membres s'accèdent avec -> comme d'habitude, rien qui me surprenne.
Citation
Car une copie de l'objet donnerait un code obsolète tandis que des astérix partout rendrait la lisibilité plus difficile; bref, ce n'est pas le sujet
Bah quelques années de C rendent la syntaxe des pointeurs plutôt claire.
Pas de références en C et même je déconseille leur usage. Au moins, en passant des pointeurs, rien qu'avec l'appel de fonction, tu devines que la fonction va modifier ses arguments ; avec les refs...
Les références ne sont pas du tout une erreur du C++,
En effet, c'est le C++ tout entier qui est une erreur. xD (pas à prendre au premier degré non plus) Mais même à l'époque où je faisais du C++ j'ai toujours trouvé que les réfs étaient une connerie sauf pour les références constantes.
Citation
ils sont là pour que le code soit plus lisible d'un côté et plus explicite d'un autre.
Je n'aime pas cacher les effets de bord.
Citation
Mettre des * partout c'est bien joli mais ça le fait mal quand tu as une classe agissant/utilisant souvent un autre objet devant être initialisé au préalable.
Je ne trouve pas, les membres s'accèdent avec -> comme d'habitude, rien qui me surprenne.
Citation
Car une copie de l'objet donnerait un code obsolète tandis que des astérix partout rendrait la lisibilité plus difficile; bref, ce n'est pas le sujet
Bah quelques années de C rendent la syntaxe des pointeurs plutôt claire.
C'est bien ton avis
L'éternel débat du C contre le C++...
Pas de références en C?
Ca alors.. Mais, comment on fait pour initialiser un pointeur, sans référence?
(ou alors c'est que je connais pas la définition de "référence" )
Passer un paramètre par référence est pas possible en C.
En gros tu peux pas faire comme ça:
void fFunc(int &iArg ); int var;
fFun(var);
plantage dès le début !
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
If you'd like to join us, read "How do we work at OpenClassrooms"! :)