RPL: supprimer un élément d’une liste à 2 dimensions

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

Hello les RPLeux :geek:

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 :ugeek:).
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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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) :mrgreen:

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.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
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

Message par C.Ret »

Danny a écrit : 28 oct. 2021 09:29(Je parle de RPL pour HP 48G seulement :))
Ne parlant qu'un dialecte ancien et primitif du RPL, je m'était abstenu de toute suggestion...
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.
... mais en voyant la solution proposée, j'y reconnais une pratique fort répandue dans les codes et algorithmes sur HP-28C/S.

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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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 :geek: ).

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.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
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

Message par C.Ret »

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 ...
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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

Eh oui, c’était bien écrit dans le Reference Manual :geek: :

B06CF7D7-0945-4A7F-8513-C09B709C8B77.jpeg
B06CF7D7-0945-4A7F-8513-C09B709C8B77.jpeg (187.3 Kio) Vu 2829 fois
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
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

Message par C.Ret »

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é".
HP 00028-90114 page 178.gif
HP 00028-90114 page 178.gif (15 Kio) Vu 2825 fois
HP 00028-90114 page 179.gif
HP 00028-90114 page 179.gif (9.7 Kio) Vu 2825 fois
¹ : 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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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 ! :o

AF92BB68-AC5C-4237-B4DB-320A0B77E7DE.jpeg
AF92BB68-AC5C-4237-B4DB-320A0B77E7DE.jpeg (50.7 Kio) Vu 2823 fois
? Apple, Atari, Canon, Casio, ????????????, HP, Psion, Sharp, Tandy... même TI.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
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

Message par C.Ret »

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.
Avatar du membre
Danny
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1248
Enregistré le : 28 déc. 2013 16:34

Re: RPL: supprimer un élément d’une liste à 2 dimensions

Message par Danny »

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.
Répondre

Retourner vers « Tous les Pockets »