Partage
  • Partager sur Facebook
  • Partager sur Twitter

Incompréhension totale

    20 septembre 2017 à 14:13:39

    Bonsoir je suis sur open classrooms depuis moins d'une semaine et j'ai commencé à apprendre le C j'en suis a la 2ème partie sur le tableau et j'en suis arrivé aux exercices et je me sent débile car je n'arrive pas a faire le exercices ducoup je suis aller voir sur internet pour m'aider et même ca je ne comprends pas : 

    #include <stdio.h>
    #include <stdlib.h>
     
    int sommeTableau(int tableau[], int tailleTableau);
     
    int main(int argc, char *argv[])
    {
        int tableau[4] = {10, 20, 30, 40};
     
        sommeTableau(tableau, 4);
     
        printf("La somme des valeurs du tableau est %d\n\n", sommeTableau(tableau, 4));
     
        return 0;
    }
     
    int sommeTableau(int tableau[], int tailleTableau)
    {
        int somme = 0, i =0;
     
        for (i=0; i<tailleTableau; i++)
        {
            somme = somme + tableau[i];
        }
     
        return somme;
    }


    Je n'ai toujours pas compris à quoi sert les prototypes j'ai beau relire le cours regarder des vidéos ytb ou même regarde autre parts sur internet je ne comprends pas non plus pourquoi il y'a écrit : int sommeTableau(int tableau[], int tailleTableau); :waw: Ce que je comprends dans ça c'est qu'il a crée une variable (sommeTableau) et après je ne comprends pas pourquoi il y a ça (oui je suis vraiment paumé) et je n'ai pas compris non plus les "return" je pense que je ne suis pas une personne logique voilà c'est tout si quelqu'un voudrais bien m'éclairer  je suis preneur :) Merci ! (et je ne vous parle pas des pointeurs j'ai compris pendant 30 sec que cela servait à "pointer" l'adresse d'une valeur puis c'est parti en steak, ca va trop vite pour moi :o )

    • Partager sur Facebook
    • Partager sur Twitter
    Un bon programmeur est un programmeur fainéant !
      20 septembre 2017 à 14:34:07

      SommeTableau n'est pas une variable, mais une fonction.

      Un compilateur a besoin de connaitre la déclaration de tout ce qu'il rencontre en effectuant une lecture du fichier de haut en bas.

      Par exemple, à la ligne 10, tu appelles la fonction sommeTableau. Si tu n'avais pas déclarer son prototype à la ligne 4, le compilateur t'aurait envoyé une insulte en disant qu'il ne connaissait pas à quoi correspondait sommeTableau.

      En général, les prototypes sont déclarés dans un fichier différent appelé fichier d'entête et ayant l'extension .h, d'ou le #include <stdio.h> par exemple.

      Les fonctions telles que sommetableau (lignes 17 à 26) peuvent aussi être déclarées dans des fichiers différents, voire dans des librairies.

      le return permet à la fonction de renvoyer le travail pour lequel elle a été écrite (en l'occurrence la somme) à la fonction appelante (en l'occurrence main à la ligne 10)

      • Partager sur Facebook
      • Partager sur Twitter
        20 septembre 2017 à 14:44:01

        Bonjour !

        Essayons d'expliquer :

        1) Les prototypes

        Le compilateur parcourt le code source du début à la fin. S'il n'y avait pas de prototype, que se passerait-il ?

        ‒ D'abord le compilateur lit la ligne du main. Pas de souci, la fonction 'main' est une fonction prédéfinie avec le langage C.

        ‒ Ensuite il lit les déclarations. Tout va bien, ça utilise des mots-clés et une syntaxe que le compilateur connaît ('int', les crochets, etc.)

        ‒ Puis il lit la ligne « sommeTableau(tableau, 4) ; » Là ça ne va pas : il ne connaît pas la fonction "sommeTableau", puisque celle-ci a été inventée par le programmeur, donc n'est pas une fonction du langage.

        Il est donc nécessaire que, avant l'appel à la fonction 'sommeTableau', celle-ci ait été déclarée (c'est la même logique que pour les variables : une variable ou un tableau doit être déclarée avant utilisation).

        Par ailleurs, les concepteurs du langage C ont décidé que, contrairement aux variables, les fonctions doivent être situées en dehors du 'main' (c'est juste un choix ‒ dans d'autres langages les fonctions font partie du 'main' ou même d'autres fonctions). La déclaration de la fonction doit donc se faire avant le main. C'est ce qu'on appelle un prototype.

        Donc :

        ‒ La ligne 4 « déclare » la fonction, c'est-à-dire demande au compilateur de réserver un espace mémoire. Cet espace mémoire dépend des arguments de la fonction et du type de son retour, c'est pourquoi on doit préciser tout ça : une fonction qui renvoie un 'int' n'aura pas besoin du même espace mémoire qu'une fonction qui renvoie un 'double' (par exemple), et si elle utilise des arguments, ceux-ci ont besoin d'un espace mémoire car ils seront recopiés, donc là encore on le précise : « int sommeTableau(int tableau[], int tailleTableau); » déclare (demande de l'espace mémoire au compilateur) une fonction qui retourne un 'int' et qui va utiliser deux arguments : un tableau de 'int' et un 'int'. On n'indique pas la taille du tableau pour une raison subtile que je ne vais pas expliquer.

        Remarque : on a le droit, en fait, de ne pas déclarer la fonction, à condition de recopier sa définition avant le 'main'. Je ne détaille pas car c'est une pratique peu courante.

        2) je ne comprends pas non plus pourquoi il y'a écrit : int sommeTableau(int tableau[], int tailleTableau); 

        Là encore, je vais essayer... Une fonction retourne toujours une valeur. Même quand elle ne retourne rien, on dit qu'elle retourne du vide ("void"). C'est la première chose à indiquer au compilateur, car suivant le type de la valeur de retour, l'espace mémoire à réserver ne sera pas le même. Ici, 'sommeTableau' retourne une valeur, la somme des valeurs du tableau, qui est de type 'int', Donc on écrit 'int'.

        Ensuite on écrit le nom de la fonction : 'sommeTableau'.

        Pour l'instant, c'est exactement la même chose que lorsqu'on déclare une variable :

        int x ;
        double y ;
        int sommeTableau ;
        

        C'est la même syntaxe a priori. Sauf que : si 'sommeTableau' est une fonction, elle admet un ou plusieurs arguments, et il faut donner leur type, car la fonction va les recopier, et a donc besoin de connaître cette information pour réserver de la mémoire. (Même s'il n'y a pas d'argument, officiellement il y en a un : "void".) Si par exemple on déclare une fonction qui fait la différence de deux entiers, les deux arguments seront de type 'int' et 'int', donc on écrira :

        int amplitudeThermique(int, int) ;
        

        Cette fois le compilateur a toutes les informations dont il dispose. En fait, on donne souvent un nom fictif aux arguments, ça aide à la lisibilité de la déclaration (le compilateur n'en a pas besoin, c'est une information pour le programmeur, un peu comme un commentaire) :

        int amplitudeThermique(int temperatureMini, int temperatureMaxi) ;

        Cette fois le programmeur sait que le premier argument est la température mini, pas maxi (on aurait pu le savoir en lisant le code de la fonction, mais c'est plus long). Cette fonction va probablement calculer « temperatureMaxi - temperature Mini » et retourner le résultat via l'instruction "return".

        Voilà, je laisse à mes successeurs le soin de répondre à la suite, en espérant avoir pu t'aider.

        -
        Edité par robun 20 septembre 2017 à 14:47:32

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2017 à 14:50:16

          Peut-être as-tu été un peu trop vite sur les chapitres précédents.

          Apparemment tu n'as pas compris ce que sont les fonctions, il faut donc relire cette partie.

          • Partager sur Facebook
          • Partager sur Twitter

          Incompréhension totale

          × 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