Outils pour utilisateurs

Outils du site


langage:debut

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
langage:debut [13/01/2019 08:29]
webmestre [Mise au point]
langage:debut [13/01/2019 08:38] (Version actuelle)
webmestre
Ligne 1: Ligne 1:
 +====== Découverte de C++ ======
 +
 +Voici quelques exemples pour que vous puissiez faire vos premiers pas en C++.
 +
 +===== Hello World! =====
 +
 +Commençons pas le classic "hello word!"​.
 +Copier/​coller le code ci-dessous dans le fichier "​**hello.cpp**"​
 +<code c++>
 +#include <​iostream>​
 +
 +int
 +main (int argc, char **argv, char **envp) {
 +
 +  std::cout << "hello word!" << std::endl;
 +
 +  // using namespace std;
 +  // cout << "hello word!" << endl;
 +
 +  return 0;
 +  // return 1;
 +}
 +</​code>​
 +
 +Créez dans le même répertoire un fichier "​**compile.sh**"​
 +<code bash>
 +#!/bin/bash
 +
 +cd `dirname $0`
 +g++ hello.cpp -o hello.out
 +
 +if ./hello.out
 +then
 +    echo "pas de code d'​erreur ($?)"
 +else
 +    echo "code d'​erreur = $?"
 +fi
 +</​code>​
 +
 +Pensez à rendre exécutable le programme par :
 +<code bash>
 +chmod a+x compile.sh
 +</​code>​
 +
 +Puis à lancer la compilation :
 +<code bash>
 +./​compile.sh
 +</​code>​
 +
 +Les commentaires ont deux formes :
 +<code c++>
 +  /* par bloc pour la mise au point par exemple */
 +
 +  // ou en fin de ligne
 +</​code>​
 +
 +Jouez avec les commentaires qui sont proposés.
 +
 +<WRAP center round info 60%>
 +Il ne peut y avoir qu'une fonction main dans un programme C++.
 +</​WRAP>​
 +
 +===== Arguments =====
 +
 +Mais à quoi servent les arguments de cette fonction ?
 +
 +Pour le savoir faisons un affichage des paramètres.
 +Voici le programme "​**args.cpp**"​
 +<code C++>
 +#include <​iostream>​
 +
 +using namespace std;
 +int
 +main (int argc, char **argv, char **envp) {
 +
 +  for (int i = 0; i < argc; ++i)
 +    cout << "argv [" << i << "]: " << argv [i] << endl;
 +
 +  cout << endl;
 +
 +  for (; *envp; ++envp)
 +    //if (**envp == '​H'​)
 +    cout << *envp << endl;
 +
 +  return 0;
 +}
 +</​code>​
 +
 +Compilez avec 
 +<code bash>
 +g++ args.cpp
 +</​code>​
 +Si vous n'​utilisez pas l'​option "​**-o**"​ votre programme se nommera par défault "​**a.out**"​.
 +
 +Exécutez avec 
 +<code bash>
 +./a.out A B C D
 +</​code>​
 +
 +De nouveau, jouez avec les commentaires.
 +
 +===== Mise au point =====
 +
 +Il existe un outil de mise au point des programmes écrits en C ou C++ : **gdb**.
 +
 +Il faut au préalable avoir compilé le vôtre avec l’option “**-g**”.
 +Au moment de l’exécution,​ faîtes précéder la commande shell de “gdb - -args”.
 +
 +<code bash>
 +gdb --args ./a.out A B C D
 +</​code>​
 +
 +Voici quelques commandes :
 +  * Vous pouvez placer un point d'​arrêt avec "​**break** args.cpp:​6"​
 +  * Attendre le prompt gdb et saisissez “**run**”.
 +  * La commande “**where**” permet de savoir où l’on se trouve dans la pile d’exécution.
 +  * La commande “**frame** n” permet de se placer dans la pile d’exécution.
 +  * Il est possible d’afficher des valeurs des variables avec la commande “**print**”.
 +
 +<WRAP center round tip 60%>
 +Toutes ces actions peuvent être réalisées sous emacs:
 +  * M-x shell : ouvre un terminal
 +  * M-x compile : lance une compilation avec un lien direct avec les erreurs
 +  * M-x gdb : lance la mise au point et l'​observation d'un programme
 +
 +</​WRAP>​
 +
 +===== Exemple de lambda =====
 +
 +Voici un exemple de fonction lambda.
 +Notez l'​utilisation de "​template"​ pour désigner le passage d'une lambda en paramètre.
 +
 +<code c++>
 +#include <​iostream>​
 +#include <​iomanip>​
 +#include <​boost/​chrono.hpp>​
 +
 +using namespace boost::​chrono;​
 +using namespace std;
 +
 +template <​typename Funct>
 +void mesure (const int &max, const Funct &​lambda) {
 +
 +  auto start = high_resolution_clock::​now ();
 +
 +  for (int i = 0; i < max; ++i)
 +    lambda (i);
 +
 +  duration<​double>​ ns ((high_resolution_clock::​now ()-start).count ());
 +  auto h = duration_cast<​hours>​ (ns);
 +  ns -= h;
 +  auto m = duration_cast<​minutes>​ (ns);
 +  ns -= m;
 +  cout.fill ('​0'​);​
 +  cout << "last: "
 +       <<​ setw (2) << h.count () << ":"​
 +       <<​ setw (2) << m.count () << ":"​
 +       <<​ setw (9) << fixed << setprecision (6) << ns.count () << endl;
 +}
 +
 +int
 +main (int argc, char **argv, char **envp) {
 +  int sum;
 +  mesure (10, [&sum] (int x) {
 +      sum += x;
 +    });
 +  cout << "sum: " << sum << endl;
 +}
 +</​code>​
 +
 +Pour compiler, il faut ajouter la bibliothèque des fonctions boost.
 +
 +<code bash>
 +g++ -g -lboost_chrono -lboost_system lambda.cpp
 +</​code>​
 +
 +Jouez avec les paramètres de la fonction lambda, son corps ou le contexte des variables extérieurs utilisables dans la lambda.
 +
 +<WRAP center round tip 60%>
 +De la documentation supplémentaire se trouve sur :
 +  * [[http://​www.cplusplus.com/​reference/​]]
 +  * [[https://​fr.cppreference.com/​]]
 +  * [[http://​www.boost.org/​users/​index.html]]
 +  * [[https://​stackoverflow.com/​questions/​tagged/​c%2b%2b]]
 +
 +</​WRAP>​
  
langage/debut.txt · Dernière modification: 13/01/2019 08:38 par webmestre

Outils de la page