wesh scanf !

This commit is contained in:
tTh 2024-07-11 02:23:30 +02:00
parent 326926aa16
commit f7b5af5a9b
1 changed files with 74 additions and 7 deletions

View File

@ -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 <stdio.h>
...
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