Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème ex1 chap sur les tableaux

Sujet résolu
    27 février 2006 à 19:20:19

    Salut à tous, voilà l'énoncé:

    créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur).

    voici le code :

    #include <stdio.h>
    #include <stdlib.h>
    #include "prototypes.h"
    int main()
    {
        long i;
        long tableau[4];
        long nbrecases = 4;
        long somme;
            for (i=1 ; i<5 ;i++)
            {
                printf("Quelle valeur voulez-vous attribuer a la case %ld ?\n",i);
                scanf("%ld", &tableau[i]);
            }
            printf("La somme de toutes les cases du tableau vaut : %ld",sommetableau);
            return 0;
    }

    long sommetableau(long tableau[], long nbrecases)
    {
        int i;
        long somme;
        for ( i=0 ; i<nbrecases ; i++)
        {
            somme = somme + tableau[i];
        }
        return somme;
    }


    Je pense que pour le moment ça affiche l'adresse de la variable "somme" et je ne vois pas comment solutionner le problème... Ca doit être assez simple mais je trouve pas :(
    Merci pour votre aide à très bientôt ! ^^
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      27 février 2006 à 19:28:45

      C'est une petite erreur bête ^^ ta fonction sommetableau est correcte cependant tu l'appelles mal, tu as oublié de mettre des arguments entre parenthèses :

      printf("La somme de toutes les cases du tableau vaut : %ld",sommetableau (tableau, 5));

      Pour infos, le programme doit actuellement afficher l'adresse de la fonction (si si, ça existe :p ), même si peut être qu'à cause du %ld l'adresse n'est pas forcément correcte.
      • Partager sur Facebook
      • Partager sur Twitter
        27 février 2006 à 19:32:17

        J'ai du mal à voir comment ton IDE a pu compiler ça. Déjà tu mets
        scanf("%ld", &tableau[i]);

        or tableau[i] est un pointeur, donc il ne faut pas mettre de "&".

        Ensuite, tu n'appelles pas ta fonction dans ton printf, enfin tu lui donnes pas d'arguments, il faut écrire :
        printf("La somme de toutes les cases du tableau vaut : %ld", sommetableau(tableau, tailleTableau // Enfin chez toi c'est nbrcases));
        • Partager sur Facebook
        • Partager sur Twitter
          27 février 2006 à 19:33:25

          J'avais peur de dire une bêtise en disant l'adresse la fonction, donc j'ai préféré me taire :-° Mais ça ne fonctionne pas encore avec ce que tu m'as dit ça affiche un nombre négatif o_O . et je ne vois pas pourquoi après tableau il faut ",5"?
          merci pour toutes ces réponses !

          EDIT: codeblocs et toi? matteo l'avait conseillé donc je me suis dit que j'allais l'utiliser mais je pense que dev c++ ne laissait pas passer ce genre d'erreur si?
          • Partager sur Facebook
          • Partager sur Twitter
            27 février 2006 à 19:35:43

            "5" c'est la valeur de "nbrcases", regarde bien ta fonction : il faut lui envoyer deux données, dont une variable qui définit sa taille.

            [Edit]Je sais pas comment fonctionne code::blocks (la dernière fois que je l'ai essayé sur "printf ("Bonjour");" y'avait un tas d'erreurs), mais pour le scanf (à moins que j'aie dit une connerie, hein... :-° ) Dev C++ aurait au moins mis un warning je pense.
            • Partager sur Facebook
            • Partager sur Twitter
              27 février 2006 à 19:38:13

              oui ok mais quand je retire le "&" devant tableau[i] il met une erreur de mémoire à la troisième entrée de nombre... :(
              Des avis pour codeblocks??
              dev c++ est "mieux"?

              EDIT : quand j'utilisais dev c++ il mettait un wrning pour un ligne en fin de fichier et code::blocks aussi mais je n'ai pas de nouvelle ligne o_O
              • Partager sur Facebook
              • Partager sur Twitter
                27 février 2006 à 19:39:40

                Nonnon si ça bug en enlevant le "&" c'est que depuis tout à l'heure je te dis une connerie^^
                • Partager sur Facebook
                • Partager sur Twitter
                  27 février 2006 à 19:40:56

                  ok, eh bien quand je le mets il remet le même nombre négatif :colere:
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    27 février 2006 à 19:48:39

                    Les deux IDE utilisent le même compilateur donc si ça bug avec l'un il y a de fortes chances que ça bug aussi avec l'autre.

                    Le & on ne le met pas car tableau est un... tableau, qui est implicitement converti en pointeur sauf quand il est utilisé avec & (ce qui n'est pas le cas ici puisque c'est à tableau[i] que le & est appliqué) ou sizeof, et ici tableau[i] est bien un long.

                    Et sinon en fait il y a une erreur : n'oublies pas qu'un tableau commence à 0. Au début tu déclares un tableau de 4 cases donc après tu dois mettre des for < 4 (ou <= 5 mais c'est moins clair) et passer 4 comme taille. Là je t'ai mis 5 mais tu peux changer le define, sans modifier le reste du code.

                    Bonus : le code, en utilisant un #define pour la taille.
                    #include <stdio.h>
                    #include <stdlib.h>
                    #include "prototypes.h"

                    #define NB_CASES 5

                    int main()
                    {
                        long i;
                        long tableau[NB_CASES];
                        long somme;
                            for (i=1 ; i<NB_CASES ;i++)
                            {
                                printf("Quelle valeur voulez-vous attribuer a la case %ld ?\n",i);
                                scanf("%ld", &tableau[i]);
                            }
                            printf("La somme de toutes les cases du tableau vaut : %ld",sommetableau(tableau, NB_CASES));
                            return 0;
                    }

                    long sommetableau(long tableau[], long nbrecases)
                    {
                        int i;
                        long somme;
                        for ( i=0 ; i<nbrecases ; i++)
                        {
                            somme = somme + tableau[i];
                        }
                        return somme;
                    }
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 février 2006 à 20:17:26

                      :(:colere: Ca fonctionne toujours pas, toujours le même nombre négatif...
                      voici le code modifié:

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

                      #define NB_CASES 5
                      int main()
                      {
                          long i;
                          long tableau[NB_CASES];
                          long somme;
                              for (i=1 ; i<NB_CASES ;i++)
                              {
                                  printf("Quelle valeur voulez-vous attribuer a la case %ld ?\n",i);
                                  scanf("%ld", &tableau[i]);
                              }
                              printf("La somme de toutes les cases du tableau vaut : %ld",sommetableau (tableau,NB_CASES));
                              return 0;
                      }

                      long sommetableau(long tableau[], long nbrecases)
                      {
                          int i;
                          long somme;
                          for ( i=0 ; i<nbrecases ; i++)
                          {
                              somme = somme + tableau[i];
                          }
                          return somme;
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 février 2006 à 20:34:22

                        Voici la correction à partir de ton code. Ne la regarde qu'après avoir cherché, si tu veux progresser.

                        Secret (cliquez pour afficher)
                        #include <stdio.h>
                        #include <stdlib.h>

                        #define NB_CASES 5

                        long sommetableau(long tableau[], long nbrecases);

                        int main()
                        {
                            long i = 0;
                            long tableau[NB_CASES];

                            for (i = 0; i < NB_CASES; i++) {
                        printf("Quelle valeur voulez-vous attribuer a la case %ld ?\n", i+1);
                        scanf("%ld", &tableau[i]);
                        getchar();
                            }
                               
                        printf("La somme de toutes les cases du tableau vaut : %ld", sommetableau(tableau, NB_CASES));
                               
                                getchar();
                                return 0;
                        }

                        long sommetableau(long tableau[], long nbrecases)
                        {
                            int i = 0;
                            long somme = 0;
                           
                            for (i = 0; i < nbrecases; i++) {
                                somme += tableau[i];
                            }

                            return somme;
                        }


                        Pas très propre mais bon j'ai fait ça rapidement.

                        [e:] Yeah merci bien tableau[i] est un pointeur constant, je connais. Le fait est que la théorie c'est bien, mais en pratique on se fait un dépassement de mémoire si on enlève le &. Teste donc... (et à vrai dire, ça m'a surpris aussi :p ). De plus, louisclem aussi l'a mis dans son code donc c'est un peu contradictoire... :-° [/e]
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 février 2006 à 20:40:32

                          Citation : mleg

                          scanf("%ld", &tableau[i]);


                          Hemm...j'le dis d'puis l'début mais j'vais m'répéter parce que louiclem a confirmé : tableau[i] est un POINTEUR, donc là tu lui demandes de modifier l'adresse du pointeur...d'une je suis pas sur que ça marche réellement, et de deux c'est pas ce que tu veux^^
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 février 2006 à 20:48:50

                            J'ai directement regardé mleg car j'ai déjà cherché un bon bout de temps mais je ne vois pas ce qu'il y a de fondamental qui change entre ton code et le mien et pourtant le tien fonctionne...
                            si tu pouvais m'expliquer stp :)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 février 2006 à 20:54:23

                              Tu n'avais pas initialisé tes variables à zéro.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 février 2006 à 21:01:06

                                AH ! et c'est ça qui fait tout ? il est pas sensé mettre une erreur de compilation alors?
                                encore une question il me met toujours un warning pour qui que je me un nouvelle ligne en fin de code mais je n'en ai pas je dois faire quoi ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  27 février 2006 à 21:06:22

                                  J'ai pas trop compris ta phrase mais saute deux trois ligne blanche à la fin de ton programme.
                                  (oui oui après la dernière accolade :p )
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 février 2006 à 22:32:18

                                    euh ouais désolé je me suis un peu embrouillé ;)
                                    A bientôt!
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 février 2006 à 11:46:07

                                      Salut, j'ai revu le code aujourd'hui matin en essayant de faire l'exercice 2 ( il focntionne) mais il y a quelques trucs que je comprends pas...
                                      Pourquoi utilise-t-on deux variables différentes pour le nombre de cases qui sont (NB_CASES et nbrecases) une pour la fonction et une pour la fonction main...
                                      je ne vois pas comme la fonction peut savoir que nbrecases = NB_CASES...
                                      Est-ce que si je dis que les fonctions sont tout à fait différentes de la fonction main c'est exact? en sachant que je dis différente comme quoi il faut chaque fois des variables distinctes pour chacune d'entre elles.
                                      Voilà j'espère que vous aurez compris ma demande et que vous pourrez m'éclairer :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        28 février 2006 à 12:30:40

                                        Qu'elles portent le même nom ou pas, c'est du pareil au même, elles ont les mêmes valeurs.

                                        ++.

                                        PS: pour le tableau, après réflexion, en fait tableau est assimilé pointeur et tableau[i] à *pointeur, ainsi comme à la variable pointée, donc l'opérateur & est à mettre.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 février 2006 à 13:18:09

                                          Je ne pense pas que ce que tu dis soit exact car quand je remplace Nb_CASES par nbrecases il veut pas compiler,il m'est une erreur dans le prototype de fonction... A moins que je n'ai pas compris ce que tu as dit si tu pouvais donner plus d'explications comme par exemple pourquoi est-ce que deux variables différentes valent la même chose sans qu'on ne leur demande pas parce que dans mon code il ne me semble pas avoir dit que nbrecases = NB_CASES
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            28 février 2006 à 13:35:17

                                            void fonction(int variable);

                                            int main()
                                            {
                                                int var = 1;
                                                printf("%d", fonction(var));

                                                getchar();
                                                return 0;
                                            }

                                            int fonction(int variable)
                                            {
                                                return variable++;
                                            }


                                            2


                                            Lors du passage à la fonction, variable prend var pour valeur.

                                            Au pire, va relire le cours sur les fonctions.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              28 février 2006 à 13:40:20

                                              bon ok je vais voir avec le suivant ce que ça dit...
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              problème ex1 chap sur les tableaux

                                              × 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