Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeurs et paramètre : HELP

Sous programmes, Pointeurs

    18 janvier 2022 à 16:06:22

    Bonjour, 

    Je ne saurais pas trouver ce qui ne va pas dans le code... J'ai beaucoup essayé je ne comprends pas... Sans doute une erreur bête...

    #include <stdio.h>
    #include <stdlib.h>
    
    void calcul(char tab[], int *voymin, int *voymaj, int *nbnum)
    {
        // Remplissage au clavier des caractères + comptage des voyelles majuscules, minuscules et des valeurs numériques
        for (int i = 0; i < 5; i++)
        {
            printf("Entrez le caractere %d\n", i+1);
            fflush(stdin);
            scanf("%c", &tab[i]);
            if (tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y')
            {
                *voymin++;
            }
            if (tab[i] == 'A' || tab[i] == 'E' || tab[i] == 'I' || tab[i] == 'O' || tab[i] == 'U' || tab[i] == 'Y')
            {
                *voymaj++;
            }
            if (tab[i] >= '0' && tab[i] <= '9')
            {
                *nbnum++;
            }
        }
    }
    
    
    int main()
    {
        char tab[5];
        int voymin =0;
        int voymaj =0;
        int nbnum =0;
        calcul(tab, &voymin, &voymaj, &nbnum);
        printf("Il y a %d voyelles minuscules\n", voymin);
        printf("Il y a %d voyelles majuscules\n", voymaj);
        printf("Il y a %d valeurs numeriques\n", nbnum);
        return 0;
    }
    


    -
    Edité par Clément 2910 18 janvier 2022 à 16:16:07

    • Partager sur Facebook
    • Partager sur Twitter
      18 janvier 2022 à 16:27:48

      Ton problème vient de la précédence des opérateurs. Tu dois mettre des parenthèses autour du pointeur pour incrémenter la valeur pointée plutôt que son adresse.

      (*voymaj)++



      -
      Edité par markand 18 janvier 2022 à 16:30:56

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        18 janvier 2022 à 16:28:56

        Tes incrémentations dans ta fonction, incrémente le pointeur et non pas la valeur pointée comme tu semble le souhaiter.

        Pour incrémenter la valeur pointée, il faut mettre des parenthèses ex :

        (*voymin)++;



        • Partager sur Facebook
        • Partager sur Twitter
        ...
          18 janvier 2022 à 17:13:36

          Ok c'est fait, néanomins il me reste qu'il semble afficher des adresses à la place de ce que je veux vraiment dans les printf...

          Dans la console : 

          "Entrez le caractere 1

          A

          Entrez le caractere 2

          e

          Entrez le caractere 3

          4

          Entrez le caractere 4

          5

          Entrez le caractere 5

          6

          Il y a 1 voyelles minuscules

          Il y a 4201201 voyelles majuscules

          Il y a 4201294 valeurs numeriques

          Process returned 0 (0x0)   execution time : 4.201 s

          Press any key to continue."

          • Partager sur Facebook
          • Partager sur Twitter
            18 janvier 2022 à 17:35:03

            Poste ton nouveau code.
            • Partager sur Facebook
            • Partager sur Twitter
            ...
              18 janvier 2022 à 17:36:31

              #include <stdio.h>
              #include <stdlib.h>
              
              void calcul(char tab[], int *voymin, int *voymaj, int *nbnum)
              {
                  // Remplissage au clavier
                  for (int i = 0; i < 5; i++)
                  {
                      printf("Entrez le caractere %d\n", i+1);
                      fflush(stdin);
                      scanf("%c", &tab[i]);
                      if (tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y')
                      {
                          (*voymin)++;
                      }
                      else if (tab[i] == 'A' || tab[i] == 'E' || tab[i] == 'I' || tab[i] == 'O' || tab[i] == 'U' || tab[i] == 'Y')
                      {
                          (*voymaj)++;
                      }
                      else if (tab[i] >= '0' && tab[i] <= '9')
                      {
                          (*nbnum)++;
                      }
                      else
                      {
                          ;
                      }
              
                  }
              }
              
              
              int main()
              {
                  char tab[5];
                  int voymin;
                  int voymaj;
                  int nbnum;
                  calcul(tab, &voymin, &voymaj, &nbnum);
                  printf("Il y a %d voyelles minuscules\n", voymin);
                  printf("Il y a %d voyelles majuscules\n", voymaj);
                  printf("Il y a %d valeurs numeriques\n", nbnum);
                  return 0;
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
                18 janvier 2022 à 17:38:50

                As-tu fait la correction pour les trois pointeurs?

                -
                Edité par PierrotLeFou 18 janvier 2022 à 17:43:18

                • Partager sur Facebook
                • Partager sur Twitter

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

                  18 janvier 2022 à 17:43:05

                  On peut préférer la forme

                  *adr_compteur += 1

                  qui est plus simple, et conserver

                  *ptr++

                  pour son usage idiomatique traditionnel : désigner ce qui est pointé et ensuite faire avancer le pointeur.

                  Dans les débuts de la programmation en C, on aimait bien se la péter avec des trucs cryptiques genre

                  while(*d++=*s++);

                  pour copier une chaîne. Heureusement, la mode en est un peu passée.

                  Ps: penser à écrire des fonctions pour caractériser les caractères (!)

                  if (est_voyelle_majuscule(tab[i]) {
                      *nb_voyelles_majuscules += 1;
                  }


                  Pour les chiffres on a déjà isdigit

                  -
                  Edité par michelbillaud 18 janvier 2022 à 17:54:44

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 janvier 2022 à 17:46:27

                    Pour faire un compteur, on incrémente le compteur Ok, mais il faut qu'il soit initialisé à 0, sinon on ne sait pas d'où il commence à compter !
                    • Partager sur Facebook
                    • Partager sur Twitter
                    ...
                      18 janvier 2022 à 17:59:19

                      Le pire est qu'il l'avait fait dans son code initial. Pourquoi l'avoir enlevé?

                      Et pourquoi avoir utilisé un tableau? Une variable locale aurait été suffisante.

                      -
                      Edité par PierrotLeFou 18 janvier 2022 à 18:19:20

                      • Partager sur Facebook
                      • Partager sur Twitter

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

                      Pointeurs et paramètre : HELP

                      × 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