wesh scanf !
This commit is contained in:
parent
326926aa16
commit
f7b5af5a9b
81
chap/C.tex
81
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 <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
|
||||
|
Loading…
Reference in New Issue
Block a user