Exercice - Correction du code erroné

Effectué

Il est utile de pratiquer l’identification d’erreurs, puis la correction du code. Que se passe-t-il lorsque vous orthographiez mal un nom de fonction ou que vous tapez un symbole incorrect ?

Créer le code

Avant d’identifier les erreurs, créez le code et examinez-le :

  1. Dans le terminal, exécutez code . pour ouvrir un éditeur.

  2. Dans l’éditeur, entrez ou collez le code suivant :

    #include (iostream);
    using namespace std;
    int main()
    {
      cout >> 'Hello World'
    }
    
  3. Enregistrez le fichier de code en tant que hello.cpp, puis fermez l’éditeur.

Notes

Pour vérifier si le fichier a été créé avec succès, dans le terminal, entrez la commande ls pour une liste de fichiers.

Identifier les erreurs

Le code que vous avez exécuté contient des erreurs. Certains messages d’erreur s’affichent quand vous compilez le code. Chaque erreur est expliquée et résolue par la suite.

  1. Exécutez g++ et le nom de fichier pour générer votre programme :

    g++ hello.cpp
    

    Examinez les erreurs et voyez le nombre d’erreurs que vous pouvez identifier.

    hello.cpp:1:10: error: #include expects "FILENAME" or <FILENAME>
    #include (iostream);
              ^
    hello.cpp:5:13: warning: character constant too long for its type
        cout >> 'Hello World'
                ^~~~~~~~~~~~~
    hello.cpp: In function ‘int main()’:
    hello.cpp:5:5: error: ‘cout’ was not declared in this scope
        cout >> 'Hello World'
        ^~~~
    hello.cpp:5:5: note: ‘std::cout’ is defined in header ‘<iostream>’; did you forget to ‘#include <iostream>’?
    hello.cpp:1:1:
    +#include <iostream>
    #include (iostream);
    hello.cpp:5:5:
        cout >> 'Hello World'
        ^~~~
    

    Notes

    La sortie répertorie de nombreuses erreurs. Parfois, la résolution d’une seule erreur peut résoudre d’autres erreurs. Dans d’autres cas, vous devrez peut-être résoudre toutes les erreurs listées dans la sortie. Dans la plupart des scénarios, les erreurs sont explicitement détaillées et faciles à comprendre.

Résoudre les erreurs

Vous avez compilé le code, ce qui a entraîné de nombreuses erreurs. Mais ne vous inquiétez pas. Vous pouvez résoudre chaque erreur et aboutir à un code qui fonctionne.

Première erreur : parenthèses utilisées à la place de crochets pointus

  1. Examinez le code pour identifier la première erreur :

    hello.cpp:1:10: error: #include expects "FILENAME" or <FILENAME>
      #include (iostream)
               ^
    

    Ici, <iostream> est attendu à la place de (iostream). Nous allons exécuter le code suivant et le recompiler.

  2. Exécutez code hello.cpp pour modifier le code à nouveau :

    code hello.cpp
    
  3. Modifiez la première ligne pour résoudre la première erreur. Remplacez les parenthèses autour de iostream par des crochets pointus :

    #include <iostream>;              //(iostream) is incorrect. <iostream> is correct.
    using namespace std;
    int main()
    {
      cout >> 'Hello World'
    }
    

Deuxième erreur : point-virgule en trop

  1. Exécutez g++ hello.cpp pour créer votre programme :

    g++ hello.cpp
    

    Vous voyez la sortie ci-dessous, qui comporte déjà moins d’erreurs grâce à votre première correction :

    PS /home/<user>> g++ hello.cpp
    hello.cpp:1:20: warning: extra tokens at end of #include directive
    #include <iostream>;
                         ^
    hello.cpp:5:13: warning: character constant too long for its type
         cout >> 'Hello World'
                 ^~~~~~~~~~~~~
    hello.cpp: In function ‘int main()’:
    hello.cpp:5:10: error: no match for ‘operator>>’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘int’)
         cout >> 'Hello World'
         ~~~~~^~~~~~~~~~~~~~~~
     ...
     ...
     ...
     ...
     ...
    

    Notes

    En dépit du nombre d’erreurs retournées, résolvez une erreur à la fois, en commençant par le haut.

    Nous allons nous concentrer sur l’erreur qui se produit en premier dans notre dernière exécution.

    hello.cpp:1:20: warning: extra tokens at end of #include directive
    #include <iostream>;
                        ^
    

    Un point-virgule (;) a été ajouté à la fin du nom de fichier/de la bibliothèque iostream. Vous ne pouvez pas ajouter un point-virgule après une directive #include. Utilisez un point-virgule seulement à la fin d’une instruction.

  2. Supprimez le point-virgule après #include <iostream> et observez ce qui se passe.

    Pour modifier à nouveau le code, exécutez code hello.cpp :

    code hello.cpp
    

    Ensuite, modifiez le code pour effectuer la correction, puis enregistrez-le.

    #include <iostream>              // Removed the semicolon.
    using namespace std;
    int main()
    {
      cout >> 'Hello World'
    }
    

Troisième erreur : type de guillemet incorrect pour un littéral de chaîne

  1. Exécutez g++ hello.cpp pour générer votre programme.

    Vous devez normalement voir la sortie suivante en provenance de la compilation :

    PS /home/<user>> g++ hello.cpp
    hello.cpp:5:13: warning: character constant too long for its type
        cout >> 'Hello World'
                ^~~~~~~~~~~~~
    hello.cpp: In function ‘int main()’:
    hello.cpp:5:10: error: no match for ‘operator>>’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘int’)
        cout >> 'Hello World'
           ~~~~~^~~~~~~~~~~~~~~~
    ...
    ...
    ...
    ...
    ...
    

    Examinez la première erreur dans la sortie :

    hello.cpp:5:13: warning: character constant too long for its type
        cout >> 'Hello World'
                ^~~~~~~~~~~~~
    

    Le code utilise des guillemets simples au lieu de guillemets doubles. Utilisez des guillemets simples uniquement pour un caractère individuel. Pour un littéral de chaîne (tableau de caractères), utilisez des guillemets doubles.

  2. Remplacez les guillemets simples par des guillemets doubles. Vérifiez que votre programme ressemble à ce code :

    #include <iostream>
    using namespace std;
    int main()
    {
      cout >> "Hello World"     //Use double quotes instead of single quotes.
    }
    

Quatrième erreur : opérateur de flux incorrect

  1. Exécutez g++ hello.cpp pour générer votre programme.

    Voici à quoi ressemble la sortie. La sortie présente moins d’erreurs au fur et à mesure de leur résolution. Résolvez maintenant les problèmes restants.

    PS /home/<user>> g++ hello.cpp
    hello.cpp: In function ‘int main()’:
    hello.cpp:5:10: error: no match for ‘operator>>’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const char [12]’)
        cout >> "Hello World"
        ~~~~~^~~~~~~~~~~~~~~~
    In file included from /usr/include/c++/8/string:53,
                    from /usr/include/c++/8/bits/locale_classes.h:40,
                    from /usr/include/c++/8/bits/ios_base.h:41,
                    from /usr/include/c++/8/ios:42,
                    from /usr/include/c++/8/ostream:38,
                    from /usr/include/c++/8/iostream:39,
                    from hello.cpp:1:
    ...
    ...
    ...
    ...
    ...
    
  2. Dans la sortie précédente, vous pouvez voir un problème d’opérateur. Remplacez l’opérateur >> par l’opérateur <<.

    #include <iostream>
    using namespace std;
    int main()
    {
      cout << "Hello World"     //Replacing the >> operator with the << operator.
    }
    

    Notes

    Utilisez << pour l’objet cout.

    Utilisez >> pour l’objet cin. L’objet cin est abordé plus en détail dans un autre module.

Cinquième erreur : point-virgule manquant

  1. Exécutez g++ hello.cpp pour créer votre programme :

    g++ hello.cpp
    

    Voici la sortie. Vous avez presque terminé. Il reste juste quelques erreurs à corriger.

    PS /home/<user>> g++ hello.cpp
    hello.cpp: In function ‘int main()’:
    hello.cpp:5:34: error: expected ‘;’ before ‘}’ token
        cout << "Hello World"
                             ^
                             ;
    }
    ~
    

    Un point-virgule est requis à la fin de l’instruction.

  2. Modifiez votre code afin qu’il ressemble à ce code :

    #include <iostream>
     using namespace std;
     int main()
     {
       cout << "Hello World";     //Added a missing semicolon
     }
    

Avons-nous terminé ?

  1. Exécutez g++ hello.cpp pour créer votre programme :

     g++ hello.cpp
    

    Si vous tapez ls dans votre terminal, vous devriez maintenant voir a.out parmi vos fichiers. a.out est le fichier que le compilateur g++ a créé pour vous.

  2. Dans le terminal, exécutez le fichier a.out :

     ./a.out
    

    Enfin, vous obtenez la sortie que vous souhaitez voir :

      PS /home/<user>> ./a.out
      Hello World
    

    Votre code ne contient plus d’erreurs. Vous avez débogué le code pas à pas et résolu tous les problèmes.

Notes

Le code n’inclut pas return 0 à la fin, mais aucune erreur n’a été levée. Cela est dû au fait que le runtime utilise un type de retour implicite comme entier pour main. Le type de retour est principalement utilisé comme état de sortie. Ici, renvoyer 0 ou ne rien renvoyer amène automatiquement le runtime à considérer que le code s’est terminé correctement.

Vérifiez vos connaissances

1.

Quel est le problème avec cette ligne de code ? cout << "Hello World" << endl