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:// | ||
+ | |||
+ | </ | ||
+ | |||