#sundaycommit
This commit is contained in:
parent
28c260ea5e
commit
52b7bbe6ef
@ -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.
|
||||
|
||||
% -------------------------------------------
|
||||
% -------------------------------------------
|
||||
% ====================================================================
|
||||
|
104
chap/C.tex
104
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}).
|
||||
|
||||
|
||||
% ---------------------------------------------------------
|
||||
% =========================================================
|
||||
|
@ -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
|
||||
|
||||
% ==============================================================
|
||||
|
||||
|
@ -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
|
||||
convert -delay 10 -colors 42 WS/A????.png $@
|
5
code/fortran/README.md
Normal file
5
code/fortran/README.md
Normal file
@ -0,0 +1,5 @@
|
||||
# Exemples de code en Fortran moderne
|
||||
|
||||
Pour les explications, il faut aller lire le livre ou
|
||||
les codes source.
|
||||
|
@ -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
|
||||
|
@ -6,6 +6,6 @@
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
printf("hello world.\n");
|
||||
puts("hello world.");
|
||||
return 0;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user