Partage
  • Partager sur Facebook
  • Partager sur Twitter

Je ne comprend pas le probleùe

Sujet résolu
    15 janvier 2020 à 15:39:49

    Bonjour à tous ,je suis débutant en C et j'essai de faire un début de jeu mais j'ai un problème le voici:
    main :
    choixNiveau(&categorie[5]);
    
    .h:
    void choixNiveau(enemie *categorie);
    
    .c
    void choixNiveau(enemie *categorie){
    int bufRep=0;
    printf("Choisi ton niveau :\nforet;/1/\nCave/2/\nVolcan/3/\nArreter le choix/0/");
    scanf("%d",&bufRep);
    for(int i=0;i<1;i++){
    if (bufRep==1){printf("\nVous etes au niveau 1 ,une foret plutot paisible ,vous marchez lorsque vous recontrez un %s ,il a %d PV , %d points de degat et %d points de resistance",categorie[0].nom,categorie[0].pv,categorie[0].degat,categorie[0].resistance);}}
    }


    mais lorsque je compil mon %s se transforme en ? mais ca n'est pas voulu lorsque j'ai initialisé ma structure ca marchais pourtant bien :

    void initialisation(enemie *categorie)
    {
        char name1[7]="Goblin",name2[4]="Orc",name3[6]="Troll",name4[10]="minotaure",name5[6]="golem";
        int pv=10,degat=2,resistance=1;
        for(int bufIndice=0; bufIndice<=5; bufIndice++)
        {
            categorie[bufIndice].pv=pv;
            categorie[bufIndice].degat=degat;
            categorie[bufIndice].resistance=resistance;
        }
        strcpy(categorie[0].nom,name1);
        strcpy(categorie[1].nom,name2);
        strcpy(categorie[2].nom,name3);
        strcpy(categorie[3].nom,name4);
        strcpy(categorie[4].nom,name5);
        /*for(int bufIndice2=0;bufIndice2<=4;bufIndice2++){
            printf("Son nom est %s\n",categorie[bufIndice2].nom);
            printf("il a %d point de vie\n",categorie[bufIndice2].pv);
            printf("il a %d point de degat\n",categorie[bufIndice2].degat);
            printf("il a %d point de resistance\n",categorie[bufIndice2].resistance);}*/
    }

    quand je retire les /* */ il écrit parfaitement la 1ere case de mon tableau categorie[0] mais dans l'autre fonction choixNiveau ca ne marche pas, les autres case de ce tableau marche pourtant. 

    Ps je n'ai aucun warning



      

    -
    Edité par Jefkanochard 15 janvier 2020 à 15:45:25

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2020 à 1:01:40

      Salut,
      Avec ce que tu nous montre, il y aurait plus que des warning.
      Peux-tu nous montrer le code au complet?
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        16 janvier 2020 à 6:58:17

        main:

        #include <stdio.h>
        #include <stdlib.h>
        #include "JeuA.h"
        
        int main()
        {
            int bufIndice=0;
            enemie categorie[5];
            joueur player;
            initialisation(&categorie[5]);
            printf("Voulez-vous faire une partie ?/1=oui;0=non/");
            scanf("%d",&bufIndice);
            while (bufIndice==1){
           // creationPerso(&player);
            choixNiveau(&categorie[5]);
            attaqueJoueur(&player,&categorie[5]);
            printf("\nVoulez-vous faire refaire une partie ?/1=oui;0=non/");
            scanf("%d",&bufIndice);
          }
            return 0;
        }
        fichier .h
        #ifndef JEUA_H_INCLUDED
        #define JEUA_H_INCLUDED
        #include <stdio.h>
        #include <stdlib.h>
        
        typedef struct {
        char nom[20];
        int pv;
        int degat;
        int resistance;
        }enemie;
        
        typedef struct {
        char pseudo[20];
        char classe[20];
        int PvJoueur;
        int degatJoueur;
        int resistanceJoueur;
        }joueur;
        
        int creationPerso (joueur *player);
        void initialisation(enemie *categorie);//PS ENEMIE 1=ENEMIE 4 LE 2 =LE 4=5 ECT...
        void attaqueJoueur(joueur *player,enemie *categorie);
        void choixNiveau(enemie *categorie);
        
        #endif // JEUA_H_INCLUDED
        
        fichier.c:
        #include <stdio.h>
        #include <stdlib.h>
        #include "JeuA.h"
        #include <string.h>
        int creationPerso(joueur *player)
        {
            int bufRep=0,bufRep1=0;
            char nameClasse1[9]="Guerrier",nameClasse2[9]="Assassin";
            do
            {
                printf("Quel est ton pseudo?\n");
                scanf("%s",player->pseudo);
                printf("%s,c'est bien ca?\n(1/oui 2/non)",player->pseudo);
                scanf("%d",&bufRep);
            }
            while (bufRep!=1);
            printf("Choisi ta classe \nGuerrier/1/\nAssassin/2/\nAnuler la creation/0/\n");
            scanf("%d",&bufRep1);
            if (bufRep1==1)
            {
                player->PvJoueur=20;
                player->resistanceJoueur=5;
                player->degatJoueur=5;
                strcpy(player->classe,nameClasse1);
                printf("Tu es un %s ,tu as %d PV ,%d Points de degat et %d points de resistance et tu te nomme %s",player->classe,player->PvJoueur,player->degatJoueur,player->resistanceJoueur,player->pseudo);//printf qui beug
            }
            return 0;
        }
        void initialisation(enemie *categorie)
        {
            char name1[7]="Goblin",name2[4]="Orc",name3[6]="Troll",name4[10]="minotaure",name5[6]="golem";
            int pv=10,degat=2,resistance=1;
            for(int bufIndice=0; bufIndice<=5; bufIndice++)
            {
                categorie[bufIndice].pv=pv;
                categorie[bufIndice].degat=degat;
                categorie[bufIndice].resistance=resistance;
            }
            strcpy(categorie[0].nom,name1);
            strcpy(categorie[1].nom,name2);
            strcpy(categorie[2].nom,name3);
            strcpy(categorie[3].nom,name4);
            strcpy(categorie[4].nom,name5);
            for(int bufIndice2=0;bufIndice2<=4;bufIndice2++){
                printf("Son nom est %s\n",categorie[bufIndice2].nom);
                printf("il a %d point de vie\n",categorie[bufIndice2].pv);
                printf("il a %d point de degat\n",categorie[bufIndice2].degat);
                printf("il a %d point de resistance\n",categorie[bufIndice2].resistance);}
        }
        void choixNiveau(enemie *categorie){
        int bufRep=0;
        printf("Choisi ton niveau :\nforet;/1/\nCave/2/\nVolcan/3/\nArreter le choix/0/");
        scanf("%d",&bufRep);
        for(int i=0;i<1;i++){
        if (bufRep==1){printf("\nVous etes au niveau 1 ,une foret plutot paisible ,vous marchez lorsque vous recontrez un %s ,il a %d PV , %d points de degat et %d points de resistance",categorie[0].nom,categorie[0].pv,categorie[0].degat,categorie[0].resistance);}}
        }
        void attaqueJoueur(joueur *player,enemie *categorie){};

        -
        Edité par Jefkanochard 17 janvier 2020 à 13:13:36

        • Partager sur Facebook
        • Partager sur Twitter
          16 janvier 2020 à 7:21:25

          Dans un format, le caractère % a un rôle spécial, il indique le début d'une spécification, comme dans

          printf("deux et deux font %d", 5);

          Pour le déspecialiser, il faut le doubler

          printf("100%% d'accord");


          Ps c'est un rôle tenu pendant l'EXECUTION de printf, contrairement aux antislash \ qui despecialisent pendant la compilation, au niveau notation des chaînes en C

          edit: c'est hors sujet, j'ai cru voir un % tout seul dans un format. c'était le matin, j'avais pas mes lunettes.

          -
          Edité par michelbillaud 17 janvier 2020 à 14:33:48

          • Partager sur Facebook
          • Partager sur Twitter
            16 janvier 2020 à 8:04:02

            Je ne comprend pas ce que veut dire ce qui suit:
            » mais lorsque je compil mon %s se transforme en ? mais ca n'est pas voulu lorsque j'ai initialisé ma structure ca marchais pourtant bien :
            Est-ce une erreur d'affichage? Comment un '%s' peut se transformer en '?' ...
            Tu n'as pas de '}' à la toute fin. Ça se termine par:
            void attaqueJoueur(joueur *player,enemie *categorie){};
            Il y a { suivi de } et ; ... Je doute que tu puisses compiler correctement.
            Il faudra que je refasse les copier-coller dans le bon ordre pour éviter des erreurs de définition.
            Tu as oublié les #include pour stdio.h et string.h
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              16 janvier 2020 à 8:30:00

              J'avais cru voir un % qui se baladait, mais c'était le matin trop tôt.

              @jefkanochard : on gagnerait du temps si

              1. tu avais la bonté de nous dire quel printf ne fonctionne pas correctement

              2. si tu postais tes fichiers EN ENTIER, après les avoir indentés correctement.

              • Partager sur Facebook
              • Partager sur Twitter
                16 janvier 2020 à 12:51:46

                Tu n'aurais pas un problème pour envoyer l'adresse de tes tableaux aux fonctions ?

                Ex : ligne 6 du main.c tu envoies l'adresse de la 6ème case du tableau et donc dans la fonction tu débordes puisque tu traites le nombre de case de ton tableau. (tu devrais d'ailleurs passer le nombre de cases du tableau comme paramètre aux fonctions).

                • Partager sur Facebook
                • Partager sur Twitter
                  17 janvier 2020 à 13:09:17

                  PierrotLeFou a écrit:

                  Je ne comprend pas ce que veut dire ce qui suit:
                  » mais lorsque je compil mon %s se transforme en ? mais ca n'est pas voulu lorsque j'ai initialisé ma structure ca marchais pourtant bien :
                  Est-ce une erreur d'affichage? Comment un '%s' peut se transformer en '?' ...
                  Tu n'as pas de '}' à la toute fin. Ça se termine par:
                  void attaqueJoueur(joueur *player,enemie *categorie){};
                  Il y a { suivi de } et ; ... Je doute que tu puisses compiler correctement.
                  Il faudra que je refasse les copier-coller dans le bon ordre pour éviter des erreurs de définition.
                  Tu as oublié les #include pour stdio.h et string.h
                  En effet et je l'est rajouter

                  rouloude a écrit:

                  Tu n'aurais pas un problème pour envoyer l'adresse de tes tableaux aux fonctions ?

                  Ex : ligne 6 du main.c tu envoies l'adresse de la 6ème case du tableau et donc dans la fonction tu débordes puisque tu traites le nombre de case de ton tableau. (tu devrais d'ailleurs passer le nombre de cases du tableau comme paramètre aux fonctions).

                  C'est une erreur mais ca ne viens pas de la car j'avais le bug avant et j'ai modifié pour voir si ca arrangait 



                  -
                  Edité par Jefkanochard 17 janvier 2020 à 13:15:00

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 janvier 2020 à 13:29:01

                    -

                    -
                    Edité par magma 17 janvier 2020 à 14:35:32

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Je ne comprend pas le probleùe

                    × 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