wesh scanf !

This commit is contained in:
tTh 2024-07-11 02:23:30 +02:00
parent 326926aa16
commit f7b5af5a9b

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é Une fonction a un unique point d'entrée\footnote{Qui a déja joué
avec le ENTRY du Fortran ?}, avec une éventuelle liste avec le ENTRY du Fortran ?}, avec une éventuelle liste
de paramètres, de paramètres,
et une tout aussi éventuelel unique valeur de retour. et une tout aussi éventuelle unique valeur de retour.
XXX\index{XXX} XXX\index{XXX}
@ -114,8 +114,11 @@ XXX\index{XXX}
Il est évident qu'un logiciel qui n'a aucun moyen de communiquer 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. avec le monde extérieur a bien moins d'utilité qu'un bon ed.
Dans le schéma «~classique~», ces échanges ont lieu par Dans le schéma «~classique~» d'une utilisation interactive,
le truchement d'un terminal. 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} \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 ? À ne plus savoir où peut être la tête de lecture ?
Alors les subtilités de \texttt{scanf} vont vous plaire. 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...} \textit{To be continued...}
% --------------------------------------------------------- % ---------------------------------------------------------
@ -362,12 +414,14 @@ page \pageref{pipeline}.
\textbf{Ah, enfin, on a failli attendre !} \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. le pointeur qui fait à la fois la force et la faiblesse du C.
Pour faire simple, un pointeur est une variable qui contient Pour faire simple, un pointeur est une variable qui contient
l'adresse dans la mémoire d'une autre variable. 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. de l'objet pointé, et peut donc « parcourir » un tableau de ces objets.
\begin{verbatim} \begin{verbatim}
@ -377,14 +431,24 @@ ptr = tableau; // *ptr désigne tableau[0];
ptr++; // *ptr désigne tableau[1]; ptr++; // *ptr désigne tableau[1];
\end{verbatim} \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/ % https://hackthedeveloper.com/function-pointer-in-c/
\subsection{Pointeurs et chaines}
\subsection{Pointeurs et fonctions}
Exemple classique : qsort.
% ========================================================= % =========================================================
\section{Le préprocesseur}\index{cpp} \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}, Nous avons déja abordé de loin la directive \texttt{\#include},
qui fait partie du préprocesseur, comme toutes les lignes qui fait partie du préprocesseur, comme toutes les lignes
de code commençant par le caractère \textbf{\#}. 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 affichera une maxime dont la véracité demande à être vérifiée
par l'expérimentation. Mais ça n'est pas fini. 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 de la compilation conditinnelle, et ça, c'est cool parce que
ça ouvre la porte à plein de choses. ça ouvre la porte à plein de choses.
Par exemple, l'instrumentation du code afin de faciliter Par exemple, l'instrumentation du code afin de faciliter