Partage
  • Partager sur Facebook
  • Partager sur Twitter

plantage dès le début !

test avec des pointeurs

    24 janvier 2006 à 20:33:35

    salut,

    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 !");

        srand(time(NULL));

        while(nbEnnemis < 5)
        {
            attEnnemis = (rand() %((5-1)+1))+1;
            ptVieJoueur -= attEnnemis;

            attJoueur = (rand() %((5-1)+1))+1;
            ptVieEnnemis -= attJoueur;

            if(ptVieEnnemis <= 0)
            {
                nbEnnemis++;
                expGagne += 7;
            }
        }

        finCombat(&ptVieJoueur,&expGagne);

        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);

        return 0;
    }

    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.
    }

    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      24 janvier 2006 à 20:40:16

      Je crois qu'il faut déclarer les pointeurs dans le main ?
      Sinon il y a pas de getchar / system("pause"); . Mais pas forcement besoin

      C'est peut-etre pas pour ça...

      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2006 à 20:46:32

        Il a peut-être Code::Block comme l'a dit m@téo!
        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2006 à 20:49:46

          justement je compile avec ca.
          ca peut jouer ?
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 janvier 2006 à 20:49:49

            Là est pas le problème... Mais c'est vrai que c'est mal exprimé.
            Non, sa ne pose pas de probleme si tu as Code::Blocks
            • Partager sur Facebook
            • Partager sur Twitter
              24 janvier 2006 à 20:53:00

              Vu l'usage que tu en fais, ces variables ne devraient pas être des pointeurs.

              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
              • Partager sur Facebook
              • Partager sur Twitter
                25 janvier 2006 à 1:59:19

                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).
                • Partager sur Facebook
                • Partager sur Twitter

                If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                  25 janvier 2006 à 17:28:33

                  je suis obligé de les déclarer hors des fonctions sinon j'auré droit a une erreur du type, identifiant non déclaré.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 janvier 2006 à 18:01:23


                        finCombat(&ptVieJoueur,&expGagne);



                    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 :p
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 janvier 2006 à 20:06:55

                      effectivement le programme ne plante plus :p

                      mais par contre,

                          *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
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 janvier 2006 à 20:50:03

                        [EDIT]En fait, non. =) (Suite à la réaction de rz0 qui dit qu'il n'y a pas de références en C, je modifie ma réponse :)[/EDIT]

                        Sinon essai plutôt ça:


                        void finCombat(int *ptVie,int *ptExp)
                        {
                            ptVieRestante = ptVie; //on garde les résultat
                            ptExpRestante = ptExp;
                            *ptVieRestante += 10; // on modifie encore aprés le combat
                            *ptExpRestante += 52; // pareil pour l'expérience.
                        }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          25 janvier 2006 à 20:57:27

                          Petite remarque:
                          Tu utilises...
                          srand(time(NULL));

                          ...mais tu n'as pas inclus time.h
                          • Partager sur Facebook
                          • Partager sur Twitter
                            25 janvier 2006 à 21:01:40

                            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...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              25 janvier 2006 à 21:23:33

                              Citation : rz0

                              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 :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 janvier 2006 à 21:25:40

                                j'ai réessayer ton nouveau code scotch mais les valeur de change toujours pas !
                                je remet le code modifié pour plus de clarté :) :
                                #include <stdio.h>
                                #include <stdlib.h>
                                #include <time.h>

                                    int *ptVieRestante = NULL;
                                    int *ptExpRestante = NULL;

                                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 !");

                                    srand(time(NULL));

                                    while(nbEnnemis < 5)
                                    {
                                        attEnnemis = (rand() %((5-1)+1))+1;
                                        ptVieJoueur -= attEnnemis;

                                        attJoueur = (rand() %((5-1)+1))+1;
                                        ptVieEnnemis -= attJoueur;

                                        if(ptVieEnnemis <= 0)
                                        {
                                            nbEnnemis++;
                                            expGagne += 7;
                                        }
                                    }

                                    finCombat(&ptVieJoueur,&expGagne);

                                    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);

                                    return 0;
                                }

                                void finCombat(int *ptVie,int *ptExp)
                                {
                                    ptVieRestante = ptVie;
                                    ptExpRestante = ptExp;
                                    *ptVieRestante += 10;
                                    *ptExpRestante += 52;
                                }

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 janvier 2006 à 21:40:58

                                  Citation : France1159

                                  j'ai réessayer ton nouveau code scotch mais les valeur de change toujours pas !
                                  je remet le code modifié pour plus de clarté :) :

                                  Ce code sans aucune modification fonctionne super bien chez moi :) (Remarque je n'ai qu'un compileur C++ :/)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    25 janvier 2006 à 21:50:26

                                    serait t'il a cause de codeblock ??
                                    je vais essayer sur d'autre compilateur et je te dis quoi
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 janvier 2006 à 21:51:23

                                      <hors-sujet>

                                      Citation : Scotch

                                      Citation : rz0

                                      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.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 janvier 2006 à 21:57:23

                                        Citation : rz0

                                        <hors-sujet>

                                        Citation : Scotch

                                        Citation : rz0

                                        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++...
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 janvier 2006 à 18:47:29

                                          o_O 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" :euh: )
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            26 janvier 2006 à 19:06:16

                                            Citation : Gravstein

                                            o_O 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" :euh: )

                                            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);
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            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.
                                            • Editeur
                                            • Markdown