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é
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user