Obligement - L'Amiga au maximum

Dimanche 19 novembre 2017 - 05:46  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : ARexx - instructions diverses
(Article écrit par Xavier Leclercq et extrait d'Amiga News - février 1993)


Nous en étions, à l'épisode précédent, aux instructions diverses, et en prenant notre courage à deux mains, nous allons d'abord passer au crible celles qui n'ont pas encore été vues.

XRANGE

D'un usage ponctuel, cette instruction permet d'afficher une plage de valeur comprise entre une borne inférieure et une supérieure.

/*INSTRUCTIONS DIVERSES EXEMPLE #25 */
SAY D2C(12)||"L'Alphabet :"
SAY XRANGE('a','z')

Attention, il faut écrire "XRANGE(..." et non "XRANGE (...". La parenthèse doit toujours coller à l'instruction !

VALUE

A première vue, je ne vois pas très bien à quoi peut bien servir cette instruction qui me fait vaguement penser à une certaine instruction "LET" d'un vieux BASIC. VALUE fournit la valeur qu'on lui transmet comme argument.

/*INSTRUCTIONS DIVERSES EXEMPLE #26 */
VAL = VALUE (a)
a = C2D('a')
SAY VALUE(a)
SAY a

"SAY VALUE(a)" ou "SAY a", c'est du pareil au même : 97. Mais comme je l'ai souligné plus haut, attention :

/*INSTRUCTIONS DIVERSES EXEMPLE #27 */
a = C2D('a')
SAY VALUE (a)
SAY a

Ce qui donne :

VALUE 97
      97

Autrement dit, ARexx, et c'est encore une démonstration de l'utilisation sans contrainte de sa syntaxe, prend VALUE non pas comme une instruction VALUE() mais comme le mot "VALUE" ! Tout cela à cause d'un espace qui s'est infiltré entre VALUE et la parenthèse !

/*INSTRUCTIONS DIVERSES EXEMPLE #28 */
VALUE = "THORGAL"
XRANGE = C2D('a')
SAY VALUE
SAY XRANGE

Quelle catastrophe ! ARexx accepte des noms de fonctions comme variables sans être le moins du monde dérangé ! Donc attention, n'oubliez jamais de "coller" les parenthèses et étant débutant de placer vos instructions en majuscules par exemple pour marquer une différence avec les variables (ce dernier point n'est évidemment pas recommandé dans un certain bouquin dont je ne me lasse pas de faire la publicité :-)).

UPPER

Permet de transformer une chaîne en majuscules. Les moyens pour transformer une chaîne en majuscules ne manquent pas :

/*INSTRUCTIONS DIVERSES EXEMPLE #29 */
Valeur = aria
SAY Valeur
Valeur = "Yoko Tsuno"
SAY UPPER(Valeur)
SAY majuscules

UPPER() ne sert à rien pour transformer des constantes mais peut être utile dans le cas d'une transformation d'une variable au sens propre du terme. Attention, avec la logique qui caractérise papa ARexx, inutile de s'acharner à transformer le UPPER en LOWER, car cette dernière fonction de passage en minuscules, n'existe tout simplement pas !

TRUNC

Cette instruction permet de retenir un certain nombre de décimales mais elle n'arrondit pas le résultat. Si le nombre de décimale n'est pas indiqué comme arguments, TRUNC() renvoie la partie entière.

/*INSTRUCTIONS DIVERSES EXEMPLE #30 */
pi = 3.141592
SAY PI
SAY TRUNC(PI)
i = 6
DO WHILE(TRUNC(pi,i) >3)
   i = i - 1
   SAY TRUNC(PI,I)
END

TRIM

Sans être raciste, cette instruction oublie les "blancs" en trop :

/*INSTRUCTIONS DIVERSES EXEMPLE #31 */
SAY " KOKO DE PETER "||straub
SAY TRIM(" KOKO DE PETER ")||straub

Mais attention, seuls les blancs à l'extrémité gauche de la chaîne font leurs valises. Pour supprimer n'importe quel espace, il faut utiliser une autre fonction (voir plus loin, à "COMPRESS").

TRANSLATE

/*INSTRUCTIONS DIVERSES EXEMPLE #32 */
SAY "Première possibilité :"
SAY TRANSLATE("en majuscules")
SAY "Deuxième possibilité :"
SAY TRANSLATE('aedcb','15432','abcde')

Cette fonction ordonne les données suivant une table de translation. 'aedcb' correspond à '15432' : 'a' == '1', 'd' == '4'...

'abcde' dicte l'ordre dans lequel on désire sortir la chaîne '15432' par rapport à la table 'aedcb' qui lui correspond. Si cela vous paraît un peu flou, exécuter l'exemple plusieurs fois en modifiant l'ordre de '15432'. La première possibilité correspond à UPPER().

TRACE

/*INSTRUCTIONS DIVERSES EXEMPLE #33 */
TRACE LABELS
DEPART:
i = 2
DO FOREVER
   SAY i UPPER("au carre =") i*i
   i = i*i
   IF i == 65536 THEN QUITTER()
END
QUITTER:
EXIT 0

L'instruction TRACE() permet de suivre pas a pas le déroulement du programme : on peut ainsi trouver à quel endroit le programme "boucle sans fin" par exemple. Remplacez "LABELS" par "ALL" ou "COMMANDS" ou "SCAN" ou "RESULTS" ou "ERRORS" ou "INTERMEDIATES" pour découvrir les différentes possibilités.

SYMBOL

/*INSTRUCTIONS DIVERSES EXEMPLE #34 */
SAY SYMBOL(SYMBOL)
SAY SYMBOL('1')
1 = 1
SAY SYMBOL('1')
1 = abcd
SAY SYMBOL('1')
1= a2b5cd
SAY SYMBOL('1')
SAY SYMBOL('ç')

Cette instruction retourne la valeur 'VAR' si vous testez une variable numérique ou alphabétique ou bien alphanumérique. Si la variable n'a pas encore été déclarée c'est la valeur 'LIT' qui est retournée (de même, si vous tentez de tester une fonction). Finalement si vous tentez de tester un nom qui ne peut devenir une variable/fonction, SYMBOL() renvoie la valeur 'BAD'. C'est ici le cas du caractère "ç".

STRIP

Cette instruction permet d'enlever les blancs à droite 'TRAILING' ou à gauche 'LEADING' ou à droite et gauche 'BOTH' d'une chaîne. TRIM() est l'équivalent de STRIP(CHAINE,'TRAILING').

/*INSTRUCTIONS DIVERSES EXEMPLE #35 */
SAY " KOKO DE PETER "||straub
SAY STRIP(" KOKO DE PETER ",'TRAILING')||straub
SAY STRIP(" KOKO DE PETER ",'LEADING')||straub
SAY STRIP(" KOKO DE PETER ",'BOTH')||straub
SAY STRIP(" KOKO DE PETER ",'LEADING','-')||straub

On peut indiquer quel caractère on désire supprimer en le rajoutant comme dernier argument. Par défaut, il s'agit bien entendu du blanc.

STORAGE

Vous désirez connaître la mémoire disponible de votre système ? Il suffisait de le demander : STORAGE() sans arguments. Et vous désirez remplir une zone mémoire ? Rien de plus simple mais attention en utilisant cette possibilité car l'Amiga est un système multitâche et il faut éviter tout débordement mémoire sous peine de Guru Meditation !

CHAINE = STORAGE(ADRESSE, CHAINE, LONGUEUR, VALEUR DE REMPLISSAGE)

Attention, 'ADRESSE' est une chaîne de caractères de 4 octets en hexadécimal. Par défaut, "la valeur de remplissage" est zéro. La chaîne de retour est l'ancien contenu de l'emplacement mémoire.

/*INSTRUCTIONS DIVERSES EXEMPLE #36 */
SAY "MEMOIRE EN MEGA OCTETS DE LIBRE :"
SAY STORAGE()/(1024*1024)
ANCIEN = STORAGE('0005 0000'x,'AMIGA-NEWS')
CALL STORAGE('0005 0000'x,ANCIEN)

Je place 'AMIGA-NEWS' en $50000 puis je replace l'ancien contenu. Cette instruction est à manipuler avec de multiples précautions !

SPACE

Encore une instruction pour gérer les "blancs". Elle spécifie le nombre d'espaces (par défaut) que vous désirez entre deux mots (mots séparés déjà par un espace cela va sans dire).

/*INSTRUCTIONS DIVERSES EXEMPLE #37 */
i = 0
DO FOR 14
SAY SPACE("LA LANCE DE JAMES HERBERT",i)
i = i + 1
END
SAY SPACE("LA LANCE DE JAMES HERBERT",i-1,'*')

SOURCELINE

Combien de lignes dans mon super programme ARexx ? Attendez je compte... Mais non ! Laissons ARexx nous donner la réponse :

/*INSTRUCTIONS DIVERSES EXEMPLE #38 */
SAY "NOMBRE TOTAL DE LIGNES :"
SAY SOURCELINE()
SAY "TEXTE DE LA PREMIERE LIGNE DE COMMENTAIRES :"
SAY SOURCELINE(1)

Un retour de chariot (NEW LINE,RETURN) est comptablisé comme une ligne. Les "lignes de commentaires" sont également des lignes. En indiquant le numéro de ligne entre parenthèses, SOURCELINE nous renvoie le texte source de cette ligne ! Le programme suivant se liste lui-même :

/*INSTRUCTIONS DIVERSES EXEMPLE #39 */
SAY D2C(12)||"'AUTO'LISTING :"
SAY "~~~~~~~~~~~~~~~~~~~~~"
nbligne = SOURCELINE()
i = 1
DO FOR nbligne
   SAY D2C(9)||SOURCELINE(i)
   i = i + 1
END

SHOW

SHOW(option,nom) nous permet d'examiner de plus près l'environnement disponible sous ARexx. 'Option' est soit 'CLIP' ou 'FILES' ou 'INTERNAL' ou 'LIBRARIES' ou 'PORTS'.

/*INSTRUCTIONS DIVERSES EXEMPLE #40 */
IF (~SHOW('LIBRARIES','rexxsupport.library')) then do
   SAY "La 'rexxsupport.library' n'est pas chargée !"
END

Le petit programme ci-dessus est très utile comme vous le constaterez plus loin pour déterminer si une "library" utilisatrice (qui apporte d'autres fonctions !) est disponible.

RANDU et RANDOM

La génération d'un nombre pseudo-aléatoire est en pratique en informatique. ARexx répond présent à cette possibilité. Pourquoi pseudo ? Parce qu'après "x" exécutions de l'instruction RANDU(), celle-ci finira par retomber sur ses pattes et par nous générer à nouveau la même série de nombres... Quelle est la période de RANDU() ? Aucune idée et ce n'est référencé nulle part... RANDU() génère un nombre aléatoire entre 0 et 1 tandis que RANDOM() permet d'obtenir un nombre entre une borne inférieure (1 minimum) et une supérieure (999 maximum) :

/*INSTRUCTIONS DIVERSES EXEMPLE #41 */
i = 1
DO FOR 10
   SAY "NOMBRE ALEATOIRE" i "=" TRUNC(RANDU()*1000)
   i = i + 1
END
i = 1
DO FOR 10
   SAY "NOMBRE ALEATOIRE" i "COMPRIS ENTRE 1 ET 10 =" RANDOM(1,10)
   i = i + 1
END

PRAGMA

PRAGMA(option,[valeur]) sollicite l'AmigaDOS pour certaines actions très spéciales.
  • AnciennePriorite = PRAGMA('priority',NouvellePriorite)
  • RepertoireActuel = PRAGMA('directory')
  • AncienneTaille = PRAGMA('STACKSIZE',TailleDeLaPile)
  • PRAGMA("WINDOWPTR",'NULL'): pour désactiver les messages en provenance de l'AmigaDOS.
  • PRAGMA('*','stdout'): redéfinit la sortie par défaut.
/*INSTRUCTIONS DIVERSES EXEMPLE #42 */
NouvellePriorite = 1
NouvelleTaille = 8192
AnciennePriorite = PRAGMA('priority',NouvellePriorite)
SAY "Ancienne priorité = " AnciennePriorite
SAY "Nouvelle priorité = " NouvellePriorite
RepertoireActuel = PRAGMA('directory')
SAY "Le répertoire actuel est " RepertoireActuel
AncienneTaille = PRAGMA('STACKSIZE',NouvelleTaille)
SAY "Ancienne taille de la pile = " AncienneTaille
SAY "Nouvelle taille de la pile =" NouvelleTaille

HASH

L'AmigaDOS utilise un moyen très particulier pour stocker les données sur disquette. D'après le nom du fichier, il calcule une valeur qui servira de déplacement dans un "secteur répertoire" pour retrouver le numéro du secteur qui correspond à ce fichier...

/*INSTRUCTIONS DIVERSES EXEMPLE #43 */
SAY HASH("s:")
SAY HASH("startup-sequence")

DATATYPE

/*INSTRUCTIONS DIVERSES EXEMPLE #44 */
var = 1
SAY DATATYPE(var)
var = A
SAY DATATYPE(var)
var = A1
SAY DATATYPE(var)

...retourne la valeur "CHAR" dans le cas d'une variable alphabétique ou alphanumérique et "NUM" si la variable est de type numérique.

COPIES / COMPRESS / CENTRE / ABBREV
  • COPIES(CHAINE,x) permet de recopier "x" fois une chaîne.
  • COMPRESS(CHAINE) évacue tous les blancs.
  • CENTRE(CHAINE,largeur) centre un texte par rapport à une largeur.
  • ABBREV(CHAINE,SOUS-CHAINE) si sous-chaîne est une abréviation alors ABBREV() renvoie 1 sinon 0.
/*INSTRUCTIONS DIVERSES EXEMPLE #45 */
SAY COPIES('AMIGA NEWS ',7)
SAY COMPRESS(' AMIGA   NEWS ')
SAY CENTRE('AMIGA NEWS',77)
SAY ABBREV('AMIGA NEWS','AMIGA')

ADDLIB et REMLIB

C'est ici que les Romains s'empoignèrent. Toutes les instructions présentées jusqu'à présent sont soit des instruction "internes" à ARexx (SAY) soit ce que l'on appelle des "build-in function", il s'agit des entrailles du système. Mais rares sont les programmeurs qui s'en contenteront. ADDLIB() permet d'ajouter de nouvelles fonctions au panel déjà large des 'build-in function'. La première bibliothèque qu'il est possible d'ajouter dès le départ est la "rexxsupport" qui est livrée avec le langage ARexx. Il existe des bibliothèques pour ARexx disponibles dans le DP et très intéressantes ! Mais nous découvrirons cela ensemble.

Usage : ADDLIB(Nom, priorité, PremierOffset, version). Le premier offset est pratiquement toujours "-30" (les offsets qui précèdent -30 sont occupés par des fonctions internes à chaque bibliothèques : Open() Close() Expunge()...). En plaçant '0' comme "version" ADDLIB() tentera d'ouvrir la bibliothèque disponible quelle que soit sa version. La priorité est fixée à zéro et ne s'emploie pas d'ailleurs pour les bibliothèques.

/*ADDLIB / REMLIB EXEMPLE #46 */
SupportName = 'rexxsupport.library'
IF(~(show('libraries',SupportName))) THEN DO
SAY 'Ajout de la' SupportName
IF (~ADDLIB(SupportName,0,-30,0)) THEN DO
   SAY "J'ai besoin de cette " SupportName 'dans votre Libs: !'
   EXIT 1
   END
END
REMLIB(SupportName)

ARG

Il s'agit de rechercher les paramètres CLI: (voir plus bas pour l'exemple).
  • NOMBRE = ARG() retourne le nombre de paramètres.
  • PARAM = ARG(1) retourne le premier paramètre.
Exemple récapitulatif

SHOWDIRO et STATEF() sont deux commandes de la "rexxsupport". La première permet d'afficher le contenu du répertoire spécifié et la deuxième de fournir des renseignements sur le fichier ou répertoire. Nous avons vu toutes les autres commandes et donc vous êtes en mesure de comprendre ce programme.

ARexx
ARexx


[Retour en haut] / [Retour aux articles] [Article précédent]