Scanf dans une fonction+pointeur sur structure

baptiste ottoz -  
baptiste ottoz Messages postés 2 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je début dans la programmation, j'apprend avec le site du zéro, j'en suis arrive a niveau des structure, j'ai un problème sur un scanf qui saisir sur un pointeur de srtucture voila ce que j'ai code

scanf("%d",&Pointeur_level->nombreDeCoupAJouer);


et la compilation plante a ce niveau je vous mais le reste du code pour le voir dans sont essemble
fichier.c
void paire_impaire_entre_nombre_coup_a_jouer(int paire_impaire,char nomJoueur1,char nomJoueur2,int *Pointeur_nombreMystere,int *Pointeur_level)
{

    paire_impaire = paire_impaire %2;//modulation pour verifier si la variable est paire ou impaire

    if (paire_impaire)
        {
            printf("  %s quelle est le nombre mystere ? ",nomJoueur1);
            scanf("%d",*Pointeur_nombreMystere);
            printf("  en combien de coup vous pense qu'il peut le trouve ? ");
            scanf("%d",&(Pointeur_level->nombreDeCoupAJouer));
            system("cls");
        }
    else
        {
            printf("  %s quelle est le nombre mystere ? ",nomJoueur2);
            scanf("%d",*Pointeur_nombreMystere);
            printf("  en combien de coup vous pense qu'il peut le trouve ? ");
            scanf("%d",*(Pointeur_level->nombreDeCoupAJouer));
            system("cls");
        }
}


main.c

paire_impaire_entre_nombre_coup_a_jouer(paire_impaire,nomJoueur1,nomJoueur2,&nombreMystere,&level);


merci d'avance pour votre reponse

3 réponses

  1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Bonjour,

    scanf("%d",*Pointeur_nombreMystere);
    Pointeur_nombreMystere est un pointeur donc, il faut mettre : scanf("%d",Pointeur_nombreMystere);

    scanf("%d",*(Pointeur_level->nombreDeCoupAJouer));
    C'est pas * qu'il faut mettre mais &.

    Corrige l'ensemble, recompile. Et si cela ne fonctionne toujours pas, remets ton code ici en indiquant les messages d'erreur/warning du compilateur.
    3
  2. baptiste ottoz Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
     
    oui car quand je mais

    void paire_impaire_entre_nombre_coup_a_jouer(int paire_impaire,char nomJoueur1,char nomJoueur2,int *Pointeur_nombreMystere,Difficulte *Pointeur_level)


    il ne l'accepte pas mais le compilateur accepte

    void paire_impaire_entre_nombre_coup_a_jouer(int paire_impaire,char nomJoueur1,char nomJoueur2,int *Pointeur_nombreMystereint *Pointeur_level)


    je sait c'est bizarre car au dépare quand j'ai appris les structure on ma bien dit de réceptionne le pointeur avec le nom de la structure ???
    0
  3. baptiste ottoz Messages postés 2 Date d'inscription   Statut Membre Dernière intervention  
     
    bonsoir merci pour ta réponse, j'ai corrige et ça ne marche toujours pas il me marque :

    error: request for member 'nombreDeCoupAJouer' in something not a structure or union

    je te passe les fichiers

    fichier.h

    #ifndef DEF_plus_ou_moins_fonction
    #define DEf_plus_ou_moins_fonction
    #define NOMJOUEUR 15
    //structures
    typedef struct Difficulte Difficulte;
    struct Difficulte
    {
        int MAX;
        int nombreDeCoupAJouer;
    };
    //prototypes
    void reponsePossibleCestPlus();
    void reponsePossibleCestMoins();
    void vousAvaisTrouve(char *nomJoueur1);
    void vousAvaisTrouve1(char *nomJoueur2);
    void paire_impaire_entre_nombre_coup_a_jouer(int paire_impaire,char nomJoueur1,char nomJoueur2,int *Poiteur_nombreMystere,Difficulte *Pointeur_level);
    int Pointeur_sur_paire_impaire_trouve_nombre_mystere (int *Pointeur_paire_impaire,char nomJoueur1,char nomJoueur2);
    int Pointeur_sur_paire_impaire_nombre_coup_jouer (int *Pointeur_paire_impaire,char nomJoueur1,char nomJoueur2,Difficulte);
    #endif // DEF_plus_ou_moins_fonction
    


    fichier.c

    // Génération de reponse possible
    
    void reponsePossibleCestPlus()
    {
    int MAX=5,MIN=1;
    int Reponse=0;
    
    
        Reponse = (rand() % (MAX - MIN + 1)) + MIN;
    
     if (Reponse==1)
        {
        printf("  C est plus\n\n");
        }
     else if (Reponse==2)
        {
        printf("  C est plus perds pas espoir\n\n");
        }
     else if (Reponse==3)
        {
        printf("  C est plus ou la la\n\n");
        }
    else if (Reponse==4)
        {
        printf("  C est plus ha ha\n\n");
        }
     else if (Reponse==5)
        {
        printf("  C est plus tu le fais expres ou quoi ?\n\n");
        }
    }
    
    void reponsePossibleCestMoins()
    {
    int MAX=5,MIN=1;
    int Reponse=0;
    
         Reponse = (rand() % (MAX - MIN + 1)) + MIN;
    
     if (Reponse==1)
        {
        printf("  C est moins\n");
        }
     else if (Reponse==2)
        {
        printf("  C est moins fais gaffe\n");
        }
     else if (Reponse==3)
        {
        printf("  C est moins t es fou\n");
        }
     else if (Reponse==4)
        {
        printf("  C est moins fais un effort\n");
        }
     else if (Reponse==5)
        {
        printf("  C est moins mon vieux\n");
        }
    }
    
    void vousAvaisTrouve(char *nomJoueur1)
    {
    int MAX=5,MIN=1;
    int Reponse=0;
    
         Reponse = (rand() % (MAX - MIN + 1)) + MIN;
    
     if (Reponse==1)
        {
        printf("  C est bien vous avez le nombre mystere %s ^^\n", nomJoueur1);
        }
     else if (Reponse==2)
        {
        printf("  Bravo tu es le mellieur %s :-)\n", nomJoueur1);
        }
     else if (Reponse==3)
        {
        printf("  C est bien tu l'as trouver %s !!\n", nomJoueur1);
        }
     else if (Reponse==4)
        {
        printf("  Bravo mais dis moi tu es un jedi %s\n", nomJoueur1);
        }
     else if (Reponse==5)
        {
        printf("  c est toi le plus fort %s !!\n", nomJoueur1);
        }
    }
    
    void vousAvaisTrouve1(char *nomJoueur2)
    {
    int MAX=5,MIN=1;
    int Reponse=0;
    
         Reponse = (rand() % (MAX - MIN + 1)) + MIN;
    
     if (Reponse==1)
        {
        printf("  C est bien vous avez le nombre mystere %s ^^\n", nomJoueur2);
        }
     else if (Reponse==2)
        {
        printf("  Bravo tu es le mellieur %s :-)\n", nomJoueur2);
        }
     else if (Reponse==3)
        {
        printf("  C est bien tu l'as trouver %s !!\n", nomJoueur2);
        }
     else if (Reponse==4)
        {
        printf("  Bravo mais dis moi tu es un jedi %s\n", nomJoueur2);
        }
     else if (Reponse==5)
        {
        printf("  c est toi le plus fort %s !!\n", nomJoueur2);
        }
    }
    
    void paire_impaire_entre_nombre_coup_a_jouer(int paire_impaire,char nomJoueur1,char nomJoueur2,int *Pointeur_nombreMystere,int *Pointeur_level)
    {
    
        paire_impaire = paire_impaire %2;//modulation pour verifier si la variable est paire ou impaire
    
        if (paire_impaire)
            {
                printf("  %s quelle est le nombre mystere ? ",nomJoueur1);
                scanf("%d",Pointeur_nombreMystere);
                printf("  en combien de coup vous pense qu'il peut le trouve ? ");
                scanf("%d",&(Pointeur_level->nombreDeCoupAJouer));
                system("cls");
            }
        else
            {
                printf("  %s quelle est le nombre mystere ? ",nomJoueur2);
                scanf("%d",Pointeur_nombreMystere);
                printf("  en combien de coup vous pense qu'il peut le trouve ? ");
                scanf("%d",&(Pointeur_level->nombreDeCoupAJouer));
                system("cls");
            }
    }
    
    int Pointeur_sur_paire_impaire_trouve_nombre_mystere (int *Pointeur_paire_impaire,char nomJoueur1,char nomJoueur2)
    {
    
        Pointeur_paire_impaire %= 2
    
        if (Pointeur_paire_impaire)
            {
                vousAvaisTrouve1(nomJoueur2);
                Pointuer_paire_impaire++;
            }
        else
            {
                vousAvaisTrouve(nomJoueur1);
                Pointeur_paire_impaire++;
            }
    }
    
    int Pointeur_sur_paire_impaire_nombre_coup_jouer (int *Pointeur_paire_impaire,char nomJoueur1,char nomJoueur2,level)
    {
    
        Pointeur_paire_impaire %= 2
    
        if (Pointeur_paire_impaire)
            {
                printf("%s vous avez atteint le nombre de coup limite %d coup disponible dammoge !!\n",nomJoueur2,level.nombreDeCoupAJouer);
                Pointeur_paire_impaire++;
            }
        else
            {
                printf("%s vous avez atteint le nombre de coup limite %d coup disponible dammoge !!\n",nomJoueur1,level.nombreDeCoupAJouer);
                Pointeur_paire_impaire++;
            }
    }
    


    main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include "plus_ou_moins_fonction.h"
    
    int main ( int argc, char** argv )
    {
    
    //declaration
    int paire_impaire = 0,reponse_partie = 0;
    int nombreMystere = 0, nombreEntre = 0,retourMenu = 0,votrechoix = 0, choixDifficulte = 0,compteur = 0;
    const int MIN = 1;
    char nomJoueur1[NOMJOUEUR];
    char nomJoueur2[NOMJOUEUR];
    Difficulte level;
    
    srand(time(NULL));
    
        //presentation+nom de joueur
        printf ("\n\n     bonjour bienvenu dans mon premiere jeu\n\n"
                "     nom d'utilisateur : ");
        scanf("%s",nomJoueur1);
        printf ("\n\n     bienvenu %s et bonne partie", nomJoueur1);
    
    //la boucle du programme entier
    do
    {
    
    compteur = 0;// le compteur revien a 0 a chaque nouvelle parti
    
        //choix entre solo et multi
        printf ("\n\n     Le Jeu \n     Plus ou Moins\n\n\n"
                "     ===== MENU =====\n\n\n\n\n "
                "  1 = Solo\n"
                "   2 = Multi\n"
                "   3 = Quitte le jeu\n\n"
                "   Votre choix ? : ");
        scanf  ("%d",&votrechoix);
        printf ("\n\n");
    
    switch(votrechoix)
    {
        case 1://solo
    
        paire_impaire=0; //si on a jouer en multi avant
         //difficulte
    
        printf( "     ==Choix Difficulte==\n\n"
                "  1 = Facile entre 1 et 100 en 12 coup\n"
                "  2 = Normal entre 1 et 1000 en 11 coup\n"
                "  3 = Difficile entre 1 et 10000 en 10 coup\n"
                "  4 = Difficulte personnalise\n\n"
                "  votre choix ? : ");
        scanf("%d",&choixDifficulte);
        printf ("\n\n");
    
            switch(choixDifficulte)
            {
                case 1:
    
                    level.MAX=100;
                    level.nombreDeCoupAJouer=12;
    
                break;
                case 2:
    
                    level.MAX=1000;
                    level.nombreDeCoupAJouer=11;
    
                break;
                case 3:
    
                    level.MAX=10000;
                    level.nombreDeCoupAJouer=10;
    
                break;
                case 4:
    
                    printf( "  Niveau de difficulte\n\n  ENTRE LA VALEUR VARIABLE MAX de votre choix et le nombre de coup a jouer\n\n"
                            "  Votre choix de nombre ? : ");
                    scanf("%ld",&level.MAX);
    
                    printf("  nombre de coup ? ");
                    scanf("%d",&level.nombreDeCoupAJouer);
                    printf("\n\n");
    
                break;
                default:
    
                    printf("  au revoir");
                    return 0;
    
                break;
            }
    
        // Génération du nombre aléatoire
        nombreMystere = (rand() % (level.MAX - MIN + 1)) + MIN;
    
        break;
    
        case 2://en multi
    
            printf("  entre le nom du deuxieme joueur : ");
            scanf("%s",nomJoueur2);
    
            printf("\n\n  bienvenu %s et bonne partie\n\n\n\n", nomJoueur2);
            paire_impaire++;
    
        break;
        case 3://quite le jeu
    
            printf ("\n\n      === A beintot les zero ! ===\n\n");
            return 0;
    
        break;
        default:
    
            printf("au revoir");
            return 0;
    
        break;
    }
    
    do //boucle jouer une nouvelle partie
    {
        if (paire_impaire >= 1)
            {
                //fonction multi paire_impaire
                paire_impaire_entre_nombre_coup_a_jouer(paire_impaire,nomJoueur1,nomJoueur2,&nombreMystere,&level);
            }
    //La boucle
    do
    {
    compteur++;//Incrémentation du Compteur
    level.nombreDeCoupAJouer--;//décompte
    
        printf("  Quel est le nombre ? ");
        scanf("%ld",&nombreEntre);
    
        if (nombreMystere > nombreEntre)
            {
                reponsePossibleCestPlus();
                printf("  encore %d disponible\n\n",level.nombreDeCoupAJouer);
            }
        else if (nombreMystere < nombreEntre)
            {
                reponsePossibleCestMoins();
                printf("  encore %d disponible\n\n",level.nombreDeCoupAJouer);
            }
        else if (nombreMystere==nombreEntre)
            {
                if (paire_impaire >= 1)//mode multi
                    {
                        Pointeur_sur_paire_impaire_trouve_nombre_mystere(&paire_impaire,nomJoueur1,nomJoueur2);
    
                        printf( "voulez vous recommence une pertie\n"
                                "oui=1\n"
                                "non=2\n");
                        scanf("%d",&reponse_partie);
                    }
                else//mode solo
                    {
                        vousAvaisTrouve(nomJoueur1);
                    }
    
                printf ("  Tu as fini la partie en %ld coups !! \n\n", compteur);
            }
    
        if (level.nombreDeCoupAJouer==0)
            {
                if(paire_impaire >=1)
                    {
                        Pointeur_sur_paire_impaire_nombre_coup_jouer(&paire_impaire,nomJoueur1,nomJoueur2,level);
    
                        printf( "voulez vous recommence une pertie\n"
                                "oui=1\n"
                                "non=2\n");
                        scanf("%d",&reponse_partie);
                    }
                else
                    {
                        printf("%s vous avez atteint le nombre de coup limite %d coup disponible dammoge !!\n",nomJoueur1,level.nombreDeCoupAJouer);
                    }
            }
    }while (nombreMystere != nombreEntre && level.nombreDeCoupAJouer>=1);
    }while (reponse_partie==1);
    
    
    //proposse de retourne au menu principale
       printf("\n\n   Voulez vous retourner au menu principal?\n\n"
              "   Oui=1\n"
              "   Non=2\n\n"
              "   Votre choix ");
       scanf("%ld",&retourMenu);
    
    }while(retourMenu!=2);
    
    printf ("\n\n      === A beintot les zero ! ===\n\n\n");
    system("PAUSE");
    
    return 0;
    }
    


    merci d'avance de ta réponse
    -1
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Tu considères Pointeur_level comme un int* alors qu'il s'agit d'une structure Difficulte.
      Corrige-ça et ça devrait être mieux.
      0