diff --git a/chap/C.tex b/chap/C.tex index ec61a30..f84fb58 100644 --- a/chap/C.tex +++ b/chap/C.tex @@ -103,7 +103,7 @@ Il est temps de préciser les détails. Une fonction a un unique point d'entrée\footnote{Qui a déja joué avec le ENTRY du Fortran ?}, avec une éventuelle liste de paramètres, -et une tout aussi éventuelel unique valeur de retour. +et une tout aussi éventuelle unique valeur de retour. XXX\index{XXX} @@ -114,8 +114,11 @@ XXX\index{XXX} Il est évident qu'un logiciel qui n'a aucun moyen de communiquer avec le monde extérieur a bien moins d'utilité qu'un bon ed. -Dans le schéma «~classique~», ces échanges ont lieu par -le truchement d'un terminal. +Dans le schéma «~classique~» d'une utilisation interactive, +ces échanges ont lieu par +le truchement d'un terminal, qui peut tout aussi bien +être une \textsl{real glasstty} ou une fenêtre d'un émulateur +graphique de terminal, comme \texttt{xterm}. \subsection{Les trois flux canoniques} @@ -268,6 +271,55 @@ Avez-vous bien révisé la section qui cause des pointeurs ? À ne plus savoir où peut être la tête de lecture ? Alors les subtilités de \texttt{scanf} vont vous plaire. +Nous allons commencer par un exemple simple~: la lecture +de deux nombres entiers depuis l'entrée standard. +Les valeurs lues seront stockée dans deux variables +de type \texttt{int}. + +\begin{verbatim} +#include +... +int foo, bar, nbread; +nbread = scanf("%d %d", &foo, &bar); +\end{verbatim} + +Le premier argument est une chaine de caractères contenant +des directives de conversion, semblables à celles +du printf. +Dans cette exemple, nous avons deux fois \texttt{"\%d"} +séparées par une espace. Cette directive veut dire +« lire les chiffres qui arrivent et les convertir +en nombre entier quand il n'y en a plus », une +simple règle de conversion. + +Les deux arguments suivants sont les adresses des deux variables +destinées à recevoir les valeurs lues, +ou, en langage commun « faut mettre ÇA LÀ ». +Ce sont donc des pointeurs, on les reconnait au +caractère \& qui précède leur nom. + +Quand à la valeur retournée par la fonction scanf, elle +présente un grand intérêt car elle contient le nombre +de lectures élémentaires qui se sont bien passées. +Tous les cas d'erreur ne sont pas couvert, mais c'est +suffisant pour traiter les cas simples de la discipline. + +Donc, en toute rigueur, le code que nous venons de voir +devrait s'écrire, en utilisant comme il se doit +le \textsl{yoda coding} pour le test de cette valeur +de retour~: + +\begin{verbatim} +... +int foo, bard; +if (2 != scanf("%d %d", &foo, &bar)) { + fputs("FAIL\n", stderr) + abort(); + } +... +\end{verbatim} + + \textit{To be continued...} % --------------------------------------------------------- @@ -362,12 +414,14 @@ page \pageref{pipeline}. \textbf{Ah, enfin, on a failli attendre !} -Qu'est-ce qu'un pointeur ? La réponse est multiple, et c'est +Qu'est-ce qu'un pointeur ? +La réponse est multiple et parfois obscure, et c'est le pointeur qui fait à la fois la force et la faiblesse du C. Pour faire simple, un pointeur est une variable qui contient l'adresse dans la mémoire d'une autre variable. -Mais en fait c'est un peu plus subtil : un pointeur « connait » la taille +Mais en fait c'est un peu plus subtil : +un pointeur « connait » le type (donc la taille) de l'objet pointé, et peut donc « parcourir » un tableau de ces objets. \begin{verbatim} @@ -377,14 +431,24 @@ ptr = tableau; // *ptr désigne tableau[0]; ptr++; // *ptr désigne tableau[1]; \end{verbatim} -XXX il y a beaucoup à dire, et de quoi bien rire \textsl{:)} +\index{XXX} +XXX il y a encore beaucoup à dire, et de quoi bien rire \textsl{:)} % https://hackthedeveloper.com/function-pointer-in-c/ +\subsection{Pointeurs et chaines} + +\subsection{Pointeurs et fonctions} + +Exemple classique : qsort. + % ========================================================= \section{Le préprocesseur}\index{cpp} +\textbf{Attention !} L'utilisation abusive du préprocesseur +peut générer des trolls de plusieurs centaines de posts. + Nous avons déja abordé de loin la directive \texttt{\#include}, qui fait partie du préprocesseur, comme toutes les lignes de code commençant par le caractère \textbf{\#}. @@ -411,7 +475,10 @@ pour être traduite en codes opératoires, dont l'exécution affichera une maxime dont la véracité demande à être vérifiée par l'expérimentation. Mais ça n'est pas fini. -Ce sympathique \textsf{préproc'} nous permet aussi de faire +Ce sympathique \textsf{préproc'}% +\footnote{Certains l'appellent même tendrement « mon cépépé » +avec un regard de guimauve mal grillée.} +nous permet aussi de faire de la compilation conditinnelle, et ça, c'est cool parce que ça ouvre la porte à plein de choses. Par exemple, l'instrumentation du code afin de faciliter