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édentesRévision précédente
Prochaine révision
Révision précédente
langage:debut [13/01/2019 07:38] webmestrelangage:debut [18/09/2020 10:22] (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/|http://www.cplusplus.com/reference/]]
 +  * [[https://fr.cppreference.com/|https://fr.cppreference.com/]]
 +  * [[http://www.boost.org/users/index.html|http://www.boost.org/users/index.html]]
 +  * [[https://stackoverflow.com/questions/tagged/c%2b%2b|https://stackoverflow.com/questions/tagged/c%2b%2b]]
 +
 +</WRAP>
 +
  

Outils de la page