=LES FICHIERS DE DONNÉES DU HP-71 =

Jusqu'à présent, nous avons utilisé le HP-71 comme une calculatrice. Il n'a pas vraiment conservé pour nous beaucoup de données dans sa mémoire, sauf sous forme de variables. Admettons que cela représente une bonne quantité d'informations, surtout si vous avez des tableaux ou des matrices en balade.

Mais les variables ont deux gros inconvénients. D'abord, leur nombre est limité (J'utilise presque uniquement X, Y, Z, J et K, A$, B$ et C$), et il est facile de perdre la valeur d'une variable en l'utilisant pour autre chose. C'est comme une cassette vierge sur laquelle vous enregistrez de la musique, et réalisez trop tard qu'en fait elle n'était pas vierge ! Les variables n'ont pas de languette de sécurité contre l'effacement, contrairement aux cassettes ! Les variables sont prévues pour varier. Ensuite, leur deuxième inconvénient est que si vous en avez une grande quantité hantant votre machine et que vous voulez en détruire quelques unes pour récupérer la mémoire qu'elles encombrent, il n'y a pas de fonction qui vous dise si une variable existe ou non. Vous devez faire DESTROY ALL. Et ça fiche en l'air toutes les variables, qu'elles soient importantes ou non.

Pour résoudre ce dilemme, HP nous a fourni un moyen de sauvegarder des données dans un bloc de mémoire plus permanent. Ces blocs de mémoire sont à l'abri de la commande DESTROY et sont appelés "fichiers de données" ("data files"). Le HP-71 peut être vu comme un classeur, dont chaque case est un fichier rempli de données.

Avant que nous puissions mettre des données dans un fichier de données, nous devons d'abord le créer. C'est un peu comme dimensionner un tableau ; nous devons dire à l'ordinateur de mettre de côté assez de mémoire pour les données.

On peut avoir plusieurs types de fichiers dans le HP-71, chacun pour un usage spécifique :

<DL compact> <dt><b></b></dt>

	<dd> [Type]contenu prévu

<dt><b></b></dt>

	<dd> [SDATA]nombres

<dt><b></b></dt>

	<dd> [TEXT]chaînes de caractères

<dt><b></b></dt>

	<dd> [DATA]nombres ou chaînes

<dt><b></b></dt>

	<dd> [KEY]redéfinitions de touches

<dt><b></b></dt>

	<dd> [BASIC]programmes BASIC

<dt><b></b></dt>

	<dd> [BIN]programmes en langage machine

<dt><b></b></dt>

	<dd> [LEX]mots-clé supplémentaires BASIC

<dt><b></b></dt>

	<dd> [FORTH]programmes en langage FORTH

</DL>

Voyons-les l'un après l'autre.

==FICHIERS SDATA ==

Un des chapitres les plus confus du manuel d'utilisation du HP-71 est la section 14, "stockage et rappel de données", consacré à l'utilisation des fichiers. Après la lecture de cette section, j'étais convaincu que le livre a été écrit par quelqu'un qui n'a jamais utilisé de HP-71 ! (NdT : C'est probablement le cas ; compte tenu des délais de rédaction et d'impression d'un tel ouvrage, qui est quand même, il faut le reconnaître, de grande qualité, il a certainement été écrit pour l'essentiel avant que le premier appareil de pré-série soit disponible).

Le livre affirme simplement qu'il y a deux types de fichiers : les fichiers à accès séquentiel et les fichiers à accès direct, ce qui n'est vrai ni de près ni de loin.

===QU'EST-CE QU'UN FICHIER SDATA ?===

"SDATA" (prononcer "esse da ta") signifie "stream data" (flot de données) et c'est un type de fichier prévu pour la compatibilité avec la HP-41. Mais que cela ne vous fasse pas croire que les fichiers SDATA ne sont que pour les possesseur de HP-41 ! En fait, j'utilise les fichiers SDATA plus que les fichiers DATA et je n'y ai jamais placé des données venues de la HP-41 ! Vous trouverez peut-être dans les fichiers SDATA le type de fichier le plus utile proposé par le HP-71.

===COMMENT CRÉER UN FICHIER SDATA===

Si vous voulez conserver un tableau (disons un tableau de 100 éléments appelé A) dans un fichier, alors un fichier SDATA est ce qu'il vous faut. Pour créer un fichier SDATA de 100 éléments appelé "MONFICH", utilisez la commande :

CREATE SDATA MONFICH,100

Ceci crée 100 "enregistrements" numérotés de 0 à 99, et les remplit de zéros pour vous.

===COMMENT ASSIGNER UN NUMÉRO DE CANAL===

Plutôt que de se référer à votre fichier SDATA par son nom complet, le HP-71 vous permet de lui assigner un numéro, et d'utiliser ensuite ce numéro comme référence.

Ce "surnom" commode est appelé "numéro de canal du fichier". Utilisez le numéro de canal de la télévision comme analogie : vous n'avez pas à taper le nom entier de la chaîne de télé (c'est à dire TF1, Antenne2...), il suffit de taper le numéro (1, 2...).

Pour assigner un numéro de canal à votre fichier, utilisez la commande :

ASSIGN #1 TO MONFICH

A partir de maintenant, vous n'avez plus besoin de vous référer à nouveau à MONFICH, vous pouvez simplement faire référence au canal nº1. Note : D'autres versions du BASIC ont une commande "OPEN" pour "ouvrir" un fichier. Dans le BASIC du HP-71, "ASSIGN" effectue la même opération. Vous pouvez assigner plusieurs canaux, chacun à un fichier différent.

===COMMENT RAPPELER UN ENREGISTREMENT===

Les 100 nombres dans MONFICH (pardon, dans #1) sont appelés "enregistrements", un nombre par enregistrement (la HP-41 les appelle "registres"). Les enregistrements eux mêmes sont numérotés de façon séquentielle à partir de zéro (pour le premier enregistrement) et au dessus. Il semble que le premier enregistrement aurait dû s'appeler 1, mais ce n'est pas le cas, je ne sais pas pourquoi. C'est la vie. Pour lire la valeur d'un quelconque enregistrement, vous devez spécifier trois choses : le numéro de canal de votre fichier, le numéro de l'enregistrement et une variable dans laquelle vous voulez placer le contenu de l'enregistrement. Par exemple :

READ #1,10;X

lit la valeur de l'enregistrement 10 du canal 1 et le place dans la variable X. Vous pouvez alors imprimer X, ou en faire tout ce que vous voulez. N'ayez crainte, ceci n'"assigne" pas la variable X à l'enregistrement 10 ! Changer la valeur de X ne change pas la valeur de l'enregistrement 10.

===COMMENT REMPLIR UN ENREGISTREMENT===

Placer une valeur dans un enregistrement se fait de façon similaire :

PRINT #1,10;X

"imprime" la valeur de X dans l'enregistrement 10, remplaçant quoi que ce soit qui pouvait s'y trouver. Remarquez que ceci n'"insère" pas X dans le fichier, comme quand on insère une fiche dans un fichier. Cela remplace l'ancien enregistrement 10 par la nouvelle valeur de X. Nous verrons plus tard un moyen simple d'insérer ou de supprimer un enregistrement.

Il n'est pas obligatoire d'utiliser une variable, vous pouvez utiliser un nombre littéral à la place de X.

===COMMENT TROUVER COMBIEN IL Y A D'ENREGISTREMENTS DANS UN FICHIER===

Quand vous enregistrez ou que vous lisez des enregistrements dans un fichier, vous pouvez utiliser n'importe quel numéro d'enregistrement, pourvu qu'il existe. Cela semble évident, mais ce n'est pas vrai des fichiers DATA ! Les fichiers DATA peuvent être pénibles ! Comme je l'ai dit, les fichiers SDATA sont très bien. Si vous oubliez combien d'enregistrements contient votre fichier SDATA, un moyen très facile de le trouver est de le CATaloguer, et de diviser la longueur en octets par 8. Par exemple, si vous tapez CAT MONFICH (faites excuse, CAT n'utilise pas de numéro de canal !), vous verrez : MONFICH SDATA 800 à l'affichage. Ceci signifie que MONFICH est un fichier SDATA et qu'il fait 800 octets de long. Divisez 800 par 8, vous obtenez 100, le nombre d'enregistrements qu'il contient.

Personnellement, je réserve toujours l'enregistrement 0 pour contenir le nombre d'enregistrements que contient le fichier, et j'utilise les autres enregistrements pour les données réelles.

===STOCKER OU ENREGISTRER PLUS D'UN NOMBRE A LA FOIS===

Il y a quelques trucs que je n'ai pas encore mentionnés. Si vous voulez stocker ou lire plus d'un nombre à la fois, vous pouvez le faire en une seule commande

Par exemple :

READ #1,12;X,Y,Z,T

lit l'enregistrement 12 dans X, l'enregistrement 13 dans Y, l'enregistrement 14 dans Z et 15 dans T ! De même :

PRINT #1,12;X,Y,Z,T

stocke X dans l'enregistrement 12, Y dans 13, Z dans 14 etc... C'est particulièrement commode quand vous avez une poignée de variables que vous voulez stocker et rappeler ensemble.

Mais encore meilleure est la possibilité de stocker et de lire des tableaux entiers d'un seul coup. Supposons que vous ayez le tableau de 100 nombres déjà mentionné par DIM A(100). Vous voulez rappeler MONFICH dans le tableau. Tout ce qu'il faut, c'est :

READ #1,0;A()

pour lire les 100 valeurs ! Les parenthèses indiquent que A est un tableau, mais elles sont facultatives, je ne m'en sers jamais moi même. Le HP-71 reconnaît un tableau et continue simplement à lire le canal #1 jusqu'à ce que le tableau soit rempli. Bien sûr, si le tableau est plus grand que le fichier, vous avez un message d'erreur. En fait, vous pouvez mélanger les variables tableau et les variables scalaires dans une même commande READ, comme :

READ #1,15;J(),K,G(),P(),Q

Assurez-vous simplement de ne pas dépasser la fin du fichier !

Écrire les tableaux est aussi facile :

PRINT #1,0;A()

stocke tout le tableau A dans le fichier, à partir de l'enregistrement 0. A nouveau, les parenthèses sont facultatives. Si vous voulez stocker ou rappeler une matrice, mettez simplement une virgule entre les parenthèses comme ceci : (,) pour indiquer une matrice.

Vous pouvez tout aussi bien omettre les parenthèses, ce qui est finalement plus clair. Comme un fichier SDATA est simplement une liste linéaire de nombres, vous pouvez stocker un tableau et rappeler les valeurs individuellement, ou faire tous les mélanges que vous voulez. Le fait que vous ayez stocké un tableau ou une matrice n'est noté que par vous. Le fichier ne contient que les nombres eux mêmes.

===ACCÈS SÉQUENTIEL===

Jusqu'ici, quand nous avons écrit ou lu un fichier SDATA, nous avons spécifié le numéro d'enregistrement désiré. C'est appelé "accès direct", parce que nous pouvons accéder directement à l'enregistrement désiré. Mais remarquez quelque chose !

Quand nous faisons READ #1,12;X,Y,Z,T nous ne disons pas au 71 de placer l'enregistrement 13 en Y, il le fait automatiquement. Nous avons spécifié l'enregistrement 12 pour placer là le "pointeur de fichier". Après avoir lu l'enregistrement 12 et l'avoir placé dans X, le HP-71 déplace automatiquement le pointeur d'une position en avant et lit alors l'enregistrement 13 dans Y. Ainsi de suite, jusqu'à ce qu'il lise l'enregistrement 15 dans T et une fois de plus avance le pointeur d'une position. Aussi, après la fin de cette commande, le pointeur se trouve sur l'enregistrement 16. Supposons que nous fassions alors :

READ #1;L

que pensez-vous qu'il arrive ? Nous n'avons pas spécifié quel enregistrement utiliser ! Mais le pointeur est sur 16, aussi, bien sûr, l'enregistrement 16 est lu dans L et le pointeur avancé sur 17. Ceci est appelé accès séquentiel parce qu'il donne accès aux enregistrements l'un après l'autre, de façon séquentielle. Remarquez qu'il n'y a rien qu'on puisse considérer comme un fichier à accès séquentiel ou comme un fichier à accès direct! on peut accéder à tout fichier de façon directe ou de façon séquentielle.

===COMMENT DÉPLACER LE POINTEUR===

Pour placer le pointeur là ou vous le voulez, utilisez la commande RESTORE. Par exemple, pour pointer à l'enregistrement 57, tapez :

RESTORE #1,57

Et à partir de là, vous pouvez accéder au fichier de façon séquentielle , pour votre délice ! Mais vous ne pouvez pas lire après la fin du fichier, bien sûr, Si vous essayez, vous obtenez une erreur.

===COMMENT AGRANDIR UN FICHIER===

MAIS !! Voici la magie de l'accès séquentiel. Vous pouvez imprimer séquentiellement après la fin du fichier ! Supposons que vous fassiez ceci :

READ #1,99;X

Ceci lit l'enregistrement 99 (le dernier) dans X et déplace le pointeur de fichier à l'enregistrement nº100 (qui n'existe pas). Si maintenant vous faites :

PRINT #1;PI

le HP-71 exécute un miracle ! Il n'y a pas d'erreur ! Il agrandit le fichier à une longueur de 101 enregistrements et place la valeur de PI dans l'enregistrement nº100 (et déplace le pointeur sur 101) ! Si, maintenant, vous faites CAT MONFICH, vous verrez qu'il fait 808 octets de long. Tout le travail de déplacement de la mémoire, etc... est fait automatiquement pour vous ! Écrire plus d'un nombre (comme une liste ou un tableau) marche aussi après la fin de fichier

Remarquez quand-même que RESTORE est un animal de type accès direct et que vous ne pouvez donc RESTOREr le pointeur à un numéro d'enregistrement inexistant. Le seul moyen de déplacer le pointeur "au-dessus" du fichier est d'écrire ou de lire l'enregistrement de numéro le plus élevé. Ceci a un sens parce que c'est fait normalement par une écriture séquentielle préalable.

===COMMENT INSÉRER OU SUPPRIMER UN ENREGISTREMENT===

Quand vous combinez la possibilité d'agrandir un fichier avec la possibilité d'écrire tout un tableau d'un seul coup, vous obtenez la possibilité d'insérer un nouvel enregistrement dans le fichier. Supposons que notre fichier ait 100 enregistrements de long et que nous voulons insérer un nouvel enregistrement, X, entre l'enregistrement 52 et le 53 (il deviendra donc le nouveau numéro 53, décalant les suivants d'un numéro). Tout ce qu'il faut, c'est :

DIM T(100-53)

READ #1,53;T

PRINT #1,54;T

PRINT #1,53;x

Ce qui s'exécute en 0,7 secondes !

Aucun besoin d'une commande INSERT spéciale. Lire un tableau et l'écrire ailleurs permet non seulement l'insertion mais aussi l'effacement, la rotation et plus encore !

===COMMENT DESASSIGNER UN NUMÉRO DE CANAL===

Pour "fermer" un fichier et désassigner son numéro de canal, vous devez utiliser la commande ASSIGN ainsi :

ASSIGN #1 TO ""

Ceci assigne le canal 1 à "rien" et rend MONFICH inaccessible par les commandes READ et PRINT jusqu'à ce qu'il soit assigné à nouveau. Notez que la commande END ferme aussi tous les fichiers ouverts. Bien sûr, purger un fichier ouvert, non seulement le ferme (pour de bon !), mais aussi désassigne le numéro de canal.

Notez bien ! Chaque fois que la mémoire du HP:71 est "reconfigurée", tous les fichiers ouverts sont fermés ! Ceci n'est pas évident à la lecture du manuel. La reconfiguration de la mémoire se produit dans trois cas : quand FREE PORT est exécuté, quand CLAIM PORT est exécuté et quand le contenu d'un quelconque port de branchement est changé (à l'exception du branchement ou du retrait du lecteur de cartes, qui n'est pas un appareil à adresse variable). Aussi, ne faites rien de tout cela quand des fichiers sont ouverts, ou bien ils seront fermés, empêchant peut-être un programme suspendu de CONTinuer.

===LES TRUCS DE SDATA===

Il y a d'horribles avertissements dans le manuel, au sujet de "marqueurs de fin de fichier" de "perte de données" et autres choses bizarres. N'y accordez aucune attention. Aucun de ces avertissements ne s'applique aux fichiers SDATA, ils sont réservés aux fichiers DATA. Comme je disais, les fichiers SDATA sont bien !

Une chose encore n'a pas été dite sur les fichiers SDATA : vous pouvez seulement y stocker des nombres, pas des chaînes (par des manoeuvres "normales"). Si vous avez une HP-41 et son module HP-IL, vous pouvez vous amuser à envoyer des nombres et des chaînes alpha dans des fichiers SDATA du HP-71 !

Il doit être évident maintenant que la manipulation des fichiers à partir du clavier n'est pas très facile. Il est prévue qu'elle soit faite par programme. Cependant, sauvegarder un tableau par sécurité dans un fichier est de pratique courante, ainsi que l'utilisation de boucle FOR/NEXT pour manipuler le fichier. Retourner un tableau de 100 éléments A se fait, par exemple, par :

PRINT #1,0;A

FOR X=0 TO 99 @ READ #1,X;A(100-X) @

NEXT X

(le résultat est dans A)

En général, la complexité d'usage des fichiers est contrebalancée par le fait que les fichiers sont des endroits sûrs pour le rangement des données. Les heurs et malheurs de fonctions comme DESTROY n'affectent pas les fichiers.

=FICHIERS EN GENERAL =

Maintenant que vous avez des données dans un fichier SDATA, vous pouvez faire du bon travail. Il y a un grand nombre de commandes BASIC qui traitent des fichiers. Si vous tapez CAT ALL, vous verrez le haut du "catalogue" des fichiers en mémoire. Presser les flèches haut et bas vous permet de parcourir le catalogue et presser >] et [< vous permet de voir toute la ligne correspondant à chaque fichier. L'affichage montre les éléments importants : le nom du fichier, sa protection, son type et sa taille en octets.

Les noms de fichiers font de 1 à 8 lettres de long. Le premier caractère doit être une lettre, mais ensuite vous pouvez utiliser des chiffres ou des lettres. Pour changer le nom d'un fichier, tapez simplement:

RENAME FRED TO BILLY

Ce qui donnera au fichier FRED le nouveau nom BILLY.

Pour supprimer un fichier de la mémoire, il suffit de faire :

PURGE BILLY

et BILLY est supprimé de la mémoire. Soyez surs de ce que vous faites, car il n'y a aucun moyen de récupérer un fichier purgé ! Autant dire qu'il est parti.

Mais supposons que vous ayez un fichier vraiment important qui ne doit en aucun cas être purgé. Vous pouvez le protéger. Tapez :

SECURE FRED

et le type de sécurité du fichier FRED, montré dans le catalogue est changé en "S". Ceci signifie que vous pouvez lire le fichier mais que vous ne pouvez pas y écrire ni le purger. Pour y écrire à nouveau des données, faites juste :

UNSECURE FRED

et écrivez tout ce que vous voulez. Une bonne idée est de dé-sécuriser un fichier, lui assigner un numéro de canal puis le sécuriser à nouveau. Ainsi vous pouvez y écrire (parce qu'il n'était pas sécurisé quand vous l'avez ouvert) mais pas l'effacer (parce qu'il est sécurisé).

Si vous voulez faire une copie du fichier en mémoire, pour pouvoir jouer avec la copie et avoir l'autre copie comme réserve de sécurité, faites simplement :

COPY FRED TO BILLY

Ceci crée un nouveau fichier en mémoire appelé BILLY qui est identique à FRED sauf en ce qui concerne le nom.

Si vous avez un lecteur de cartes, un lecteur de cassettes, de disquettes ou tout autre support de masse, vous pouvez même copier le fichier sur l'appareil de stockage de masse. Ceci vous permet de conserver des charretées de données dans un fichier et de les rappeler dans le HP-71 à la demande. La syntaxe correcte pour ce genre d'opérations n'est pas décrit dans ce livre (reportez-vous à la notice de l'appareil en cause et au manuel d'utilisation du HP-71).

==FICHIERS TEXTE ==

Contrairement aux fichiers SDATA, qui peuvent uniquement stocker des nombres, les fichiers texte (TEXT) ne peuvent stocker que des chaînes, et ne peuvent les stocker que séquentiellement. En dehors de ces deux grosses différences, les fichiers TEXT et SDATA marchent à peu près pareil. Pour créer un fichier texte, vous faites :

CREATE TEXT MESMOTS

Ceci crée un fichier texte appelé MESMOTS. Pour ouvrir le fichier vous faîtes :

ASSIGN #1 TO MESMOTS

et vous y écrivez les données :

PRINT #1;"Ceci est un test"

Bien que vous ne puissiez écrire que séquentiellement dans un fichier texte, vous pouvez y lire séquentiellement ou directement. Même si les fichiers textes stockent tout comme du texte, vous pouvez y stocker des nombres et les relire. Par exemple, vous pouvez faire :

PRINT #1;12345

et plus tard lire avec :

READ #1;X

et trouver le nombre 12345 en X. Mais vous pouvez aussi faire :

READ #1;A$

et trouver "12345" dans A$. Vous voyez, les fichiers TEXT stockent les nombres comme des chaînes. En cas de relecture dans une variable numérique, le texte est retransformé en nombre. En général, les nombres prennent plus de place en mode texte que sous la forme normale, n'abusez-donc pas de cette possibilité.

==FICHIERS DATA ==

Vous vous en rappelez, les fichiers SDATA ne peuvent stocker que des nombres, et pas des mots, ni des noms, adresses ou autres. Si vous désirez stocker un mélange de nombres et de textes dans un fichier, un fichier DATA est ce qu'il vous faut !

Vous vous souvenez également qu'un fichier SDATA ne peut stocker qu'un seul nombre par enregistrement. Devinez quoi ! les fichiers DATA peuvent stocker autant d'éléments (nombres ou mots) que vous voulez. ceci vous permet de conserver dans un même enregistrement des éléments ayant un lien logique.

===CREER UN FICHIER DATA===

Contrairement aux fichiers SDATA, dont les enregistrements ont toujours 8 octets de long, les enregistrements des fichiers DATA peuvent être aussi longs ou aussi courts que vous le voulez. Malheureusement, ceci signifie que vous devez vous demander quelle longueur vous voulez leur donner ! Ce n'est pas tellement difficile ; vous devez seulement voir combien de nombres ou de mots vous voulez stocker dans chaque enregistrement. Voici un exemple.

Disons que vous voulez écrire un programme d'agenda qui stocke le nom et le numéro de téléphone de vos amis dans un fichier DATA. Comme les fichiers DATA admettent plusieurs éléments par enregistrement, mettons le nom et le numéro de téléphone de chaque personne dans le même enregistrement. Ainsi nous pouvons stocker "Richard J. Nelson" et son numéro de téléphone 7145490581 dans le même enregistrement d'un fichier DATA. NdT : Richard est le fondateur des clubs d'utilisateurs de calculatrices HP (dont le HP-71), il y travaille depuis 1974 ; n'en profitez-pas pour le déranger à chaque instant !

Nous devons d'abord répondre à la question vitale : Quelle est la longueur maximale de texte que nous voulons stocker dans chaque enregistrement ? Si vous ne pouvez-pas répondre parce que vous n'avez aucune idée de la longueur que peut prendre le texte, alors vous ne devriez-pas choisir un fichier DATA ; utilisez un fichier texte, qui ne se soucie pas de la longueur du texte.

Dans notre cas d'un programme d'agenda, donnons nous une limite pour les noms de 21 lettres de long. La règle pour la longueur des enregistrements dans un fichier DATA est :

Longueur totale maximale du texte plus 3 octets par chaîne plus 8 octets par nombre Comme nous avons une chaîne de 21 caractères et un nombre, notre fichier d'agenda nécessite 21 + 3 + 8 octets par enregistrement, pour un grand total de 32 octets ! (votre propre fichier peut évidemment avoir une taille différente).

Le fichier agenda est appelé AGENDA. Mais avant de créer le fichier, vous devez décider combien d'enregistrements vous voulez ! Réservons de la place pour 50 noms et numéros de téléphone. Récapitulons : Nous voulons un fichier DATA appelé AGENDA de 50 enregistrements de 32 octets chaque. Il se crée ainsi :

CREATE DATA AGENDA,50,32

Rappelez-vous simplement de mettre le nombre d'enregistrements en premier, puis la taille de chaque enregistrement. Comme le nombre d'enregistrements est logiquement le plus important, il est facile de se rappeler qu'il vient en premier. Rappelez-vous aussi que, quand vous créez des fichiers SDATA vous spécifiez uniquement le nombre d'enregistrements, parce que la longueur d'enregistrement est automatiquement mise à 8 octets (assez pour un nombre).

===COMMENT ASSIGNER UN NUMÉRO DE CANAL===

Vous assignez un numéro de canal à un fichier DATA exactement comme à un fichier SDATA :

ASSIGN #1 TO AGENDA

A partir de maintenant, nous ne ferons plus référence à AGENDA mais à #1.

===STOCKAGE A ACCÈS DIRECT===

Pour stocker un enregistrement, écrivez tout son contenu dans le fichier à la fois. Par exemple :

PRINT #1,5;"Phineas McLanagan",1234567

écrit le nom de Finny et son numéro de téléphone dans l'enregistrement nº5. Notez que le premier élément est une chaîne et le second un nombre. Vous devez conserver trace du type de chaque élément, pour le rappeler dans le bon type de variable. Contrairement aux fichiers texte, les fichiers DATA insistent pour que les nombres soient lus dans des variables numériques et les textes dans des variables chaînes, jamais des chaînes dans des nombres ou vice versa.

===STOCKAGE A ACCÈS SÉQUENTIEL===

Il peut être fait, mais il risque de gâcher tout le fichier, avec des chaînes à cheval sur deux enregistrements et autres saletés. A moins que vous sachiez précisément ce que vous faites, N'essayez pas.

===RAPPEL A ACCÈS DIRECT===

Pour récupérer le contenu d'un certain enregistrement :

READ #1,5;N$,P

lit le contenu de l'enregistrement nº5 dans deux variables, N$ et P. Si l'enregistrement ne contient pas une chaîne suivie d'un nombre, vous obtiendrez une erreur quand vous essaierez ! Si vous faites l'exemple ci-dessus de stockage à accès direct, maintenant N$ contient le nom de Finny et P son numéro de téléphone.

Contrairement aux fichiers SDATA, essayer de rappeler un fichier DATA dans lequel rien n'a été écrit, donne une erreur. Pour éviter ceci, quelques programmeurs aiment remplir les nouveaux fichiers avec des données vides dès l'abord. Je préfère garder trace de quels enregistrements ont un contenu et quels n'en ont pas.

===RAPPELS A ACCÈS SÉQUENTIEL===

Comme avec les fichiers SDATA, ne pas spécifier quel élément vous voulez rappeler provoque le rappel de l'élément suivant. Contrairement aux fichiers SDATA, cependant, les fichiers DATA peuvent contenir plus d'un enregistrement ! Par exemple :

READ #1;N$,P

lira maintenant l'enregistrement nº6. puisque nous venons juste de lire le nº5. d'un autre côté :

READ #1;N$

lira uniquement le nom de l'enregistrement nº6. Notez bien ! Après avoir fait ceci, le pointeur de fichier est laissé dans les limbes, flottant entre deux éléments d'un enregistrement.

Alors, nous pouvons faire :

READ #1;P

pour obtenir le numéro de téléphone.

===STOCKER OU RAPPELER PLUSIEURS ENREGISTREMENTS A LA FOIS===

Navré, mais c'est impossible. Vous vous rappelez, comment nous pouvions lire tout un paquet d'enregistrements à partir d'un fichier SDATA ? Vous ne pouvez pas le faire avec les fichiers DATA. Si vous essayez, vous aurez une erreur en arrivant à la fin du premier enregistrement.

En fait, j'ai menti. Vous pouvez en quelques sortes le faire si vos données ne sont que du texte ou que des nombres. Vous pouvez alors lire un tableau ou une matrice comme pour un fichier SDATA. Mais rappelez-vous que stocker un tableau ou une matrice dans un fichier est une sorte d'accès séquentiel, et que la mise en désordre du fichier DATA est garantie ! J'ai eu une application, une fois, qui utilisait la première moitié d'un fichier en accès direct et la seconde en accès séquentiel, mais quand j'ai essayé de voir comment il marchait après plusieurs mois de non utilisation, j'ai attrapé au moins une hernie mentale.

===DÉPLACER LE POINTEUR DE FICHIER===

RESTORE marche avec les fichiers DATA exactement comme avec les fichiers SDATA. Il place le pointeur au commencement de l'enregistrement spécifié. Par exemple :

RESTORE #1,5

place le pointeur au début de l'enregistrement nº5.

Malheureusement, il n'y a aucun moyen de RESTOREr le pointeur à l'intérieur d'un enregistrement. Pour placer le pointeur dans un enregistrement, vous devez en rappeler quelques éléments, sans rappeler tout l'enregistrement, comme vu précédemment. Ceci laisse l'enregistrement à la fin du dernier élément rappelé. Bien que ce soit possible, laisser le pointeur flotter dans les enregistrements est d'une utilité douteuse et une mauvaise chose parce que vous n'arriverez jamais à comprendre ce qui se passe dans le fichier.

===ASTUCES DES FICHIERS DATA===

L'avertissement au sujet du stockage à accès séquentiel vient du fait que le HP-71 a une particularité désagréable appelée "marqueur de fin de fichier". Après chaque écriture séquentielle dans le fichier, le HP-71 stocke un marqueur de fin de fichier dans l'enregistrement qui vient d'être écrit.

Ceci évite des rappels séquentiels après ce point. Heureusement, cela n'affecte pas les opérations en accès direct. Le manuel surestime les dangers du marqueur de fin de fichier. Il n'y a pas de perte de données après lui ! Vous pouvez lire séquentiellement avant et après une marque de fin de fichier !

Elle empêche seulement une lecture séquentielle à travers ce point. Elle est ignorée par la lecture à accès direct. Si vous essayez de stocker trop de données dans un enregistrement, vous obtenez une erreur. Par exemple si vous essayez de stocker dans votre fichier AGENDA un enregistrement avec un nom de plus de 21 lettres de long, le HP-71 n'aura pas assez de place pour le faire. Si vous avez fréquemment des erreurs de cette sorte, vous pouvez recréer le fichier avec des enregistrements plus longs. Malheureusement, il n'y a aucun moyen d'agrandir les enregistrements directement. Si vous voulez le faire, créez un nouveau fichier avec la nouvelle longueur d'enregistrement puis bouclez à travers l'ancien fichier en stockant son contenu dans le nouveau fichier. Vous pouvez ensuite purger l'ancien fichier.

Des exemples des idées ci-dessus sur les fichiers DATA se trouvent dans un programme appelé TELEPHON. Voir chapitre 9 pour le listing, les instructions et les commentaires.

==FICHIERS KEY ==

Une des particularités les plus agréables du HP-71 est la possibilité de redéfinir ce que font les touches ("key" en anglais). J'ai dû tenir ma langue pour ne pas vous en parler plus tôt.

Supposons que vous utilisez souvent la commande DESTROY (c'est mon cas !). Et que vous n'utilisez pratiquement jamais la touche RETURN (ce n'est pas mon cas

). Plutôt que de laisser la touche RETURN ([f] [D]) encombrer le clavier,

et taper vous même DESTROY à chaque fois, vous pouvez changer RETURN en DESTROY

Essayez ceci. Tapez exactement ce qui est montré :

KEY "fD","DESTROY";

et, bien sûr, pressez [ENDLINE]. Maintenant, pressez la touche USER ([f] [0]) pour voir l'indicateur USER allumé en bas à gauche de l'affichage.

Maintenant, pressez [RETURN]. Magie!!! Au lieu de RETURN, l'affichage montre DESTROY, avec le curseur juste après pour que vous puissiez continuer à taper

Cette redéfinition de touche ne marche qu'en mode USER (c'est à dire quand l'indicateur USER est allumé). Si vous voulez l'effacer complètement, tapez :

KEY "fD"

et [RETURN] travaillera normalement que vous soyez ou non en mode USER. En général, pour affecter quoi que ce soit à une touche, tapez la commande KEY suivie du nom de la touche entre guillemets, une virgule, puis la redéfinition entre guillemets. Si le nom de la touche ou la redéfinition est dans une variable chaîne, vous pouvez l'utiliser à la place de la chaîne littérale.

Notez que la redéfinition ci-dessus était terminée par un point virgule (;). Ceci signifie que le curseur doit rester là pour que vous puissiez continuer à taper. Il y a deux autres types de redéfinitions.

Si vous omettez le point virgule dans la redéfinition, le HP-71 tapera la chaîne définie puis pressera automatiquement [ENDLINE]. Par exemple, j'utilise CAT ALL et DESTROY ALL si souvent que j'ai assigné ALL à la touche FACT (au dessus de =). Comme ALL est toujours la dernière chose à taper avant de presser [ENDLINE], je laisse le HP-71 le faire pour moi :

KEY "f=","ALL"

Ainsi, en mode USER, j'obtiens CAT ALL et DESTROY ALL en deux pressions de touches

Le troisième type de redéfinition est hanté et doit être utilisé avec précaution. Si vous terminez une redéfinition par deux points (:) au lieu d'un point virgule, la redéfinition est exécutée sans même être affichée !

Essayez ceci :

KEY "f(","TIME$":

et maintenant pressez la touche AUTO (au dessus de la parenthèse ouvrante) en mode USER. Remarquez que l'heure apparaît immédiatement sans que "TIME$" soit inscrit à l'affichage. Ce type de redéfinition, qui marche mystérieusement, ne doit être utilisé que si vous êtes certain que vous vous rappellerez ce qui se passe. Presser une touche et voir un résultat sans avoir une indication sur ce qui se passe peut être déconcertant.

Si par hasard vous oubliez en quoi consiste une redéfinition, pressez simplement [VIEW] (au dessus de la virgule) puis pressez et maintenez la touche désirée. Sa redéfinition sera montrée, précédée par un point virgule, deux points ou un espace pour indiquer de quel type de redéfinition il s'agit.

Pour changer une définition de touche, la meilleure méthode est d'utiliser la commande FETCH. Par exemple FETCH "f(" donnera:

DEF KEYS 'f(','TIME$':

à l'affichage, avec le curseur attendant que vous tapiez (le DEF est facultatif, un peu comme le LET).

Pour voir toutes les redéfinitions en cours, le meilleur moyen est de mettre le DELAY à 8 (pour maintenir chaque touche à l'affichage) et de taper :

LIST KEYS

Pressez les touches >] et [< pour voir toute redéfinition plus longue que l'affichage et pressez toute autre touche pour passer à la définition suivante. Quand vous aurez vu toutes les définitions, n'oubliez-pas de remettre le DELAY à sa valeur usuelle (.5 est standard).

Pendant un CAT ALL, vous remarquerez un fichier appelé "keys". Son type est "KEY". C'est le fichier qui contient vos redéfinitions. Vous pouvez copier, purger, sécuriser et appliquer toute autre commande de fichiers à "keys", comme à tout autre fichier.

Cependant, soyez averti que seul le fichier "keys" sera considéré comme le fichier de redéfinitions actif. Si vous faites :

RENAME KEYS TO FRED

vous perdez vos redéfinitions. Pour les remettre en effet, il suffit de faire :

RENAME FRED TO KEYS

Ceci vous permet d'avoir plus d'un fichier de redéfinition en mémoire et de sélectionner quel est celui que vous voulez activer en le renommant "keys".

==FICHIERS BASIC ==

Enfin ! Nous arrivons aux fichiers BASIC ! Et vous pensiez y être dès les premières pages !

Les fichiers DATA sont des collections de données. Les fichiers TEXT sont des collections de textes, les fichiers KEY sont des collections de définitions. Aussi, évidemment, les fichiers BASIC sont des collections de commandes BASIC.

L'intérêt de conserver une collection de commandes BASIC en mémoire n'est pas tellement de pouvoir les examiner et de les taper nous-mêmes encore et encore. Ce qu'il y a de magique dans un fichier BASIC, c'est qu'on peut demander au HP-71 d'exécuter l'ensemble des instructions d'un coup !

Il y a un nom spécial pour un ensemble de commandes qu'un ordinateur exécute d'un coup. On l'appelle un PROGRAMME. L'art qui consiste à mettre ensemble une telle collection de commandes est appelé "art de la programmation". La personne qui le fait est appelée un programmeur. Si les commandes sont en langage BASIC, vous avez un programme BASIC, écrit par un programmeur BASIC. Le HP-71 est l'outil le plus achevé pour les programmeurs BASIC. Non seulement il connaît le BASIC mais il peut les rassembler dans un fichier BASIC, puis exécuter le fichier entier d'un seul coup. Et tout cela dans une machine portable

Quand vous avez fait un CAT ALL, vous avez vu un fichier nommé "workfile" ("fichier de travail"), du type de fichier BASIC. Utilisons-le.

Pour vous placer dans le "workfile", tapez simplement la commande EDIT (NdT : en anglais, le mot EDIT, souvent traduit par l'anglicisme "éditer" est en fait synonyme soit de "corriger", soit d'"imprimer" ; ici il est pris dans son premier sens) (elle est au-dessus de la touche Z). Ensuite, pour vous assurer qu'il est vide, tapez la commande PURGE (au-dessus de la touche V). Nous pouvons maintenant jouer avec un fichier de travail vide.

Bien que la complexité de la programmation soit expliquée dans un futur chapitre, voici un avant-goût de ses joies. Tapez ces lignes, en pressant [ENDLINE] après chacune d'elle :

10 "JE SUIS UN PROGRAMMEUR"

20 BEEP 800

30 "C'EST FACILE"

40 BEEP 650

50 GOTO 10

Ceci est un programme, une liste de 5 commandes. Remarquez qu'elles n'ont pas été exécutées pendant que vous les frappiez. C'est parce qu'elles étaient précédées par un numéro (appelé "numéro de ligne"). Chaque fois que vous tapez une commande précédée par un numéro, le HP-71 comprend que vous ne voulez-pas qu'elle soit exécutée, mais au contraire stockée comme une ligne de programme. Dans votre cas, ces lignes sont stockées dans le fichier de travail. Pressez les flèches [HAUT] et [BAS] pour aller de haut en bas dans le programme. Pressez [ON] pour arrêter.

Le fichier de travail "workfile" est prévu comme brouillon pour le programmeur. N'y mettez jamais de programme important ! Un vrai programme doit avoir son propre nom. Pour créer un fichier BASIC avec un nom propre, vous faîtes :

EDIT ULAMCONJ

pour créer un fichier BASIC appelé ULAMCONJ.

Vous pouvez changer son nom (RENAME), le purger (PURGE), le sécuriser (SECURE), etc...

Plus là-dessus plus tard.

==FICHIERS FORTH ==

FORTH est un langage d'ordinateurs que le HP-71 peut parler si vous branchez le module optionnel FORTH/ASSEMBLEUR (ou FORTH/TRADUCTEUR). Avec ce module en place, vous pouvez écrire et exécuter des programmes FORTH. Certains disent que FORTH est plus rapide que BASIC. Tout ce que je sais, c'est que pour des tâches complexes je trouve BASIC plus rapide à écrire. FORTH est peut-être plus rapide, mais BASIC est sûrement plus commode

(NdT : Il y a ici une ébauche de polémique dont l'auteur garde la responsabilité ; ce qui est sûr, c'est que seul BASIC est fourni en standard et que FORTH ne fait pas l'objet de ce livre).

==FICHIERS BIN et LEX ==

Le HP-71 ne parle pas réellement BASIC. Je ne parle pas le grec, mais je peux traduire un article de journal grec en anglais si je peux utiliser un dictionnaire et une grammaire et si vous me donnez assez de temps. C'est exactement ce que fait le HP-71. Il ne parle pas réellement BASIC, il se contente de le traduire lentement, bit par bit, dans le langage qu'il comprend vraiment.

Le langage d'origine du HP-71, comme pour tous les ordinateurs, est appelé langage machine. C'est un horrible trifouillis de nombres mélangés qui n'a aucun sens pour le commun des mortels. Mais c'est ce que la machine parle, aussi il est extrêmement rapide. Un programme écrit complètement en langage machine fait des ronds autour du même programme écrit en BASIC.

L'ennui c'est qu'un programme complexe en BASIC qui est écrit en 10 heures demanderait 10 ans de travail s'il devait être écrit en langage machine. C'est possible, mais pénible. Les programmes en langage machine se trouvent dans les fichier BIN et LEX.

Un fichier BIN (ce qui signifie BINaire) est un programme complet, comme un fichier BASIC. Un fichier LEX (pour Language EXtension, extension de langage) ajoute de nouvelles fonctions et commandes au BASIC. Les deux peuvent être écrits dans un langage intermédiaire appelé langage d'assemblage ou assembleur. Il est compréhensible par des spécialistes et ceux qui n'ont rien d'autre à faire. Si vous avez le module FORTH/ASSEMBLEUR, vous pouvez écrire vous-même des programmes en assembleur, les assembler en langage machine puis les exécuter. Si vous êtes un expert ou si vous n'avez rien de mieux à faire !

Bien que le présent livre soit en principe à propos du BASIC, à la fin nous verrons un moyen de taper des fichiers LEX et BIN en mémoire sans utiliser le module FORTH !

Plusieurs excellents fichiers LEX sont disponibles ici et là et les techniques présentées à la fin de ce livre vous permettront de les utiliser sans rien avoir à utiliser d'autre qu'un HP-71 tout nu.

PEEK$ et POKE?.