langage:debut
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| langage:debut [13/01/2019 07:38] – webmestre | langage: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!" | ||
| + | <code c> | ||
| + | #include < | ||
| + | |||
| + | int | ||
| + | main (int argc, char **argv, char **envp) { | ||
| + | |||
| + | std::cout << "hello word!" << std::endl; | ||
| + | |||
| + | // using namespace std; | ||
| + | // cout <<" | ||
| + | |||
| + | return 0; | ||
| + | // return 1; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | Créez dans le même répertoire un fichier " | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | cd `dirname $0` | ||
| + | g++ hello.cpp -o hello.out | ||
| + | |||
| + | if ./hello.out | ||
| + | then | ||
| + | echo "pas de code d' | ||
| + | else | ||
| + | echo "code d' | ||
| + | fi | ||
| + | |||
| + | </ | ||
| + | |||
| + | Pensez à rendre exécutable le programme par : | ||
| + | |||
| + | <code bash> | ||
| + | chmod a+x compile.sh | ||
| + | |||
| + | </ | ||
| + | |||
| + | Puis à lancer la compilation : | ||
| + | |||
| + | <code bash> | ||
| + | ./ | ||
| + | |||
| + | </ | ||
| + | |||
| + | Les commentaires ont deux formes : | ||
| + | |||
| + | <code c> | ||
| + | /* par bloc pour la mise au point par exemple */ | ||
| + | |||
| + | // ou en fin de ligne | ||
| + | |||
| + | </ | ||
| + | |||
| + | 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++. </ | ||
| + | |||
| + | ===== Arguments ===== | ||
| + | |||
| + | Mais à quoi servent les arguments de cette fonction ? | ||
| + | |||
| + | Pour le savoir faisons un affichage des paramètres. Voici le programme " | ||
| + | <code C> | ||
| + | #include < | ||
| + | |||
| + | 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 == ' | ||
| + | cout << *envp << endl; | ||
| + | |||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | Compilez avec | ||
| + | |||
| + | <code bash> | ||
| + | g++ args.cpp | ||
| + | |||
| + | </ | ||
| + | |||
| + | Si vous n' | ||
| + | |||
| + | Exécutez avec | ||
| + | |||
| + | <code bash> | ||
| + | ./a.out A B C D | ||
| + | |||
| + | </ | ||
| + | |||
| + | 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, | ||
| + | <code bash> | ||
| + | gdb --args ./a.out A B C D | ||
| + | |||
| + | </ | ||
| + | |||
| + | Voici quelques commandes : | ||
| + | |||
| + | * Vous pouvez placer un point d' | ||
| + | * 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** | ||
| + | * 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' | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== Exemple de lambda ===== | ||
| + | |||
| + | Voici un exemple de fonction lambda. Notez l' | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | using namespace boost:: | ||
| + | using namespace std; | ||
| + | |||
| + | template < | ||
| + | void mesure (const int &max, const Funct & | ||
| + | |||
| + | auto start = high_resolution_clock:: | ||
| + | |||
| + | for (int i = 0; i < max; ++i) | ||
| + | lambda (i); | ||
| + | |||
| + | duration< | ||
| + | auto h = duration_cast< | ||
| + | ns -= h; | ||
| + | auto m = duration_cast< | ||
| + | ns -= m; | ||
| + | cout.fill (' | ||
| + | cout << "last: " | ||
| + | << | ||
| + | << | ||
| + | << | ||
| + | } | ||
| + | |||
| + | int | ||
| + | main (int argc, char **argv, char **envp) { | ||
| + | int sum; | ||
| + | mesure (10, [&sum] (int x) { | ||
| + | sum += x; | ||
| + | }); | ||
| + | cout << "sum: " << sum << endl; | ||
| + | } | ||
| + | |||
| + | </ | ||
| + | |||
| + | Pour compiler, il faut ajouter la bibliothèque des fonctions boost. | ||
| + | |||
| + | <code bash> | ||
| + | g++ -g -lboost_chrono -lboost_system lambda.cpp | ||
| + | |||
| + | </ | ||
| + | |||
| + | 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:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | |||
| + | </ | ||
| + | |||
