Sous programmes locaux

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
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Sous programmes locaux

Message par tyann »

Bonjour
Travaillant sur une application pour Hp prime, je me retrouve
dans une procédure ou un sous programme comme vous voulez
avec 3 ou 4 lignes de code qui se répètent plusieurs fois.
voici ces lignes :

Code : Tout sélectionner

xrf:=xdp;p:=%TOTAL(lp,xaf);
BLIT_P(G0,20,53,G2,xaf,0,xaf+300,115);
SLIDERH_P(G0,20,163,300,165,v,p,C_blanc,C_noir);
xrf, xdp, xaf, v et p sont des variables locales à la proc
BLIT_P et %TOTAL sont des instructions/fonctions intégrées
et SLIDERH_P est une proc écrite par moi.

L'idée est d'écrire un sous programme évitant la répétition de ces ligne.
Cela est envisageable pour les 2 dernières lignes, il suffira de transmettre
à la nouvelle proc xaf, v et p comme paramètres.
Ces deux lignes dessinent à l'écran et ne renvoient aucune valeur.
Pour la première ligne c'est beaucoup plus difficile, mais pas impossible
en effet il faut transmettre xdp,lp et xaf et faire que la procédure renvoie une liste
de 2 valeurs, puis réaffecter ces deux valeurs à p et xrf.
On se retrouverait donc avec une sous proc qui reçoit 5 paramètres et qui en renvoie 2 sous
forme de liste.
Cette sous proc ne servira qu'a une proc et je pense qu'au niveau lisibilité, compréhension
du code cela n'est pas vraiment terrible.
Je n'ai d'ailleurs même pas essayé, j'ai trouvé un moyen beaucoup plus simple de faire cela
en écrivant un vrai sous programme local.
Avez-vous une idée ? :wink:
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
Miskatonic91
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 477
Enregistré le : 27 août 2016 17:28
Localisation : Valdemarnie

Re: Sous programmes locaux

Message par Miskatonic91 »

Hello tyann, :D

Je ne connais pas assez la HP Prime pour t'aider directement, mais comme en ce moment je découvre la TI-92 et son basic structuré, il se trouve que j'utilise beaucoup les fonctions plutôt que les programmes et/ou les procédures.
Le propre d'une fonction est de renvoyer un résultat, et d'accepter éventuellement un ou plusieurs paramètres.
Ex: variable = fonction(paramètres).
Donc: pourquoi pas utiliser une fonction qui prend plusieurs paramètres et renvoie plusieurs résultats sous forme d'une liste? :wink:
Un peu de tout, mais toujours de bon goût :wink:
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: Sous programmes locaux

Message par tyann »

Salut
Le basic de la Prime ressemble beaucoup à celui de la 92
mais il est un peu plus souple, il n' y a pas de distinction
entre les programmes et les fonctions, un programme peut
renvoyer une valeur ou pas.
Donc: pourquoi pas utiliser une fonction qui prend plusieurs paramètres et renvoie plusieurs résultats sous forme d'une liste?
Comme je disais cela risque d'être assez indigeste, en fait le problème vient du fait
que ce sous programme doit modifier des variables locales.
Ceci dit la solution que j'ai trouvé, en fait je n'ai pas besoin d'aide, je lançais un petit
défi, peut parfaitement être mis en oeuvre en Ti basic sur la 92. :wink:
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
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: Sous programmes locaux

Message par tyann »

Bonjour
Personne ne semble s'intéresser à mon petit problème,
je vais vous donner quand même le procédé que j'ai utilisé,
car cela me semble pratique et assez souple.
Donc voici le code:

Code : Tout sélectionner

LOCAL sbr1:="xrf:=xdp;
             p:=CEILLING(%TOTAL(lp,xaf));
             BLIT_P(G0,20,53,G2,xaf,0,xaf+lpa,115);
             SLIDERH_P(G0,20,163,300,165,p,v,C_Blanc,C_Noir);";
J'ai donc dans la déclaration de mes variables locales, mis mon code
dans une variable locale sous forme de chaîne.
L'éditeur accepte que l'on définisse une chaîne sur plusieurs lignes, on peut donc
écrire le code de manière propre et lisible.
Maintenant pour utiliser ce sous programme local, il suffit d'écrire :

Code : Tout sélectionner

EXPR(sbr1);
à chaque fois que l'on a besoin de l'exécuter.

Autre possibilité, que j'ai testé et qui fonctionne, mettre plusieurs codes dans une liste
comme ceci :

Code : Tout sélectionner

LOCAL sbr:={ "code n°1",
             "code n°2",
             ...}
Là encore l'éditeur accepte la définition d'une liste sur plusieurs lignes.
On pourra donc ici simuler un ON var GOSUB en écrivant :

Code : Tout sélectionner

EXPR(sbr(var));
Une petite limitation tout de même, il n'est pas possible de mettre une
chaîne de caractère dans le code à cause des doubles guillemets.
Mais on peut contourner le problème en mettant la chaîne dans une variable locale.

Bonne programmation.
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
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2934
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: Sous programmes locaux

Message par zpalm »

Intéressante ton astuce !
Je n'avais pas bien compris ton problème, tu parlais d'un sous-programme local et ça ne me disais rien. Ta solution me rappelle plus une macro pour le preprocesseur en C.
Avatar du membre
tyann
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 846
Enregistré le : 06 oct. 2012 14:37

Re: Sous programmes locaux

Message par tyann »

Salut Zpalm
Merci pour ton attention.
Je parle de sous programme local dans le sens ou celui-ci
n'est utilisable que dans le programme où il est défini.

Code : Tout sélectionner

Prog1
BEGIN
LOCAL sbr1:="code"
...
...
END;
Prog2
BEGIN
...
...
END;
Ici par exemple, sbr1 ne sera pas utilisable dans prog2.
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
Répondre

Retourner vers « Tous les Pockets »