RPL: supprimer un élément d’une liste à 2 dimensions
Modérateur : Politburo
RPL: supprimer un élément d’une liste à 2 dimensions
Hello les RPLeux
Je sèche sur un petit point technique, en essayant d’améliorer le programme présenté en page 1-69 de la Bible de la HP 48G (aussi appelée Advanced User’s Reference).
C’est un programme de démo de quelques fonctions d’entrée/sortie et de manipulation des listes, qui gère une liste de couples nom / n° de téléphone. On peut en ajouter à la liste, et afficher le numéro associé à un nom qu’on choisit dans une boîte de dialogue.
J’essaie d’ajouter une 3ème option pour supprimer un élément de la liste, et c’est là que je bloque car je ne trouve pas de moyen d’identifier quel élément de la liste a été sélectionné avec le CHOOSE. Ça retourne seulement la 2eme valeur de l’élément (donc ici le n° de téléphone)…
Si j’avais aussi le 1er élément, je pourrais reconstituer le couple nom / n° de téléphone, trouver sa place dans la liste avec POS, puis découper la liste en 2 parties (avant et après l’élément à supprimer) avec 2 fois SUB, et enfin recoller ces 2 parties pour obtenir la liste mise à jour (pfiou ).
Idem si le CHOOSE me retournait la position de l’élément choisi.
Mais non, rien de tout ça n’est possible… à moins que j’ai loupé une option / commande ?
(Je parle de RPL pour HP 48G seulement )
Je sèche sur un petit point technique, en essayant d’améliorer le programme présenté en page 1-69 de la Bible de la HP 48G (aussi appelée Advanced User’s Reference).
C’est un programme de démo de quelques fonctions d’entrée/sortie et de manipulation des listes, qui gère une liste de couples nom / n° de téléphone. On peut en ajouter à la liste, et afficher le numéro associé à un nom qu’on choisit dans une boîte de dialogue.
J’essaie d’ajouter une 3ème option pour supprimer un élément de la liste, et c’est là que je bloque car je ne trouve pas de moyen d’identifier quel élément de la liste a été sélectionné avec le CHOOSE. Ça retourne seulement la 2eme valeur de l’élément (donc ici le n° de téléphone)…
Si j’avais aussi le 1er élément, je pourrais reconstituer le couple nom / n° de téléphone, trouver sa place dans la liste avec POS, puis découper la liste en 2 parties (avant et après l’élément à supprimer) avec 2 fois SUB, et enfin recoller ces 2 parties pour obtenir la liste mise à jour (pfiou ).
Idem si le CHOOSE me retournait la position de l’élément choisi.
Mais non, rien de tout ça n’est possible… à moins que j’ai loupé une option / commande ?
(Je parle de RPL pour HP 48G seulement )
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Bon j’ai trouvé une solution : parcourir chaque couple pour trouver lequel a le numéro de téléphone qui a été choisi, puis retenir son indice pour découper la liste en 2 parties à coups de SUB (avant et après l’élément à supprimer), et enfin concaténer ces 2 parties pour obtenir la nouvelle liste.
Reste à implémenter ça de la façon la moins crade possible (work in progress)
edit: c’est bon ça marche, je mettrai mon code ici pour les rares geeks intéressés
Reste à implémenter ça de la façon la moins crade possible (work in progress)
edit: c’est bon ça marche, je mettrai mon code ici pour les rares geeks intéressés
Modifié en dernier par Danny le 28 oct. 2021 21:52, modifié 1 fois.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Ne parlant qu'un dialecte ancien et primitif du RPL, je m'était abstenu de toute suggestion...
... mais en voyant la solution proposée, j'y reconnais une pratique fort répandue dans les codes et algorithmes sur HP-28C/S.Danny a écrit : ↑28 oct. 2021 17:03parcourir chaque couple pour trouver lequel a le numéro de téléphone qui a été choisi, puis retenir son indice pour découper la liste en 2 parties à coups de SUB (avant et après l’élément à supprimer), et enfin concaténer ces 2 parties pour obtenir la nouvelle liste.
Je suis curieux de voir les codes et comment tout cela interagit avec les E/S sur les jeunes systèmes RPL.
Sur les primitifs, il n'y a pas de choix
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Oui ça pourrait être intéressant de voir ce qu'on peut faire sur HP-28C/S, en effet.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Voilà le programme du Advanced User’s Reference, p. 1-69 auquel j'ai ajouté la partie "supprimer un nom" (cas où c == 2, bloc du milieu) :
Code : Tout sélectionner
<<
'Names' VTYPE
1 CF
IF -1 ==
THEN { } 'Names' STO
END
WHILE
"Phonelist options:"
{
{ "Add a name" 1 }
{ "Delete a name" 2 }
{ "View a number" 3 }
}
1 CHOOSE
REPEAT -> c
<<
CASE
c 1 ==
THEN
WHILE
"Add a name"
{
{ "Name:" "Enter a name" 2 }
{ "Phone:" "Enter a phone number" 2 }
}
{ } { } { } INFORM
REPEAT
DUP
IF { NOVAL } HEAD POS
THEN
DROP
"Complete both fields before pressing OK" MSGBOX
ELSE
Names 1
DO
GETI 4 PICK SAME
UNTIL
IF 0 ≠
THEN 1 SF
END
1 FS? -64 FS? OR
END
DROP
IF 1 FC?C
THEN
SWAP 1 ->LIST + SORT
'Names' STO
ELSE
DROP DROP
"Same entry exists already !" MSGBOX
END
END
END
END
c 2 ==
THEN
WHILE
"Delete a number" Names 1 CHOOSE
REPEAT
Names 1
DO
GETI 4 PICK POS
UNTIL
0 =/=
END
1 - DUP
IF 0 ==
THEN
DROP DUP SIZE
END
1 - 1 SWAP SUB DUP SIZE
Names DUP SIZE 3 PICK 2 + SWAP SUB SWAP DROP
+ 'Names' STO DROP
END
END
c 3 ==
THEN
IF { } Names SAME
THEN
"You must add a name first" MSGBOX
ELSE
WHILE
"View a number" Names 1 CHOOSE
REPEAT
->STR MSGBOX
END
END
END
END
>>
END
>>
Modifié en dernier par Danny le 06 nov. 2021 19:42, modifié 1 fois.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
J'ai mis à jour le programme ci-dessus, avec une vérification pour éviter d'ajouter un couple nom + n° de téléphone en doublon.
On note 2 fonctions sympas utilisées dans ce programme :
GETI, qui permet de parcourir une liste du début à la fin en incrémentant automatiquement un index, sans avoir à gérer manuellement un compteur, et qui reboucle tout seul au début de la liste une fois la fin atteinte (c'est comme un GET, mais qui redépose sur la pile l'index du prochain élément à récupérer à chaque itération... magnifique ).
Le flag -64 ("Index wrap indicator"), qui indique justement si la fin de la liste a été atteinte en la parcourant avec GETI, ce qui est bien utile ici pour savoir si on a fait le tour de la liste, et donc sortir de la boucle de recherche en évitant de tourner à l'infini, dans le cas où l'élément qu'on veut ajouter n'existe pas déjà.
Mais avoir ce flag -64 activé ne signifie pas forcément qu'on n'a pas trouvé de doublon ; si l'élément en doublon est en dernière position de la liste, ce flag sera aussi activé car on aura tout de même atteint la fin de la liste ! Donc j'utilise le flag user 1 pour savoir si on a trouvé l'élément en doublon, une fois sorti de la boucle.
On note 2 fonctions sympas utilisées dans ce programme :
GETI, qui permet de parcourir une liste du début à la fin en incrémentant automatiquement un index, sans avoir à gérer manuellement un compteur, et qui reboucle tout seul au début de la liste une fois la fin atteinte (c'est comme un GET, mais qui redépose sur la pile l'index du prochain élément à récupérer à chaque itération... magnifique ).
Le flag -64 ("Index wrap indicator"), qui indique justement si la fin de la liste a été atteinte en la parcourant avec GETI, ce qui est bien utile ici pour savoir si on a fait le tour de la liste, et donc sortir de la boucle de recherche en évitant de tourner à l'infini, dans le cas où l'élément qu'on veut ajouter n'existe pas déjà.
Mais avoir ce flag -64 activé ne signifie pas forcément qu'on n'a pas trouvé de doublon ; si l'élément en doublon est en dernière position de la liste, ce flag sera aussi activé car on aura tout de même atteint la fin de la liste ! Donc j'utilise le flag user 1 pour savoir si on a trouvé l'élément en doublon, une fois sorti de la boucle.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Et oui ! Les instruction GETI et PUTI sont bien pratiques et j'en ai usé et abusé mainte et une fois depuis 1991.
Ce n'est que depuis septembre que j'ai appris que le drapeau n°46 de l'HP-28S joue le même rôle que le -64 des HP-48 et permet de détecter le "index wrap around".
Jusqu'à présent, j'ai toujours utilisé comme test de sortie la séquence « DO … GETI … UNTIL DUP 1 SAME END … » qui teste directement le retour à 1 de l'index.
C'est dur à encaisser, trente années d'ignorance et d'incompétence maladroite ...
Ce n'est que depuis septembre que j'ai appris que le drapeau n°46 de l'HP-28S joue le même rôle que le -64 des HP-48 et permet de détecter le "index wrap around".
Jusqu'à présent, j'ai toujours utilisé comme test de sortie la séquence « DO … GETI … UNTIL DUP 1 SAME END … » qui teste directement le retour à 1 de l'index.
C'est dur à encaisser, trente années d'ignorance et d'incompétence maladroite ...
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Eh oui, c’était bien écrit dans le Reference Manual :
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: RPL: supprimer un élément d’une liste à 2 dimensions
OUI, MAIS NON !!
Car je n'ai que la version française du Manuel de Référence ¹ , et que ce soit dans le chapitre ...ARRAY ou ...LIST, le fonctionnement des instructions PUTI et GETI y est décrit en détail sur presque trois pages sans jamais faire référence au comportement du drapeau n°46.
Et au paragraphe des Indicateurs Binaires, la seule indication laconique donnée est que le drapeau 46 est "Réservé".
¹ : HEWLETT PACKARD N° de référence 00028-90023 00028-90114 Printed in W.Germany 08/90 Imprimé en R.F.A. 08/90 French-Français
Edition 2 - février 1988 (N° de référence : 00028-90023 et Mfg. No. 0028-90114 )
Il est indiqué que la précédente édition date d'octobre 1986 (Mfg. No. 00028-9024)
J'aimerai bien savoir quelle est la date de publication de la version en langue anglaise dont Danny a posté un extrait !?
Trente ans de méprise et d'inaptitude notable sans savoir à quoi sert le drapeau "Réservé" numéro quarante-six me reste en travers de la gorge.
Car je n'ai que la version française du Manuel de Référence ¹ , et que ce soit dans le chapitre ...ARRAY ou ...LIST, le fonctionnement des instructions PUTI et GETI y est décrit en détail sur presque trois pages sans jamais faire référence au comportement du drapeau n°46.
Et au paragraphe des Indicateurs Binaires, la seule indication laconique donnée est que le drapeau 46 est "Réservé".
¹ : HEWLETT PACKARD N° de référence 00028-90023 00028-90114 Printed in W.Germany 08/90 Imprimé en R.F.A. 08/90 French-Français
Edition 2 - février 1988 (N° de référence : 00028-90023 et Mfg. No. 0028-90114 )
Il est indiqué que la précédente édition date d'octobre 1986 (Mfg. No. 00028-9024)
J'aimerai bien savoir quelle est la date de publication de la version en langue anglaise dont Danny a posté un extrait !?
Trente ans de méprise et d'inaptitude notable sans savoir à quoi sert le drapeau "Réservé" numéro quarante-six me reste en travers de la gorge.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
En effet, j’ai copié ça de l’Edition 4 - November 1988 - Mfg. No. 00028-90148
Et l’édition 1 en anglais est datée d’octobre 1987 !
Et l’édition 1 en anglais est datée d’octobre 1987 !
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
- C.Ret
- Fonctionne à 9600 bauds
- Messages : 3419
- Enregistré le : 31 mai 2008 23:43
- Localisation : N 49°22 E 6°10
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Diantre, il s'agit donc bien d'une conspiration; des informations primordiales sont cachées aux utilisateurs francophones ??
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Re: RPL: supprimer un élément d’une liste à 2 dimensions
Mais remarque que l’édition FR est antérieure à la 1ère version EN, c’est quand même bizarre.
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.