Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec "malloc( )"

pourtant code du cours

    9 mai 2006 à 7:21:30

    :D Bonjour à tous!!!! amis zéros ^^ !!!! voilà j'ai honteusement pioché un exemple du cours sur l'allocation dynamique et lorsque je compile ca plante je ne comprends pas pourquoi :-°j'ai comme message d'erreur celui-ci;14 C:\Dev-Cpp\malloc.cpp invalid conversion from `void*' to `long int*' et voici le code sur lequel je traveille;

    #include <stdlib.h>
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        long nombreDAmis = 0, i = 0;
        long* ageAmis = NULL; // Ce pointeur va servir de tableau après l'appel du malloc

        // On demande le nombre d'amis à l'utilisateur
        printf("Combien d'amis avez-vous ? ");
        scanf("%ld", &nombreDAmis);

        if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p)
        {
            ageAmis = malloc(nombreDAmis * sizeof(long)); // On alloue de la mémoire pour le tableau
            if (ageAmis == NULL) // On vérifie si l'allocation a marché ou pas
            {
                exit(0); // On arrête tout
            }

            // On demande l'âge des amis un à un
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("Quel age a l'ami numero %ld ? ", i + 1);
                scanf("%ld", &ageAmis[i]);
            }

            // On affiche les âges stockés un à un
            printf("\n\nVos amis ont les ages suivants :\n");
            for (i = 0 ; i < nombreDAmis ; i++)
            {
                printf("%ld ans\n", ageAmis[i]);
            }

            // On libère la mémoire allouée avec malloc, on n'en a plus besoin
            free(ageAmis);
        }

        return 0;
    }
    que se passe-t-il pourquoi ca ne compile pas ou est l'erreur???? merci pour votre aide.....
    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2006 à 7:33:44

      C'est parce que tu as compilé en C++, quand tu crée un projet vérifie que tu crée bien un fichier C
      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2006 à 7:38:35

        :p ah bon bien vu merci beaucoup Cetra je n'aurais pas trouvé tout seul.....merci encore
        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2006 à 8:56:36

          Citation : hermeneute

          voilà j'ai honteusement pioché un exemple du cours


          Ce code est améliorable (tapes a<enter>), pour voir...
          Voici une version sécurisée et plus portable. Pose des questions si tu ne comprends pas.

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

          static void purge(FILE *fp)
          {
             int c;
             while ((c = fgetc(fp)) != '\n' && c != EOF)
             {
             }
          }

          int main()
          {
             int ret = EXIT_FAILURE;
             int nombreDAmis = 0;
             int n;
             /* On demande le nombre d'amis a l'utilisateur */
             do
             {
                printf("Combien d'amis avez-vous ? ");
                fflush (stdout);
                n = scanf("%d", &nombreDAmis);
                if (n != 1)
                {
                   puts("input error");
                   purge(stdin);
                }
             }
             while (n != 1);

             /* Il faut qu'il ait au moins un ami (je le plains un peu sinon :p) */
             if (nombreDAmis > 0)
             {
                /* On alloue de la memoire pour le tableau */
                int* ageAmis = malloc(nombreDAmis * sizeof * ageAmis);

                /* On verifie si l'allocation a marche ou pas */
                if (ageAmis != NULL)
                {
                   int i;
                   /* On demande l'age des amis un a un */
                   for (i = 0 ; i < nombreDAmis ; i++)
                   {
                      do
                      {
                         printf("Quel age a l'ami numero %d ? ", i + 1);
                         fflush (stdout);
                         n = scanf("%d", ageAmis + 1);
                         if (n != 1)
                         {
                            puts("input error");
                            purge(stdin);
                         }
                      }
                      while (n != 1);
                   }

                   /* On affiche les ages stockes un a un */
                   printf("\n\nVos amis ont les ages suivants :\n");
                   for (i = 0 ; i < nombreDAmis ; i++)
                   {
                      printf("%d an%s\n", ageAmis[i], ageAmis[i] > 1 ? "s" : "");
                   }

                   /* On libere la mémoire allouee, on n'en a plus besoin */
                   free(ageAmis), ageAmis = NULL;
                }
                else
                {
                   ret = EXIT_FAILURE;
                }
                assert(ageAmis == NULL);
             }

             return ret;
          }

          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            9 mai 2006 à 10:57:06

            ;) merci ed effectivement j'avais remarque sans pouvoir rien faire qu'en tappant a enter il déconnait un peu ton code est donc infiniment mieux si je pouvais tout comprendre!!!!! (ce qui est loin d'être le cas!!!!) :euh:

            Citation : -ed-


            static void purge(FILE *fp)
            {
            int c;
            while ((c = fgetc(fp)) != '\n' && c != EOF)
            {
            }
            }

            voilà déjà au début j'ai du mal a suivre ce type d'instructions tu pourrais l'expliquer quelque peu???? j'ai l'intuition du pk mais je n'arrive pas a saisir le comment bref explique ce bout de code le reste je crois que ca va (ouch fallait pas dire ca!) sinon c'est très interessant ce que tu me donnes là (je pourrais progresser un peu après ton explication) merci bcp -ed- et bon code!!!!!
            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2006 à 11:15:26

              Citation : hermeneute

              Citation : -ed-


              static void purge(FILE *fp)
              {
                 int c;
                 while ((c = fgetc(fp)) != '\n' && c != EOF)
                 {
                 }
              }

              voilà déjà au début j'ai du mal a suivre ce type d'instructions tu pourrais l'expliquer quelque peu????


              Il faut savoir que scanf() retourne le nombre de conversions réussies. Si ce nombre n'est pas celui attendu, (par exemple, on a tapé a<enter> alors qu'on attendait un entier), scanf() ne renvoi pas 1, mais les caractères saisis("a\n") ne sont pas retirés du flux entrant (stdin). Donc, le prochain appel à scanf() ne sera pas blocant (il y a déjà un '\n' dans le flux) et on part en boucle infinie...

              C'est évidemment inacceptable et c'est dû à une utilisation 'naïve' de scanf().
                scanf("%ld", &nombreDAmis);

              Habituellement, je conseille d'oublier scanf() (trop complexe) au profit de fgets() et de la fonction de conversion qui va bien, mais exceptionnellement, j'ai essayé de montrer comment utiliser scanf() correctement.

              Ca consiste à tester le code retour, et, en cas d'erreur,
              • signaler l'erreur à l'utilisateur
              • éliminer les caractères non lus (purge())
              • redemander la saisie...

              selon le principe bien connu et de bon sens :
              • Je salis
              • Je nettoie

              tout autre comportement étant jugé asocial. En informatique, c'est pareil.

                 int n;
                 /* On demande le nombre d'amis a l'utilisateur */
                 do
                 {
                    printf("Combien d'amis avez-vous ? ");
                    fflush (stdout);
                    n = scanf("%d", &nombreDAmis);
                    if (n != 1)
                    {
                       puts("input error");
                       purge(stdin);
                    }
                 }
                 while (n != 1);

              La fonction purge() va donc lire les caractères du flux jusqu'au prochain '\n', à moins que ne se produise une fin de lecture (quelle qu'en soit la cause).
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                9 mai 2006 à 11:22:18

                :o merci -ed- c'est plus clair donc cette instructions ou plutôt ces instructions ne font que controller le flux entrant (le sortant on s'en fout?) et elle sert a réactiver la demande de flux si on a entré n'importe quoi tout sauf un nombre par ailleur dans ce code on peut avoir un amis de 23897 ans ca ne pose pas de problème au C (il connait l'elexir de jouvence) :o !!! :-° bref si je me trompe tu me le fait remarquer on pourrait donner une limite d'âge entré (gr^ce a "fgets"????) en controllant le flux de sortie (peut-être)....en tout cas un tout grand merci pour ces explications claires et succintes bon code à toi -ed-!!!!!! et merci!!!!
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2006 à 11:51:33

                  Citation : hermeneute

                  donc ces instructions ne font que controller le flux entrant (le sortant on s'en fout?) et elle sert a réactiver la demande de flux si on a entré n'importe quoi tout sauf un nombre par ailleur dans ce code on peut avoir un amis de 23897 ans ca ne pose pas de problème au C (il connait l'elexir de jouvence)


                  La contrôle des limites est faisable, mais c'est le travail d'une éventuelle 'couche supérieure". Une fois qu'on a des données numériques valides, on peu en tester le domaine de définition. Mais ça n'a rien à voir avec le fait de traiter l'erreur de saisie (non numlérique) et le nettoyage qui s'en suit.

                  Il est très important de ne pas mélanger les niveaux de traitements et de bien séparer ces niveaux dans sa tête et dans le codage.

                  Dans l'industrie, on commencerait pas écrire une fonction de saisie d'entier qui retourne la valeur saisie ou qui signale une erreur.

                  Ensuite on ferait une fonction de saisie avec le prompt, la répétition en cas d'erreur de saisie etc.

                  Enfin, on ferait une fonction de saisie dans des limites définies qui utiliserait les fonctions précédentes. Chaque niveau fait son travail, mais le fait bien. Pas de mélange.

                  Et surtout, on cherche à 'capitaliser' en écrivant du code 'souple', donc réutilisable.

                  /* niveau le + haut */
                  long get_num(char const *prompt, long min, long max, int *perr);

                  long get_integer(char const *prompt, int *perr);

                  /* niveau le + bas */
                  long read_integer(int *perr);

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !

                  problème avec "malloc( )"

                  × 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