Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème de compiltation

    17 juin 2021 à 15:35:08

    Bonjour,

    J'ai un problème avec les exercices sur les tableaux (je suis encore débutant...).

    J'ai écrit le programme suivant pour créer une fonction qui renvoie la somme des valeurs contenues dans un tableau:

    #include <stdio.h>

    #include <stdlib.h>

    #include <math.h>

    void sommeTableau (int tableau[], int tailleTableau);

    int main()

       {

         int tableau[3]= {1, 2, 3};

         sommeTableau(tableau,3);

         return sommeTableau;

       }

    void sommeTableau(int tableau[], int tailleTableau)

    {

        int i;

        for (i=0 ; i<tailleTableau ; i++)

            {

                sommeTableau=sommeTableau+tableau[i];

            }

    }

    Et j'obtiens l'erreur de compilation suivante que je ne comprends pas:  lvalue required as left operand of assignment|

    Quelqu'un pourrait-il m'expliquer?

    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2021 à 15:54:43

      Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à  droite du post).

      Pour ton erreur c'est que tu utilises une variable sommeTableau qui n'existe pas ! Tu ne l'as pas déclarée !

      Il n'y a pas que cela ! Ta fonction sommeTableau qui elle existe bien devrait retourner le résultat (un entier) Or elle ne retourne rien !

      Ta fonction main retourne l'adresse de la fonction sommeTableau, ce n'est pas très utile (En général on lui fait retourner 0 pour dire que tout c'est bien passé).

      Conclusion, tu as du aller un peu vite dans la lecture du cours, notamment au sujet des fonctions !

      • Partager sur Facebook
      • Partager sur Twitter
        17 juin 2021 à 15:54:57

        Salut, plusieurs problèmes : Dans ta fonction "sommeTableau" ne contient pas une variable mais l'adresse de la fonction; il faut déclarer une variable qui contiendra le résultat voulu.

        Dans ton main tu renvoies l'adresse de ta fonction, il faut simplement écrire "return 0" pour indiquer à ton OS que le programme s'est terminé correctement.

        Il y a confusion entre nom de variable et nom de fonction, je te conseille de donner un nom de type "calculSommeTableau" à ta fonction et "somme" à la variable qui contiendra le résultat.

        • Partager sur Facebook
        • Partager sur Twitter
          17 juin 2021 à 16:57:06

          >Et j'obtiens l'erreur de compilation suivante que je ne comprends pas:  lvalue required as left operand of assignment|

          Merci de prendre l'habitude d'indiquer à quelle ligne se rapporte chacun des messages.

          Quelques éléments : sommeTableau est le nom d'une fonction. C'est très bien. Mais le nom d'une fonction, ce n'est pas quelque chose dont on peut se servir comme variable, pour y ranger quelques chose

          void ma_fonction (int a, int b) {
            ...
            ma_fonction = .....;  // NON !!!!!
            ...
          

          Si une fonction sert à déterminer une valeur en faisant un calcul, en général elle va RETOURNER cette valeur.  le type du résultat sera indiqué dans le prototype, et il y aura une instruction return pour retourner la valeur

          int somme_carres(int a, int b) {   // type int
             return a*a + b*b;               // valeur retournée
          }
          
          
          // ou
          
          int somme_carres(int a, int b) {   // type int
             int a2 = a * a;
             int b2 = b * b;
             int resultat = a2 + b2;
             return resultat;                // valeur retournée
          
          

          Pour employer la valeur calculée par une fonction, il suffit de l'appeler

          int carre(int n) {                    // n'hésitons pas à 
             return n * n;                      // écrire des fonctions
          }
          
          int somme_carres(int a, int b);
             return carre(a) + carre(b);        // c'est quand même plus clair
          }
          
          
          int main() {
             printf("resultat = %d\n", somme_carres(2,3));
          }
          


          Pour le nom des fonctions

          • il y a celles qui sont là pour retourner un résultat. Une bonne convention est de les nommer en fonction de la signification du résultat. carre(2), ça retourne le carré de 2. C'est pas compliqué. Pas la peine d'y mettre un "calcul", un ordinateur, ça ne fait que calculer, ça ne veut rien dire.
          • il y a celle qui représentent plutôt des actions et qui ont un type de retour void. Utiliser un infinitif.  lire_donnees, trier_tableau, afficher_resultats, etc.

          -
          Edité par michelbillaud 17 juin 2021 à 17:00:31

          • Partager sur Facebook
          • Partager sur Twitter
            17 juin 2021 à 17:59:26

            michelbillaud a écrit:

            • Pas la peine d'y mettre un "calcul", un ordinateur, ça ne fait que calculer, ça ne veut rien dire.

            Perso j'ai proposé "calculSommeTableau" car littéralement "sommeTableau" peut aussi bien signifier la somme en elle-même que la fonction renvoyant la somme
            • Partager sur Facebook
            • Partager sur Twitter
              17 juin 2021 à 18:14:08

              KevinGL a écrit:

              Perso j'ai proposé "calculSommeTableau" car littéralement "sommeTableau" peut aussi bien signifier la somme en elle-même que la fonction renvoyant la somme


              Je pense que ce n'est pas une bonne idée :

              • Quand on écrit une fonction qui retourne la somme des éléments d'un tableau, on ne sait pas la signification du tableau et peu importe. Donc 'sommeTableau', c'est très bien, pour la raison indiquée par michelbillaud (la fonction 'sqrt' ne s'appelle pas 'computeSqrt').
              • Quand on utiliser une variable numérique destinée à recevoir la somme d'un tableau, elle a une signification. Par exemple ce tableau mémorise les dépenses pour chaque mois (de 0 à 11), et alors la somme des éléments du tableau représente la dépense annuelle. La variable ne doit donc pas se nommer 'sommeTableau' mais 'depenseAnnuelle'. Son nom doit refléter sa signification.

              De même le tableau s'appellera 'Tableau' dans la liste des paramètres de la fonction, mais 'depensesMensuelles' dans le programme (toujours avec cet exemple).

              Exemples de prototypes de fonction :

              float sommeTableau(float tableau[], int taille);
              float moyenneTableau(float tableau[], int taille);

              Exemples d'appels à ces fonctions :

              float notes[50];                // tableau des notes du contrôle
              int nbEleves = 35;
              float moyenneNotes = moyenneTableau(notes, nbEleves);
              float depensesMensuelles[12]    // dépenses par mois, janvier = 0
              float depenseAnnuelle = sommeTableau(depensesMensuelles, 12);

              (Mais c'est juste mon opinion.)

              -
              Edité par robun 17 juin 2021 à 18:19:57

              • Partager sur Facebook
              • Partager sur Twitter
                17 juin 2021 à 18:41:24

                En l'occurrence, la fonction proposée au départ

                void sommeTableau(int tableau[], int tailleTableau);
                

                ne faisait bien de rien utile, vu qu'elle en retournait rien, ni par return, ni par un paramètre.

                La forme

                void calculer_somme_tableau(int tableau[], int tailleTableau);

                serait acceptable dans un contexte particulier, si le rôle de la fonction était de mettre à jour une variable globale nommé somme_tableau, justement.

                C'est probablement le modèle mental (défectueux) qu'ont les débutants avec leurs premières fonctions.

                En vrai, c'est un style de programmation dit "cookbook" qu'on retrouve en programmation OO, avec des méthodes qui calculent/mettent à jour des attributs de l'objet. https://theburningmonk.com/2015/09/exercises-in-programming-style-4/

                Autant dire qu'en C, ça tombe à plat, et que pour calculer la somme d'un tableau, c'est vraiment pas une approche à recommander.



                -
                Edité par michelbillaud 17 juin 2021 à 18:43:18

                • Partager sur Facebook
                • Partager sur Twitter
                  17 juin 2021 à 19:16:50

                  Voici une version short and sweet :)
                  Il n'est pas nécessaire d'avoir les même noms de variables dans le prototype et la définition de la fonction.
                  Même chose pour les variable correspondantes dans la fonction appelante (ici le main).
                  -
                  #include <stdio.h>

                  int sommeTableau(int array[], int length);

                  int main() {
                      int tab[4] = {1, 2, 3, 4};
                      int sum = sommeTableau(tab, 4);
                      printf("somme = %d\n", sum);
                  }

                  int sommeTableau(int tableau[], int taille) {
                      int somme = 0;
                      for(int i=0; i<taille; i++) somme += tableau[i];
                      return somme;
                  }

                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    17 juin 2021 à 19:27:17

                    PierrotLeFou a écrit:

                    Il n'est pas nécessaire d'avoir les même noms de variables dans le prototype et la définition de la fonction.

                    Je dirais même mieux, Les nom ne sont pas nécessaire dans la déclaration, seul les types suffisent !

                    Mais je ne suis pas certain que tout cela va aider le PO.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    problème de compiltation

                    × 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