Partage
  • Partager sur Facebook
  • Partager sur Twitter

Découper son programme en fonction

    12 novembre 2018 à 22:30:06

    Bonjour à tous, je suis novice en programmation et j'essaie de me lancer sur la programmation en c++. Je suis bloqué sur le chapitre "découper son programme en fonctions". 

    Quand j'essaie de rentrer le programme ci-dessous, le compileur me dit : " error: no previous declaration for 'int ajouteDeux(int)' [-Werror=missing-declarations]|" 

    Mais je ne comprends pas l'erreur car c'est le cours qui demande de mettre ce programme et de le lancer. Pouvez me dire où est mon erreur svp ? Merci d'avance  Nico :)

    #include <iostream>
    using namespace std;
    int ajouteDeux(int nombreRecu)
    {
        int valeur(nombreRecu + 2);
        return valeur;
    }
    int main()
    {
        int a(2),b(2);
        cout << "Valeur de a : " << a << endl;
        cout << "Valeur de b : " << b << endl;
        b = ajouteDeux(b); //Appel de la fonction
        cout << "Valeur de a : " << a << endl;
        cout << "Valeur de b : " << b << endl;
        return 0;
    }
    • Partager sur Facebook
    • Partager sur Twitter
      13 novembre 2018 à 6:20:22

      Bonjour,

      J'ai l'impression que ton compilateur est configuré de manière très très restrictive : à la fois signaler tous les warnings et tout warning empêche la compilation.
      Solution possibles :
       - définir la fonction comme static, les fonctions static sont privées et ne nécessitent pas systématiquement de déclaration préliminaire.
       - pré-déclarer la fonction avant sa définition.
       - prendre un niveau de warnings de compilation moins fort car ne pas déclarer une fonction publique n'est pas si grave. Et se trouve d'ailleurs dans des millions de codes.
       - demander à ce que les warnings ne soit pas des erreurs. Solution de loin la moins bonne.

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        13 novembre 2018 à 11:19:27

        Dalfab a écrit:

        Solution possibles :
         - définir la fonction comme static, les fonctions static sont privées et ne nécessitent pas systématiquement de déclaration préliminaire.

        Non !!

        NicolasSiffrid a écrit:

        #include <iostream>
        using namespace std;
        
        int ajouteDeux(int nombreRecu)
        {
            int valeur(nombreRecu + 2);
            return valeur;
        }
        Certes, ton compilateur est configuré de façon très restrictive, pourtant le message est clair:
        Ta fonction n'est pas déclarée, tu n'as fais que la définir.
        Ajouter la déclaration résoudra le problème:
        #include <iostream>
        
        int ajouteDeux(int);    // Déclaration
        
        int ajouteDeux(int nombreRecu)    // Définition
        {
            int valeur(nombreRecu + 2);
            return valeur;
        }
        Au passage, l'utilisation de "using namespace std;" est considéré comme une mauvaise pratique.Qualifie plainement tes appels aux fonctionalités de la librairie standard, ca évitera les conflits potentiels.

        -
        Edité par Deedolith 13 novembre 2018 à 11:30:23

        • Partager sur Facebook
        • Partager sur Twitter
          13 novembre 2018 à 16:48:38

          > ne pas déclarer une fonction publique n'est pas si grave. Et se trouve d'ailleurs dans des millions de codes.

          En fait si. On peut facilement se retrouver avec 2 fonctions différentes dans 2 sources cpp différences. Il y a aura des erreurs au moment de l'édition de lien alors que les fonctions sont des détails d'implémentations. Et dans le .h, bah, on ne sait pas à quoi elle sert.

          Ajouter une déclaration ne fait que masquer le problème, mais celui-ci est toujours présent. Du coup, c'est mieux de mettre les détails du .cpp dans un namespace anonyme (plus générique que static).

          Après, perso, je désactive cet avertissement (-Wno-missing-declarations) pour des tests ou des programmes d'un seul fichier.

          @NicolasSiffrid C'est bien d'avoir un niveau d'avertissement élevé, mais tu peux désactiver -Werror s'il te gêne (il transforme tous les avertissements en erreur). Ce n'est bien sûr pas une raison pour les ignorer.

          • Partager sur Facebook
          • Partager sur Twitter
            13 novembre 2018 à 17:14:55

            Merci pour vos réponses et vos conseils. Oui effectivement j'ai dû installer un autre Compilateur / Debuggeur et il est configuré en très restrictif. 

            Je vais essayer la solution ce soir. Si ca marche je vais rager un peu car j'avais voulu la déclarer mais de mémoire j'avais mis :

            int ajouteDeux(); 

            • Partager sur Facebook
            • Partager sur Twitter

            Découper son programme en fonction

            × 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