Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c] Pierro débutant

Un peu perdu

    8 octobre 2006 à 14:06:38

    Bonjour, je suis nouveau, je me présente donc. Je m'appel Pierre et je débute dans la programation. J'essaye de suivre le tutorial de M@teo21 pour le C/C++ actuelement. (Tutorial Très bien fait soit dit en passant.)
    Il m'arrive des fois de ne pas comprendre mais je n'osais pas créer un topic sur le forum à chaque fois pour les choses qui me posent problème.
    Si c'est accepté, en esperant que ca le soit (vraiment désolé pour le dérangement autrement.) j'aimerais donc créer ce sujet dans le quel je poserais mes questions et exposerais mes problèmes.
    Avec un peu de chance quelqu'un aura peut être le temps et l'envie pour m'aider.


    Donc voilà, ma première difficulté. J'en suis au chapitre "Créez vos propres types de variables !" du tutorial de M@tero21.
    J'aimerais créer une variable personalisée sous forme de tableau y entrer des données, et ensuite afficher ces données dans une autre fonction que j'ai appellé "affichage".
    Apparement j'arrive à créer cette variable, y entrer les données, mais je bloque lorsque je veux l'utiliser dans une autre fonction.

    Je vous note le code, ce sera peut être plus clair...
    main.h

    #ifndef defmain
    #define defmain

    #include <stdio.h>
    #include <stdlib.h>

    void affichage (long joueurs[]);

    typedef struct persone persone;
    struct persone
    {
        long nom[100];
        long prenom[100];
    };

    #endif


    main.c
    #include "main.h"

    int main()
    {
        long i;
        persone joueurs[2];
        for (i=0;i<2;i++)
        {
            printf("Quel est le nom du joueur %ld?\t", i+1);
            scanf("%s", joueurs[i].nom);
            printf("Quel est le prenom du joueur %ld?\t", i+1);
            scanf("%s", joueurs[i].prenom);
        }
        affichage(joueurs);

            return 0;
    }

    // affiche les infos des joueurs
    void affichage (long joueurs[])
    {
        printf("%s", joueurs[0].nom);
    }


    Dans CodeBlocks j'obtient comme erreurs:
    warning passing arg 1 of 'affichage' from incompatible pointer type
    error: request for member 'nom' in something not a structure or union


    En mettant la commande printf("%s", joueurs[0].nom); dans la fonction main directement ca marche. Mais dans la fonction "affichage" je n'arrive pas à transferer la variable "joueurs" apparement.
    J'ai beau chercher, je ne vois pas ce que je fais comme erreure.
    Je serais donc reconaissant si quelqu'un pouvait m'éclairer un peu.
    • Partager sur Facebook
    • Partager sur Twitter
      8 octobre 2006 à 14:10:52

      Salut. Ceci est justifié. En effet, ta fonction attend en paramètre un tableau de type long. Or toi tu lui passes un tableau de type struct persone c'est donc incohérent. Pour que ce soit juste, il faudrait que ta fonction prenne an paramètre un tableau de type persone et non un tableau de type long

      Secret (cliquez pour afficher)


      void affichage (persone joueurs[])
      {
          printf("%s", joueurs[0].nom);
      }



      PS: scanf est déconseillé pour la saisie de chaînes de caractères lorsque l'on ne sait pas utiliser. Renseigne toi sur fgets + fonction clean sur ce forum ;)
      • Partager sur Facebook
      • Partager sur Twitter
        8 octobre 2006 à 14:42:20

        si ton nom de joueur est une suite de caractères il faut utiliser un tableau de caractères c'est-à-dire un char plutôt qu'un long (dans ta structure persone)
        • Partager sur Facebook
        • Partager sur Twitter
          8 octobre 2006 à 17:14:24

          Merci tous les deux. Mon erreure me parait evidente maintenant, mais avant j'avais beau chercher je ne la voyais pas :)
          Pour fgets et fonction clean je vais regarder ca.
          Sinon au sujet du forum, je vois que je peux cocher indiquer que mon problème est résolu, si je coche cette case je pourais la décocher si j'ai de nouveau un problème? Ce qui risque fort d'arriver ;)
          • Partager sur Facebook
          • Partager sur Twitter
            8 octobre 2006 à 17:25:26

            Citation : Pierro.O

            Sinon au sujet du forum, je vois que je peux cocher indiquer que mon problème est résolu, si je coche cette case je pourais la décocher si j'ai de nouveau un problème? Ce qui risque fort d'arriver ;)


            Peu importe. Si tu as un problème, tu crées un topic. C'est tout.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              8 octobre 2006 à 17:54:24

              Je ne voudrais pas encombrer le forum avec trop de topics.
              • Partager sur Facebook
              • Partager sur Twitter
                8 octobre 2006 à 17:55:31

                Ce n'est pas le problème, d'autres apprendront de nouvelle choses grâce à toi, si tu en créé
                • Partager sur Facebook
                • Partager sur Twitter
                  8 octobre 2006 à 18:58:39

                  oui, mieu vaut un topic avec titre explicite par problème, comme ca ceux qui ont un problème semblable au tien pourront facilement trouver une reponse (quand on aura un bon systeme de recherche ...)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 octobre 2006 à 19:31:55

                    Daccord pour faire de nouveaux topics oui. Avec un titre clair bien sur. Mais le probleme c'est quand je ne sais pas d'où vient l'erreure. Comme c'est souvent le cas chez moi :/
                    Dailleur ca l'est de nouveau en ce moment. Toujours sur le meme projet (Truc tout bête oui, mais je bloque dessu depuis le début de l'apres midi...)
                    Comme il s'agit toujours de la meme chose je vais donc toujours vous en parler ici.

                    J'essaye donc toujours de faire la meme chose que tout à l'heure en utilisant fgets cette fois.

                    Voici le code:

                    main.h
                    #ifndef defmain
                    #define defmain

                    #include <stdio.h>
                    #include <stdlib.h>
                    #include <string.h>

                    typedef struct infos infos;
                    struct infos
                    {
                        long age;
                        long nom;
                        long prenom;
                    };

                    void afficher(infos informations[], long nombreDeJoueurs);

                    #endif


                    main.c

                    void purger(void)
                    {
                        int c;

                        while ((c = getchar()) != '\n' && c != EOF)
                        {}
                    }

                    void clean (char *chaine)
                    {
                        char *p = strchr(chaine, '\n');
                        int c;

                        if (p)
                        {
                            *p = 0;
                        }

                        else
                        {
                            purger();
                        }
                    }

                    int main()
                    {
                        infos informations[2];
                        long i;
                        for(i=0;i<2;i++)
                        {
                            printf("nom du joueur %ld ?\t", i+1);
                            fgets(informations[i].nom, sizeof informations[i].nom, stdin);
                            clean(informations[i].nom);
                            printf("prenom du joueur %ld ?\t", i+1);
                            fgets(informations[i].prenom, sizeof informations[i].prenom, stdin);
                            clean(informations[i].prenom);
                            printf("age du joueur %ld ?\t", i+1);
                            fgets(informations[i].age, sizeof informations[i].age, stdin);
                            clean(informations[i].age);
                        }
                        afficher(informations, 2);
                            return 0;
                    }

                    void afficher(infos informations[], long nombreDeJoueurs)
                    {
                        long i;
                        for(i=0;i<nombreDeJoueurs;i++)
                        {
                            printf("Le joueur %ld se nomme %s %s et il a %s ans",
                            i+1, informations[i].nom, informations[i].prenom, informations[i].age);
                        }
                    }


                    Mais lorsque je compile et lance le programme me demande juste le nom, prenom et age du premier joueur, puis s'arrete.
                    Je ne comprend pas, pourquoi la boucle "for" s'arrête? Apres la première boucle "i" devrait passer à "1" et recomencer. Car "i" est bien < à 2.
                    J'ai de nouveau du faire quelque chose de travers et je ne vois pas quoi.
                    Les formules de type fgets(informations[i].nom, sizeof informations[i].nom, stdin); ne fonctionent peut être pas?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 octobre 2006 à 20:02:56

                      Salut,

                      Pour des raisons d'efficacité, tu dois créer un problème par topic. Tu ne seras pas puni pour ça, bien au contraire on appréciera que ça soit clairement séparé.

                      Pour le titre, tu ne sais peut-être pas le décrire mais évite à tout prix "problème". Là par exemple tu connais pas ton problème, mais tu sais que ça a un rapport avec les structures. Alors mets au moins "Je ne comprends pas les structures" ou quelque chose comme ça. Ca sera toujours plus clair et ciblé que "Pierro débutant" ;)
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        8 octobre 2006 à 22:06:36

                        Citation : Pierro.O


                        Voici le code:


                        Manque un include "main.h" dans main.c...

                        Après l'avoir ajouté, ton code est encore très buggé :
                        Project : Forums
                        Compiler : GNU GCC Compiler (called directly)
                        Directory : C:\dev\forums\
                        --------------------------------------------------------------------------------
                        Switching to target: default
                        Compiling: main.c
                        In file included from main.c:1:
                        main.h:18:7: warning: no newline at end of file
                        main.c: In function `clean':
                        main.c:14: warning: unused variable `c'
                        main.c: In function `main':
                        main.c:34: warning: passing arg 1 of `fgets' makes pointer from integer without a cast
                        main.c:35: warning: passing arg 1 of `clean' makes pointer from integer without a cast
                        main.c:37: warning: passing arg 1 of `fgets' makes pointer from integer without a cast
                        main.c:38: warning: passing arg 1 of `clean' makes pointer from integer without a cast
                        main.c:40: warning: passing arg 1 of `fgets' makes pointer from integer without a cast
                        main.c:41: warning: passing arg 1 of `clean' makes pointer from integer without a cast
                        main.c: In function `afficher':
                        main.c:53: warning: format argument is not a pointer (arg 3)
                        main.c:53: warning: format argument is not a pointer (arg 4)
                        main.c:53: warning: format argument is not a pointer (arg 5)
                        main.c:55:2: warning: no newline at end of file
                        Linking console executable: C:\dev\forums\forums.exe
                        Process terminated with status 0 (0 minutes, 2 seconds)
                        0 errors, 12 warnings

                        Si ton compilateur ne dit rien, c'est qu'il est gravement buggé ou mal configuré (ou que tu compiles et exécutes sans prendre le temps de lire les warnings).

                        Je conseille donc (Code::Blocks) :
                        • build (roue dentée bleue)
                        • regarder les messages (triangle bleu)
                        • si OK : run


                        et pas F9 (build + run), car on ne voit rien. (roue dentée + fleche verte)

                        Pour le compilateur, je recommande la configuration suivante :
                        -Wall -Wextra -O2

                        En attendant, il faut corriger ces bugs.

                        Dans main.h, je découvre :

                        struct infos
                        {
                           long age;
                           long nom;
                           long prenom;
                        };

                        Peux-tu justifier le choix des types ? Parce que moi, je ne comprend pas ces choix et ça perturbe fgets() (saturation) qui est fait pour saisir une ligne de texte.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          10 octobre 2006 à 1:20:07

                          Pour le include main.h je suis désolé, je l'ais simplement oublié dans mon copier/coller. :-°

                          Citation : -ed-

                          Dans main.h, je découvre :
                          Code : C

                          struct infos
                          {
                          long age;
                          long nom;
                          long prenom;
                          };

                          Peux-tu justifier le choix des types ? Parce que moi, je ne comprend pas ces choix et ça perturbe fgets() (saturation) qui est fait pour saisir une ligne de texte.



                          En effet, non je ne peux pas justifier ce choix. C'est moi qui devait être perturbé lorsque j'ai écris ca. Ca marche tout de suite mieux avec des "char age[100]" :p
                          Merci, voilà donc où était ma plus grosse erreure.

                          Et puis pour le compilateur tu as deviné aussi, je fesais "build and run". Je m'arretais seulement sur les "error" pas sur les "warning". J'ai pu vite tout corriger en voyant les warning. C'est vraiment super pratique! Et dire que je ne me servais pas de ca.

                          Sinon pour la configuration du compilateur. J'utilise Code Blocks. Dans compiler settings/compiler flags je peux cocher -Wall et -02 mais il n'y a pas "-Wextra".
                          J'ai lu qu'on pouvait en ajouter dans other options et j'ai tenté d'ajouter -wall comme ca mais ca ne semble pas fonctioner. J'ai tapé "[-Wall]". et de cette facon il ne me trouve que 8 erreures. Avec -Wall de coché dans "compiler flags" il m'en trouve 12.
                          Il faut s'y prendre comment pour entrer de nouvelles options de configuration?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 octobre 2006 à 6:36:14

                            Citation : Pierro.O

                            Sinon pour la configuration du compilateur. J'utilise Code Blocks. Dans compiler settings/compiler flags je peux cocher -Wall et -02 mais il n'y a pas "-Wextra".
                            J'ai lu qu'on pouvait en ajouter dans other options et j'ai tenté d'ajouter -wall comme ca mais ca ne semble pas fonctioner. J'ai tapé "[-Wall]". et de cette facon il ne me trouve que 8 erreures. Avec -Wall de coché dans "compiler flags" il m'en trouve 12.
                            Il faut s'y prendre comment pour entrer de nouvelles options de configuration?


                            -W est l'ancien nom de -Wextra. Tu peux donc cocher -W

                            Sinon, ne rien cocher et entrer les options à la main dans 'Other options', tel que je l'avais indiqué (attention, les options de gcc sont sensibles à la casse : W != w)

                            Rappel :

                            -Wall -Wextra -O2


                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !
                              10 octobre 2006 à 9:21:38

                              Pas d'accord pour char age[100]. L'âge est un nombre, donc tu peux utiliser long ou int.
                              En revanche, nom et prenom doivent bien être des tableaux de char en effet.
                              • Partager sur Facebook
                              • Partager sur Twitter

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

                                11 octobre 2006 à 3:07:42

                                Citation : -ed-

                                "tel que je l'avais indiqué..." "-Wall -Wextra -O2"


                                Oui, merci. Comme ca ca marche ;) Je ne les metais pas tous sur la meme ligne, une option par ligne et ca ne fonctionait pas.

                                Citation : M@teo21

                                Pas d'accord pour char age[100]. L'âge est un nombre, donc tu peux utiliser long ou int.
                                En revanche, nom et prenom doivent bien être des tableaux de char en effet.



                                J'ai essayé, mais je ne parviens pas à utiliser fgets avec autre chose que des tableaux.
                                Demain je reessayerais de faire le jeu du "plus ou moin" avec fgets.
                                Pour le moment j'essaye quelque chose comme ca:

                                #include <stdio.h>
                                #include <stdlib.h>
                                #include <string.h>

                                void purger(void)
                                {
                                    int c;

                                    while ((c = getchar()) != '\n' && c != EOF)
                                    {}
                                }

                                void clean (char *chaine)
                                {
                                    char *p = strchr(chaine, '\n');

                                    if (p)
                                    {
                                        *p = 0;
                                    }

                                    else
                                    {
                                        purger();
                                    }
                                }

                                int main()
                                {
                                        char chain[100];
                                        long nombreEntre=101;
                                        while (nombreEntre!=<100 && nombreEntre!=>0)
                                        {
                                            fgets (chain, sizeof chain, stdin);
                                            clean(chain);
                                        }
                                        nombreEntre=(chain[0]-48)*10+chain[1]-48;
                                        printf("%ld",nombreEntre);
                                        return 0;
                                }


                                Mais le "while" ne va pas. Je sais pas comment m'y prendre. Le mieux ce serait que je puisse empecher l'utilisateur d'entrer plus de 2 caracteres et des lettres.
                                Je sais que j'ai de drôles de méthodes... Je cherches un moyen d'utiliser fgets pour pouvoir modifier de simples variables du types long, int, etc..
                                J'ai lu le tutorial de Kr00pS sur fgets et j'avoue que je trouves "sscanf" un peu compliqué et je ne comprend pas strtol et strtod.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 octobre 2006 à 8:48:12

                                  Citation : Pierro.O

                                  Citation : -ed-

                                  "tel que je l'avais indiqué..." "-Wall -Wextra -O2"


                                  Oui, merci. Comme ca ca marche ;)


                                  Tel quel, c'est à dire sur une seule ligne. Je ne sais pas comment être plus clair...

                                  Citation : Pas de titre


                                  J'ai essayé, mais je ne parviens pas à utiliser fgets avec autre chose que des tableaux.


                                  fgets() est fait pour saisir une ligne de texte. il est donc normal qu'il ne fonctionne qu'avec un tableau de char. Usage basique (lecture sur stdin) :

                                     char ligne [123];
                                     fgets (ligne, sizeof ligne, stdin);

                                  Citation : Pas de titre


                                  Mais le "while" ne va pas. Je sais pas comment m'y prendre. Le mieux ce serait que je puisse empecher l'utilisateur d'entrer plus de 2 caracteres et des lettres.
                                  Je sais que j'ai de drôles de méthodes... Je cherches un moyen d'utiliser fgets pour pouvoir modifier de simples variables du types long, int, etc..
                                  J'ai lu le tutorial de Kr00pS sur fgets et j'avoue que je trouves "sscanf" un peu compliqué et je ne comprend pas strtol et strtod.


                                  Déjà, il y a un problème d'algorithme qui complique ton code inutilement.

                                  Ce que tu veux faire, c'est :

                                  1 - saisir une valeur
                                  2 - si la valeur est incorrecte, recommencer.

                                  La structure de code est donc 'boucle avec test en fin, soit

                                  REPEAT
                                  UNTIL expression = FAUX

                                  ce qui se traduit en C par
                                  do
                                  {
                                  }
                                  while (expression == 1);

                                  (désolé pour la gymnastique cognitive.)

                                  Ensuite, après saisie et nettoyage de la chaine ou du flux, il faut convertir la chaine en valeur. Pour ça on utilise strtol() pour les entiers signés ou strtoul() pour les entiers non signés ou strtod() pour les flottants.

                                  puisque le type de la valeur est long, on va utiliser strtol().

                                  C'est simple.
                                  • Le premier paramètre reçoit le nom de la chaine à convertir
                                  • Le deuxième paramètre est un peu plus rusé, mais pour le moment, on ne l'utilise pas, alors NULL
                                  • Le troisième paramètre est la base de conversion. Ici, je suppose qu'on est en base 10, alors 10.


                                     long valeur;
                                     ...
                                     valeur = strtol(chaine, NULL, 10);

                                  rien de vraiment mystérieux ou difficile...

                                  Tu as les éléments, à toi d'intégrer tout ça. Fait de ton mieux et poste ton code.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    11 octobre 2006 à 20:05:08

                                    Citation : -ed-

                                    Tel quel, c'est à dire sur une seule ligne. Je ne sais pas comment être plus clair...



                                    Je ne te demandais pas d'être plus clair. Je te remerciais d'avoir été si clair parceque avant je n'avais pas compris. C'est ton "tel quel" qui m'a fait comprendre qu'il fallait les mettres sur la meme ligne.

                                    Et pour strtol j'avais du mal à comprendre les prototypes. arguments=paramtres=ce qu'on met entre les parentheses.

                                    Je te sens un peu agacé sur ta dernière réponse. Mais je te rassure, je cherches les choses par moi meme. Il y a seulement certaines fois où je bloque et je pars dans la mauvaise direction m'eloignant alors de la solution.

                                    Edité, ajout:

                                    Citation : -ed-

                                    Tu as les éléments, à toi d'intégrer tout ça. Fait de ton mieux et poste ton code.



                                    Cette fois je n'ais pas besoin d'aide mais tu me l'as demandé, alors voilà le code:

                                    #include <stdio.h>
                                    #include <stdlib.h>
                                    #include <string.h>
                                    #include <time.h>

                                    void purger(void){int c;while((c=getchar())!='\n'&&c!=EOF){}}void clean
                                    (char*chaine){char*p=strchr(chaine,'\n');if(p){*p=0;}else{purger();}}

                                    int main()
                                    {
                                        long MAX=100, MIN=1, nombreMystere=0, nombreTape=0, conforme=0, coups=1;
                                        char string[100], string2[100], string3[100];
                                        long nombreDeJoueurs=1, conforme2=0, marre=0, conforme3=0;
                                        do
                                        {
                                            printf("Pour jouer a 1 joueur, tapez 1. Pour jouer a deux, tapez 2\t");
                                            fgets(string2, sizeof string2, stdin);
                                            clean(string2);
                                            nombreDeJoueurs=strtol(string2,NULL,10);
                                            conforme2=(nombreDeJoueurs<3 && nombreDeJoueurs>0);
                                            if (!(conforme2))
                                            {
                                                if (!(marre))
                                                printf("Ouais ouais, et pourquoi pas a 30 hein?\n\n");
                                                marre++;
                                            }
                                            if (marre>=2)
                                            {
                                                printf("Tu veux jouer a 22 ? Va te faire un foot !");
                                                return 0;
                                            }
                                        }while (!(conforme2));



                                        if (nombreDeJoueurs==2)
                                        {
                                            printf("\nJoueur 2 choisissez un nombre entre 0 et 100 compris\t");
                                            fgets (string3, sizeof string3, stdin);
                                            clean(string3);
                                            nombreMystere=strtol(string3,NULL,10);
                                            conforme3=(nombreMystere<101 && nombreMystere>-1);
                                            if (!(conforme3))
                                            {
                                                printf("Joueur 2 choisissez un nombre entre 0 et"
                                                " 100 compris... Compris?\t");
                                                fgets (string3, sizeof string3, stdin);
                                                clean(string3);
                                                nombreMystere=strtol(string3,NULL,10);
                                                conforme3=(nombreMystere<101 && nombreMystere>-1);
                                                if (!(conforme3))
                                                {
                                                    printf("\nEn fait laisse tomber.\n Joueur 1...\n");
                                                    {srand(time(NULL));
                                                    nombreMystere=(rand() % (MAX - MIN +1))+MIN;}
                                                }
                                            }
                                        if (conforme3)
                                        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
                                        }



                                        else
                                        {srand(time(NULL));
                                        nombreMystere=(rand() % (MAX - MIN +1))+MIN;}



                                        do
                                        {
                                            do
                                            {
                                                printf("Quel est le nombre mystere ?\t");
                                                fgets(string, sizeof string, stdin);
                                                clean(string);
                                                nombreTape=strtol(string, NULL, 10);
                                                conforme=(nombreTape>-1 && nombreTape<101);
                                            }while(!(conforme));
                                            if (nombreTape<nombreMystere)
                                            printf("C'est plus !\n\n");
                                            else if (nombreTape>nombreMystere)
                                            printf("C'est moin !\n\n");
                                            else
                                            printf("C'est exact, le nombre mystere etait bien"
                                            " %ld. Vous l'avez trouve en %ld essais\n\n", nombreMystere, coups);
                                            coups++;
                                        }while (nombreMystere!=nombreTape);
                                        return 0;
                                    }


                                    les fgets et strtol ca va donc pour le moment, mais je crois qu'il est urgent que je revoye le chapitre "La programmation modulaire" de M@teo21.

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    [c] Pierro débutant

                                    × 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