From 52b7bbe6efe38c8305411169f137cf760eee6d68 Mon Sep 17 00:00:00 2001 From: tTh Date: Sun, 2 Apr 2023 23:32:29 +0200 Subject: [PATCH] #sundaycommit --- chap/Basic.tex | 64 +++++++++++++++++++++-- chap/C.tex | 104 +++++++++++++++++++++++--------------- chap/shell.tex | 16 +++--- code/fortran/Makefile | 4 +- code/fortran/README.md | 5 ++ code/fortran/dessiner.f90 | 45 +++++++++++++---- code/hello.c | 2 +- tetatricks.tex | 4 +- 8 files changed, 176 insertions(+), 68 deletions(-) create mode 100644 code/fortran/README.md diff --git a/chap/Basic.tex b/chap/Basic.tex index 4d8826e..3c08485 100644 --- a/chap/Basic.tex +++ b/chap/Basic.tex @@ -2,7 +2,11 @@ \chapter{Basic} \index{dosbox}\label{chap:Basic} -% ------------------------------------------- +% ==================================================================== + +% https://www.theregister.com/2023/03/28/nostalgic_for_basic/ + +% ==================================================================== \section{BASIC} \index{BASIC} C'est probablement un des premiers langages interactifs utilisable par le @@ -21,9 +25,16 @@ ensuite j'aurais une idée sur lesquels seront les plus funs Dartmouth Time Sharing System -% ------------------------------------------- +% ==================================================================== \section{Bywater} \index{bywater} +\begin{quote} +The Bywater BASIC Interpreter (bwBASIC) implements a large superset of the +ANSI\index{ANSI} Standard for Minimal BASIC (X3.60-1978) +and a significant subset of the ANSI Standard for +Full BASIC (X3.113-1987) in C. +\end{quote} + \begin{verbatim} Bywater BASIC Interpreter/Shell, version 2.10 --------------------------------------------- @@ -44,7 +55,7 @@ mais canonique~: Première conclusion : affaire à suivre. -% ------------------------------------------- +% ==================================================================== \section{Yabasic} \index{yabasic} Première innovation, les numéros de ligne ne sont plus obligatoires. @@ -55,7 +66,50 @@ Et on peut faire des images qui clignotent :) \lstinputlisting{code/Basic/yabasic-2.bas} -% ------------------------------------------- +C'est vraiment dommage que l'on ne puisse mettre de gif89a\index{gif89a} +dans un livre imprimé\dots + +% ==================================================================== + +\section{sdlBasic} \index{sdlBasic} + +http://www.sdlbasic.altervista.org/main/ + +% ==================================================================== + +\section{FreeBASIC} \index{FreeBASIC} + +https://www.freebasic.net/ + +\begin{quote} +When used in its "QB" language mode, FreeBASIC provides a high level +of support for programs written for QuickBASIC\index{QuickBASIC}. +Many programs written for QuickBASIC will compile and run in this mode +with no changes needed. +\end{quote} + +% ==================================================================== + +\section{BASIC-256} \index{BASIC-256} + +https://basic256.org/ + +\begin{quote} +BASIC-256 is an easy to use version of BASIC designed to teach anybody +(especially middle and high-school students) the basics of computer +programming. +It uses traditional control structures like gosub, for/next, and goto, +which helps kids easily see how program flow-control works. +It has a built-in graphics mode which lets them draw pictures +on screen in minutes, and a set of detailed, easy-to-follow tutorials +that introduce programming concepts through fun exercises. +\end{quote} + + +% ==================================================================== + +% ==================================================================== + \section{Et ailleurs ?} L'interpréteur \texttt{Qbasic} de Microsoft fonctionne très bien @@ -63,4 +117,4 @@ dans Dosbox~: à lire en page \pageref{Qbasic}. Son prédécesseur, \texttt{GWBASIC} marche très bien aussi. % ------------------------------------------- -% ------------------------------------------- +% ==================================================================== diff --git a/chap/C.tex b/chap/C.tex index c7f2324..60820e1 100644 --- a/chap/C.tex +++ b/chap/C.tex @@ -11,31 +11,36 @@ les erreurs classiques. La futilité des exemples est assumée. Les détails nécessaires seront présentés dans la suite. -% --------------------------------------------------------- +% ========================================================= \section{Hello World} Hop, on y va... -Le tout début d'un programme en C est l'appel par -le \textsl{runtime} d'une fonction -nommée \texttt{main} qui reçoit deux paramètres +Le tout début de la vie d'un programme écrit en C est l'appel par +le \textsl{runtime}\footnote{\texttt{crt0.s}} d'une fonction +nommée \texttt{main} qui recevra deux paramètres\footnote{% +En fait trois, mais restons simple.} dont l'utilisation est décrite un peu plus bas. -Ces paramètres sont fournis par le système d'exploitation. +Ces paramètres sont fournis par des mécanismes planquées +dans la soute du système d'exploitation, et n'ont pas +d'importance pour le moment.. \lstinputlisting[language=c]{code/hello.c} -Un fois passé l'entrée, nous somme dans la partie active. -Nous appelons à ce moment la fonction \texttt{printf} +Un fois passé l'entrée, nous sommes dans la partie active. +Nous appelons à ce moment une fonction de la bibliothèque +standard : \texttt{puts} qui a pour but d'afficher sur l'écran le texte passé en paramètre. -Voila, c'est fait. Nous savons dire bonjour au monde. -Point suivant~: dire boujour à quelqu'un d'autre. Et pour +Voila, c'est fait. Dans les règles de l'art. +Nous savons dire « bonjour » au monde. +Point suivant~: dire bonjour à quelqu'un d'autre. Et pour cela il nous fait récupérer un argument depuis la ligne de commande. -% --------------------------------------------------------- +% ========================================================= \section{Arguments} @@ -70,7 +75,8 @@ En C, les tableaux commencent toujours à l'indice 0. Pour le traitement des options, il faut sauter à la page \pageref{getopt}. -% --------------------------------------------------------- +% ========================================================= + \section{Les variables} En gros, une variable du C est une zone de mémoire destinée @@ -88,20 +94,29 @@ que l'on peut stocker dans une variable. \textbf{La portée} : -% --------------------------------------------------------- +% ========================================================= \section{Les fonctions} Nous avons vu brièvement dans la première section de ce chapitre la fonction \texttt{main} et ses deux paramètres. 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. XXX\index{XXX} -% --------------------------------------------------------- +% ========================================================= \section{Entrées / Sorties} \index{stdin} \index{stdout} \index{stderr} +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. + \subsection{Les trois flux canoniques} \texttt{stdin}, \texttt{stdout} et \texttt{stderr}\dots @@ -145,9 +160,11 @@ un peu plus loin. \subsection{Écrire : \texttt{printf}} \index{printf} -La fonction \texttt{printf} permet d'afficher le contenu d'une -(ou plusieurs) -variable sous divers formats contrôlables par un petit DSL. +La fonction \texttt{printf} permet d'afficher sur la sortie +standard le contenu d'une (ou plusieurs) +variable sous diverses présentations, +qui sont contrôlables par un tout petit DSL\index{DSL}~: +la chaine de format. \begin{verbatim} int bar, foo = 42; @@ -160,17 +177,18 @@ la fonction '\texttt{printf}' avec les paramêtres appropriés et conserve la valeur de retour de celle-ci. Le premier de ces paramêtres, \texttt{"foo = \%d\textbackslash{}n"}, -est appelé \emph{chaine de format}. C'est une chaine de caractères +est appelé \emph{chaine de format}. C'est une chaine de caractères, que l'on peut classer en trois catégories~: -\begin{itemize} +\begin{itemize} % ------------ \item{\textsl{caractères crus} : ils sont directements poussés vers la sortie. La plupart d'entre eux donnent le résultat attendu.} \item{\textsl{codes de format} : les fragments qui commencent par le caractère '\%'. Ils servent à contrôler l'apparence de ce qui va -suivre. Par exemple \texttt{\%x} va afficher un int en hexadécimal} +suivre. +Par exemple \texttt{\%x} va afficher un \texttt{int} en hexadécimal}. \item{\textsl{échappements} : les caractères précédés d'un '\textbackslash' ou \textsl{backslash}\footnote{barre-penchée-du-8} @@ -180,14 +198,14 @@ Par exemple, \texttt{'\textbackslash{}n'} va générer le caractère \textsl{newline} qui marque la fin d'une ligne de texte. } -\end{itemize} +\end{itemize} % ------------ Quand à la valeur de retour, elle contient le nombre de caractères -efectivement écrits. Ce nombre peut être différent du nombre attendu, -par exemple si le disque est saturé. +effectivement écrits. Ce nombre peut être différent du nombre attendu +en cas d'erreur, par exemple si le disque est saturé. -Ce nombre peut être utilisé pour un affichage de multiples données -en limitant la taille des lignes. +Ce nombre, que beaucoup de gens négligent, peut être utilisé pour un +affichage de multiples données en limitant la longueur des lignes~: \begin{verbatim} int foo, nbre = 0; @@ -199,6 +217,9 @@ for (foo=0; foo<1000; foo++) { } \end{verbatim} + +% --------------------------------------------------------- + \subsection{Lire : \texttt{scanf}} \index{scanf} @@ -244,8 +265,7 @@ par \texttt{fopen}~: int fprintf(FILE *stream, const char *format, ...); \end{verbatim} - -% --------------------------------------------------------- +% ========================================================= \section{Un filtre Unix}\label{filtre-unix} @@ -271,7 +291,6 @@ $ ./no-op < no-op.c | head -5 $ \end{verbatim} - Vous voulez un autre exemple ? En voici un, parfois utile pour des simulations de terminal de \textsl{h4ck3rZ}\footnote{texte vert ou orange sur fond noir de rigueur.} sur une ligne en boucle de @@ -286,7 +305,7 @@ utilisés et les usages possibles d'un tel filtre, il faut voir le concept de pipeline du shell en page \pageref{pipeline}. -% --------------------------------------------------------- +% ========================================================= \section{Les pointeurs}\label{pointeur}\index{pointeur} @@ -307,8 +326,9 @@ 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{:)} -% --------------------------------------------------------- +% ========================================================= \section{Le préprocesseur}\index{cpp} @@ -363,10 +383,10 @@ pris en compte. Une chose très fourbe dont voici un exemple ? \begin{verbatim} -#define pixidx(fi,x,y) (((y)*fi->width)+(x)) -#define getRpix(fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ]) -#define getGpix(fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ]) -#define getBpix(fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ]) +#define pixidx (fi,x,y) (((y)*fi->width)+(x)) +#define getRpix (fi,x,y) (fi->R[ pixidx(fi,(x),(y)) ]) +#define getGpix (fi,x,y) (fi->G[ pixidx(fi,(x),(y)) ]) +#define getBpix (fi,x,y) (fi->B[ pixidx(fi,(x),(y)) ]) \end{verbatim} Finalemant, ça n'est pas si compliqué que ça. @@ -388,18 +408,22 @@ seront ensuite \textbf{liés} pour obtenir l'exécutable final. Mais découper un gros logiciel en plusieurs fichiers source a d'autres avantages. +Bien maitrisé, c'est une technique assez sereine. +Elle permet d'isoler des données spécifiques qu'il serait +bien plus lourd et périlleux d'utiliser d'une autre façon. -% --------------------------------------------------------- +% ========================================================= \section{Les structures} Une structure est une sorte de boite dans laquelle on peut ranger plusieurs variables afin de les manipuler comme -une seule entité. +une seule entité. Les utilisateurs de 80 colonnes voient +tout de suite de quoi il s'agit. -XXX +XXX trouver un exemple parlant et décalé\dots -% --------------------------------------------------------- +% ========================================================= \section{Gestion de la mémoire} \index{malloc} \index{free} @@ -452,7 +476,7 @@ Et finalement, nous avons réussi à générer un \textsl{useless number}. Notre mission est terminée, nous rendons notre bloc de mémoire au mc/p avec \texttt{free(ptr);}. -% --------------------------------------------------------- +% ========================================================= \section{Gérer les options}\index{getopt}\label{getopt} @@ -466,7 +490,7 @@ extern int optind, opterr, optopt; La page de man de getopt(3) contient des explications détaillées et un exemple simple d'utilisation. -% --------------------------------------------------------- +% ========================================================= \section{Erreurs classiques} @@ -548,4 +572,4 @@ l'utilisation des signaux (page \pageref{get-signal}), le chargement dynamique d'un \textsl{plug-in} (page \pageref{ex_dlopen}). -% --------------------------------------------------------- +% ========================================================= diff --git a/chap/shell.tex b/chap/shell.tex index fca7479..f606282 100644 --- a/chap/shell.tex +++ b/chap/shell.tex @@ -5,15 +5,15 @@ Le \texttt{shell} est le coquillage qui isole le MC/P\footnote{Master Control Program} des yusers. En gros, hein, je vais simplifier, et me limiter aux bricolages constructifs et/ou amusant. Il y aura du gore\index{gore} -aussi. +aussi, parce que le shell est à la fois un interpréteur de commande +et un langage de programmation. +Ces deux notions ont beaucoup de choses en commun, comme nous +allons essayer de le voir. -Le shell est à la fois un interpréteur de commande et un -langage de programmation. Ces deux notions ont beaucoup de -choses en commun. - -Nous allons nous concentrer sur le \textsl{Bourne again shell}. -aka \texttt{bash} qui est peut-être le plus répandu. Mais il -en existe d'autres : sh, ksh, ash, zsh\dots +Nous allons nous concentrer sur le \textsl{Bourne again shell} +(aka \texttt{bash}\footnote{aka GNU/shell ?}) qui est un des plus +répandus, du moins dans le monde Linux\index{Linux}. +Mais il en existe d'autres : sh, ksh, ash, zsh, tthsh\dots % ============================================================== diff --git a/code/fortran/Makefile b/code/fortran/Makefile index 886244c..fb0acc7 100644 --- a/code/fortran/Makefile +++ b/code/fortran/Makefile @@ -8,7 +8,7 @@ dessiner: dessiner.f90 Makefile gfortran -g $< $(INCS) -lplplotfortran -o $@ -foo.gif: dessiner Makefile +plot89a.gif: dessiner Makefile rm -f WS/A????.png ./dessiner - convert -delay 10 -colors 31 WS/A????.png foo.gif \ No newline at end of file + convert -delay 10 -colors 42 WS/A????.png $@ \ No newline at end of file diff --git a/code/fortran/README.md b/code/fortran/README.md new file mode 100644 index 0000000..2f34813 --- /dev/null +++ b/code/fortran/README.md @@ -0,0 +1,5 @@ +# Exemples de code en Fortran moderne + +Pour les explications, il faut aller lire le livre ou +les codes source. + diff --git a/code/fortran/dessiner.f90 b/code/fortran/dessiner.f90 index f7ed0fa..b9032cb 100644 --- a/code/fortran/dessiner.f90 +++ b/code/fortran/dessiner.f90 @@ -13,6 +13,13 @@ program dessiner contains ! ----------------------------- !------------------------------------------------------ +!- __ __ _ +!- \ \/ / __ __ (_) _ __ +!- \ / \ \ /\ / / | | | '_ \ +!- / \ \ V V / | | | | | | +!- /_/\_\ \_/\_/ |_| |_| |_| +!- + subroutine dessin_X11 (sha, shb, color) real, intent(in) :: sha, shb integer, intent(in) :: color @@ -41,7 +48,7 @@ subroutine dessin_X11 (sha, shb, color) call plcol0 (color) call plline (x, y) - call plend + call plend () end subroutine !------------------------------------------------------ @@ -54,7 +61,8 @@ end subroutine subroutine dessin_dans_un_fichier () - integer, parameter :: nbpts = 40 + integer, parameter :: nbpts = 20 + real, parameter :: usz = 15.0 ! univers size real :: x(nbpts), y(nbpts) integer :: frame, i character(len=89) :: filename @@ -64,11 +72,11 @@ subroutine dessin_dans_un_fichier () print *, 'Dessin dans un fichier' do i=1, nbpts - x(i) = 8.50 * (rand() - 0.5000) - y(i) = 8.50 * (rand() - 0.5000) + x(i) = usz * (rand() - 0.5000) + y(i) = usz * (rand() - 0.5000) * 0.50 enddo - do frame= 0, 149 + do frame= 0, 119 write (filename, "(a, i4.4, a)") "WS/A", frame, ".png" print *, frame, ' => ', trim(filename) call plsdev ('pngcairo') @@ -77,8 +85,8 @@ subroutine dessin_dans_un_fichier () call plenv (-10., 10., -10., 10., 0, 1) call plcol0 (3) do i=1, nbpts - x(i) = x(i) + (rand() - 0.5000) - y(i) = y(i) + (rand() - 0.5000) + x(i) = x(i) + 1.2 * (rand() - 0.5000) + y(i) = y(i) + 1.2 * (rand() - 0.5000) call plline (x, y) enddo write(buffer, "(i3.3)") frame @@ -86,12 +94,29 @@ subroutine dessin_dans_un_fichier () call plcol0 (15) call plstring (x, y, buffer) - call plend + call plend () enddo - - end subroutine !------------------------------------------------------ +!- _ _ ____ +!- | |_ _ __ ___ (_) | _ \ +!- | __| | '__| / _ \ | | | | | | +!- | |_ | | | (_) | | | | |_| | +!- \__| |_| \___/ |_| |____/ +!- +subroutine dessiner_en_trois_D () + integer, parameter :: szgrid = 64 + integer :: i, j + + print *, 'Dessin en 3D (de merde :)' + + call plsdev ('xwin') + call plinit () + + call plend () + +end subroutine +!------------------------------------------------------ end program diff --git a/code/hello.c b/code/hello.c index ab84a0f..a063576 100644 --- a/code/hello.c +++ b/code/hello.c @@ -6,6 +6,6 @@ int main(int argc, char *argv[]) { -printf("hello world.\n"); +puts("hello world."); return 0; } diff --git a/tetatricks.tex b/tetatricks.tex index 3b8c6da..bb28da6 100644 --- a/tetatricks.tex +++ b/tetatricks.tex @@ -21,14 +21,14 @@ \makeindex \setlength \parindent {2em} -\setlength \parskip {0.33em} % XXX +\setlength \parskip {0.30em} % XXX %------ reglages des 'listings' \lstset{frame=single} % dessin d'un cadre autour du listing \lstset{basicstyle=\ttfamily\small} \lstset{aboveskip=1.0em,belowskip=1.0em} -\setcounter{tocdepth}{1} +\setcounter{tocdepth}{1} % XXX à regarder un de ces jours ? \pagestyle{plain} \usepackage{pifont} % caractères rigolos