Programmation ++ Utilisation de QtCreator pour la gestion de projet TD 0

R. Pacanowski September 28, 2015

1 Motivation

Ecrire dans un fichier hello_word.cpp, un programme qui affiche «Hello World !»dans la console. Pour ouvrir, une console cherchez l’utilitaire nommé "Terminal" ou "Konsole". Pour écrire le programme utiliser un éditeur de texte simple tel que , ou encore Sublime (s’il est disponible). N’oubliez pas d’inclure (#include <...>) les en-têtes cstdlib et iostream, qui font partie de la bibliothèque standard du C++.

1.1 Compilation Dans un premier temps, nous ferons la compilation à la main. Nous utiliserons le compilateur GNU pour cela, qui fait partie de la GNU compiler collec- tion (gcc). Bien que le programme gcc permette de compiler des fichiers C++, il n’inclut pas automatiquement la bibliothèque standard du C++. Pour cela, il faut utiliser le programme g++ La commande pour compiler notre hello world est donc g++ -Wall -Werror -Wold-style-cast hello_world.cpp -o hello_world où hello_world.cpp est le fichier à compiler et hello_world est le nom du programme à générer. L’option -Wall active tous les warnings et l’option Werror transforme les warnings en erreurs, ce qui a pour effet d’interrompre la compilation en cas de warnings Exécutez hello_world pour tester : ./hello_world Cet exercice est terminé lorsque votre code compile sans aucun warning et que son execution est correcte. Tous les warnings peuvent être éliminés par de simples modifications du code. Il est important de le faire, car si on laisse traîner des warnings inoffensifs, on finit par ne plus voir les warnings pertinents, ce qui les rends totalement inutile !

2 QtCreator

En pratique utiliser la ligne de commande pour compiler les gros projets devient rapidement ingérable à cause du nombre élevé de fichiers. Dès lors, on a recours à des systèmes (e.g., CMake, Make, Scons, ) de compilation. De plus, pour augmenter la productivité des éditeurs qui intégrent la compilation, le debugging et la réalisation d’interface graphiques sont disponibles. Dans le cadre de ces TDs ainsi que pour votre module de projet en C++, nous avons choisi d’utliser QtCreator.

1 QtCreator un outil de développement qui intégre de nombreuses fonctionnalités et permet de choisir, le système de gestion de compilation ainsi que le compilateur qui sera utilisé conjointement. De plus, il est gratuit et est disponible sur les principales plateformes (Windows, MacOS X, Linux). La Figure 1 vous présente l’interface graphique de QtCreator lorsque vous le lancer.

Figure 1 – QtCreator à l’ouverture

• 1 - Onglets principaux du programme. Edit pour taper le code, Debug pour le débugguer, Projects pour changer les options de compilation et d’exécution et enfin Analyse pour lancer la détection de fuites mémoires. • 2 - Permet de choisir entre la compilation en mode release ou debug. • 3 - Permet d’éxécuter le code en release (Ctrl+R).

• 4 - Permet d’éxécuter le code en debug (F5). • 5 - Permet de seulement compiler le code (Ctrl+B). • 6 - Barre de recherche de fichiers ou d’expressions régulières.

• 7 - Séléction des sorties : – 1 - Issues : Affiche et permet de sélectionner rapidement les erreurs et les aver- tissements de la dernière compilation. – 2 - Search Results : Affiche le résultat de la barre de recherche. – 3 - Application Output : Affiche tous std::cout/std::cerr du programme. – 4 - Compile Output : Affiche la sortie du programme de compilation.

3 Projets

Dans QtCreator il est possible de gérer facilement de gros projets. Pour cela, il y a deux solutions QMake et Cmake.

2 3.1 Projet QMake Gestionnaire natif de Qt, il est complètement integré à QtCreator. Pour créer un projet QMake : "File", "New", "Qt gui Application" .

A la fin de la configuration, toutes les informations relatives aux fichiers sources, aux librairies et aux options de compilation sont présentes dans le fichier nom_du_projet.pro.

3.2 Projet CMake CMake est également un outil de gestion de projet. Il présente l’avantage de ne pas être dépendant de Qt et de fonctionner sur un grand nombre de systèmes d’exploitations.

QtCreator gère également très bien les projets CMake : "File" "New" "Non-Qt Project" "C++ Project (CMake Compilation)" .

A la fin de la configuration, toutes les informations relatives au projet sont stockées dans le fichier CMakeLists.txt.

4 Conventions de codage

Afin de produire du code propre et lisible, il est nécessaire de fixer un certain nombre de règles de style. Ces règles forment un standard de codage qui facilite la lecture, l’écriture et le partage du code, tout particulièrement lorsque plusieurs personnes travaillent sur un même projet. Les conventions de codage que vous devez suivre sont disponibles à l’URL suivante : manao.inria. fr/perso/~pac/teaching/cpp/conventions-codage.pdf

Exercice 4.1 Projet QtCreator avec CMake

1. Créer un projet QtCreator (nommez le Hello) de type Non-Qt Project avec CMake. 2. Familiarisez vous avec les différents boutons (compilation et execution du programme)

3. Modifiez votre code afin que la fonction main renvoie EXIT_SUCCESS plutôt que 0 4. Modifiez votre code afin que la fonction main puisse recevoir des arguments 5. Executez votre programme depuis la ligne de commande (terminal). Pour ce faire ouvrez un terminal et rendez vous dans le répertoire où l’executable est créé. Ce répertoire est indiqué dans les propriétés de votre projet QtCreator. 6. Modifiez votre programme afin qu’il affiche tous ses argument sur la sortie standard. 7. À quoi correspond l’argument 0 ? 8. Complétez le programme afin qu’il calcule et affiche la moyenne des nombres passés en paramètres au programmes. Pour commencer vous utiliserez la fonction std::atof afin de convertir une chaîne de caractère en nombre. 9. Si le programme est appelé sans argument ou si un argument est invalide, affichez un message d’erreur et retournez EXIT_FAILURE.

A présent pour chaque exercice pour créerez un projet QtCreator. Pour chaque exercice il y aura une fonction main qui illustre le fonctionnement de ce qui est demandé.

Exercice 4.2 Edition dynamique de lien A partir du résultat de votre exercice précédent

3 1. Sous Linux, à l’aide de la commande ldd -v donnez la liste des bibliothèques dynamiques (dynamic library qui sont liées à votre progamme 2. Modifiez votre programme précéent afin que la moyenne soit calculée par une fonction qui prendra les arguments adéquats représentant un tableau de flottants.

3. Modifiez votre programme afin que la fonction qui calcule la moyenne soit programmée dans deux fichiers séparés (un fichier en-tête calcul.hpp et un fichier d’implémentation calcul.cpp)

Exercice 4.3 Autour des tableaux ATTENTION de bien spécifier les bons types pour les arguments des fonctions et procédures lorsque ceux-ci ne vous sont pas donnés.

1. Déclarez un tableau de 1000 000 de floats sur la pile dans votre fonction main. Utilisez la syntaxe float tab[1000000];. 2. Si ce n’est pas déja fait créer les fichiers calcul.hpp et calcul.cpp

3. Ecrivez une procédure (void initRandom(...)) qui assigne une valeur aléatoire comprise entre 0 et 1 à chaque élément de ce tableau en utilisant la fonction std::rand(). 4. Ecrivez une procédure void display(...) |qui affiche les N premiers éléments de votre tableau. N sera passé en argument ainsi que le «tableau».

5. Testez votre fonction display() en l’utilisant dans la fonction main. 6. Modifiez votre programme principal afin qu’il utilise la fonction std::srand(...). Vous passerez à cette dernière une valeur de votre choix. A quoi sert cette fonction d’après la documentation ?

7. Ajoutez aux fichiers calcul.hpp et calcul.cpp une fonction qui retourne la variance des valeurs contenues dans le tableau.

8. Ajoutez aux fichiers calcul.hpp et calcul.cpp une fonction qui retourne le maximum des valeurs contenues dans le tableau.

9. Ajoutez aux fichiers calcul.hpp et calcul.cpp une fonction qui retourne le minimum des valeurs contenues dans le tableau.

10. Ajoutez aux fichiers calcul.hpp et calcul.cpp une fonction qui retourne la somme des valeurs contenues dans le tableau. 11. Ré-écrivez votre fonction qui renvoie la moyenne afin qu’elle utilise la fonction qui calcule la somme. 12. Ré-écrivez votre fonction qui renvoie la variance afin qu’elle utilise celle qui calcule la moyenne. 13. Ecrivez une fonction qui renvoie l’écart-type des valeurs contenues dans votre tableau. Quelle fonction doit-elle ré-utiliser ?

14. Ecrivez dans un fichier test_calcul.hpp et test_calcul.cpp une fonction de test pour chacune des fonctions écrites aux questions précédentes. 15. Essayez de trouver la taille de tableau à partir de laquelle votre programme ne fonctionnera plus. Dans votre compte-rendu intermédiaire vous essaierez de donner une justification à cette valeur obtenue.

4 4.1 Travail à la maison avec QtCreator Quelque soit la plateforme (Windows, MacOS, Unix) la solution la plus simple afin d’installer Qt et QtCreator est d’aller sur la page d’installation Qt : http://qt-project.org/downloads et de cliquer sur "Download Here". Télécharger la version "Community"de Qt qui est gratuite.

4.2 Travail à la maison sans QtCreator Sous Ubuntu/: Pour installer Qmake : Installation sous ubuntu/debian : sudo apt−get install qt5−qmake Compilation et Exécution : mkdir b u il d cd bu i ld qmake [Emplacement du fichier .pro] make ./[Nom du fichier executable] Pour installer CMake: sudo apt−get install cmake Compilation et Exécution : mkdir b u il d cd bu i ld cmake [Emplacement du fichier CMakeLists.txt] make ./[Nom du fichier executable]

5 Autres outils

Cette section vous présente d’autres outils liés à la progammation en C++, il n’est pas nécessaire d’y jetter un oeil en séance mais ils vous seront FORTEMENT utiles pour votre projet.

5.1 Documentation du code Nous utilisons un programme appelé Doxygen pour générer la documentation de notre code. Celui- ci a besoin d’un fichier de configuration (Doxyfile) permettant de paramétrer de nombreuses options. Nous fournissons un Doxyfile, déjà configuré pour produire des fichiers html, dans le répertoire doc. Générez la documentation en allant dans le répertoire doc puis en tapant la commande doxygen Ouvrez ensuite le fichier doc/html/index.html, puis allez voir la documentation du ficher hello_world.cpp. Pour générer la documentation, Doxygen utilise des commentaires spéciaux. Il en existe plusieurs type, mais les plus commun sont ceux de la forme /** ... */ (style javadoc) ou /*! ... */ (style Qt). Sauf instruction contraire, ces commentaires sont associé à la prochaine définition dans le code. Ainsi, le bloc de commentaire avant la fonction main est automatiquement associé à la fonction main. En revanche, le bloc au début du fichier contient la commande spéciale \file qui indique que le commentaire est associé au fichier courant. Cela est obligatoire pour les fichier car il n’est pas possible de placer un commentaire avant un fichier. Attention : il est

5 nécessaire de documenter les fichiers, sans quoi les définitions qu’ils contiennent risquent de ne pas apparaître dans la documentation ! À l’intérieur des blocs de commentaires, de nombreuses commandes sont disponibles. La commande \brief est un résumé succinct qui apparaît lorsque les déclarations sont listées; elle devrait être toujours présente. Les commandes \param permettent de documenter les différents paramètres et la commande \return documente la valeur de retour. Les (nombreuses) autres commandes sont décrites dans la documentation de Doxygen : http://www.stack.nl/~dimitri/doxygen/manual.html Dans les TPs, il est demandé de documenter systématiquement les fichiers, les fonctions, les classes ainsi que les membres des classes (attributs et méthodes). En somme la documentation de votre code génère votre compte-rendu et elle n’est donc en aucun cas optionnelle.

5.2 Analyse statique du code Un certain nombre d’erreurs de programmation courantes peuvent être détectées automatiquement en analysant le code. GCC émet déjà un certains nombre de warnings lorsqu’il détecte des constructions qui lui semblent douteuses, cependant cette analyse est relativement limitée. Nous vous proposons d’utiliser cppcheck. Ce n’est en rien obligatoire mais cela constitue une bonne habitude qui pourra vous être très utile pour les projets. Vous pouvez tester votre code en tapant simplement cppcheck --enable=style .

L’option --enable=style définie quels tests sont effectués. Vous pouvez utiliser --enable=all pour activer tous les tests. Pensez à utiliser cette commande régulièrement pour vérifier que votre code ne contient pas d’erreurs. Attention cependant, les messages de cppcheck ne sont pas toujours des erreurs, mais parfois juste des conseils.

6