Tableaux en OPL

Newton, Psion et autres Amstrad PDA600, ... Tous les grand-pères des assistants numériques sont là !

Modérateur : Politburo

Répondre
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Tableaux en OPL

Message par tyann »

Bonjour
En OPL les variables sont typées : entiers courts sur 2 octets,
longs sur 4 octets, réels et chaînes jusque 255 caractères.
On peut également créer des tableaux à une dimension de ces différents
types.
Les tableaux ne peuvent être transmis comme paramètres à une procédure.
Si on veut travailler avec un tableau dans une procédure, il faut lui passer
l'adresse du tableau avec ADDR.
Puis on pourra lire et écrire dans ce tableau avec PEEKx et POKEx, selon le type
de données.
Si on veut écrire une procédure permettant de travailler sur n'importe quel tableau,
il faut connaître : l'adresse du tableau, sa dimension et son type de données.
Pour ce qui est de la longueur, après quelques essais j'ai trouvé que :
pour les tableaux numériques PEEKW adresse-2 (2 octets) renvoie le nombre d'éléments du tableau;
pour les chaînes PEEKB adresse-1 (1 octets) renvoie la longueur des chaînes et PEEKW adresse-3 le nombre d'éléments.
Par contre je séche concernant le type de données, j'ai cherché dans mes docs : Programming psion computer et OPL Userguide
rien.
Si quelqu'un peut m'aider ?
A noter que pour l'instant je n'ai testé qu'en OPL16.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: Tableaux en OPL

Message par Marge »

Bonjour, Tyann,

Je commence à connaître un peu l'OPL, mais je suis encore bien loin de ton niveau.
Effectivement, il n'est rien dit à ce sujet dans les manuels que tu as mentionnés, mais j'ai trouvé ceci au sujet de l'OPL du PSION II :

Code : Tout sélectionner

17.2.8  ARRAYS


One dimensional arrays are supported for integers, floating  point  numbers
and  strings.   Multi-dimensional arrays can be easily simulated by the use
of integer arithmetic.

Like all other variables, arrays are held on the stack.   In  the  case  of
string  arrays  the  maximum string length is the first byte, the next word
contains the array size, this is followed by data.  So, for example,

                LOCAL A$(5,3),B%(2),C(3)
                A$(4)="AB"
                C(1)=12345

initially sets up memory as follows (from low memory to high memory):

High memory     00 00 00 00             ; 5st element of A$()
                00 00 00 00             ; 4nd element of A$()
                00 00 00 00             ; 3rd element of A$()
                00 00 00 00             ; 2th element of A$()
                00 00 00 00             ; 1th element of A$()
                00 05                   ; array size of A$()
                03                      ; max string length of A$()
                00 00                   ; 2st element of B%()
                00 00                   ; 1st element of B%()
                00 02                   ; array size of B%()
                00 00 00 00 00 00 00 00 ; 3rd element of C()
                00 00 00 00 00 00 00 00 ; 2nd element of C()
                00 00 00 00 00 00 00 00 ; 1st element of C()
Low memory      00 03                   ; array size of C()

After running the procedure it looks like:

High memory     00 00 00 00             ; 5th element of A$()
                02 41 42 00             ; 4th element of A$()
                00 00 00 00             ; 3rd element of A$()
                00 00 00 00             ; 2nd element of A$()
                00 00 00 00             ; 1st element of A$()
                00 05                   ; array size of A$()
                03                      ; max string length of A$()
                00 00                   ; 2st element of B%()
                00 00                   ; 1st element of B%()
                00 02                   ; array size of B%()
                00 00 00 00 00 00 00 00 ; 3rd element of C()
                00 00 00 00 00 00 00 00 ; 2nd element of C()
                00 00 00 50 34 12 04 00 ; 1st element of C()
Low memory      00 03                   ; array size of C()


The string and array limits are inserted into the variable space  after  it
has been zeroed.  This process is referred to as "fixing up" the variables.

Only available memory limits the size of arrays.
Ça vient de .

Je ne sais pas si ça peut t'aider... le sujet m'intéresse car je vais sans doute me coltiner ce problème dans ma programmation.
Cela dit, on peut sans doute utiliser une base de données à la place d'un tableau... :wink:
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 845
Enregistré le : 06 oct. 2012 14:37

Re: Tableaux en OPL

Message par tyann »

Salut Marge
Merci d'avoir prêté attention à mon poste.
A priori rien qui m'aide.
L'adresse obtenue par la fonction ADDR(tab()) correspond au 1er élément du
tableau, c'est pourquoi j'ai eu l'idée de regarder avant en mémoire adresse-1,adresse-2
pour voir si je trouvais un descripteur : nombre d'éléments, type de données.
Je pensais trouver une valeur qui indiquerai le type de données, cela doit bien être quelque part
peut-être ne suis je pas capable pour l'instant de la voir ou de l'interpréter ?
Je vais fouiller encore, après tout cela fait partie du charme de la programmation.
En ce qui me concerne le but est de créer des fonctions qui agissent sur les tableaux :
max, min, somme, etc... donc pas de base de données.
Pour ce qui est de mon niveau, je ne pense pas que le tien ai quelque chose à lui envier.
J'ai remarqué aussi qu'après le dernier élément du tableau, en mémoire on retrouve l'adresse du tableau.
Mais bon cela ne m'inspire rien de plus pour l'instant.
Au plaisir.
Ti(s) 60, 62 Galaxy, 66, 67 Galaxy, 68, 74 Basical 80, 81, 82, 83+, 83 CE, 84+SE, 85, 86, 89, 89 titanium, 92, 95 Procalc, v200, nSpire cx
Hp(s) 35s, 41CX, 28S, 48g, 50g, 39gII, Prime G1 et G2,
Casio(s) fx 602P, 702P, 4000P, 4500P, 6000G, 6900G, 7700G, 8500g, PB-700, CG-20, Graph 95 sd
Psion(s)II LZ64, siena, s3a, s3mx, s5mx.
Sharp(s) pc-1350, 1403, 1500A, E500, El 5120, 9200, 9600
Canon X-07
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5226
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: Tableaux en OPL

Message par bernouilli92 »

Le type du tableau doit être stocké ailleurs, certainement au même endroits où est stocké le nom de la variable.
Tu devrais passer en paramètre à ta procédure, à la fois l'adresse du tableau et le type de données qu'il contient.
HP, Casio, Sharp, Psion, quelques TI et divers autres
Répondre

Retourner vers « PDA »