L'instruction PRINT est en fait une FONCTION

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

Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

L'instruction PRINT est en fait une FONCTION

Message par charognard »

Qui a t'il de plus banal que l'instruction PRINT
Sur SHARP cependant elle a une subtilité interressante que je n'avais remarqué plus tôt.
La cause de cette non remarque est simplement que j'ai eu un 1212 puis un 1500 et enfin un 1245.
Les deux premiers sont dépourvus de cette fonctionnalité, quand au 1245, l'absence du mode DEF ne ma pas permi de la mettre en évidence.

Fonctionne donc sur SHARP 125X,126X, 13XX et 16XX et peut etre sur d'autre.

Commençont par simple

Code : Tout sélectionner

10 PRINT 123
puis run en mode RUN
Pas de surprise 123 s'affiche à l'écran, vu que l'on n'a pas mit dans le code WAIT 0, l'affichage persiste
si l'on appuis sur [ENTER] le programme se termine

Super me direz vous et ??

on tente un calcul en mode RUN
3*[Fleche Haute] !!!

étonnant le PRINT numérique est mémorisé dans le [ANS]

Nous refaisons RUN
123 apparait sur l'écran et là au lieu de faire [ENTER] nous frappons *7 [ENTER]
Pas de problème le SHARP exécute le calcul, etonnant non ?
un autre [ENTER] termine le programme.

Saisissont maintenant les programmes suivant

Code : Tout sélectionner

10"F" AREAD N
20 F=1
30 FOR I=2 TO N
40 F=F*N
50 N.I
60 PRINT F
70 END
100"A" AREAD N
110 PRINT N-2
120 END
On passe en RUN,
25
puis [DEF] A
apparition de 23 sur l'écran
[DEF] F
Le calcul de la factorielle de 23 s'exécute, étonnant non ?
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: L'instruction PRINT est en fait une FONCTION

Message par jxano »

Le code-machine d'évaluation des calculs est appelé à peu près partout. D'ici à ce que ce code contienne la mémorisation du résultat dans la mémoire ANS, on obtient cet effet de bord intéressant.
Modifié en dernier par jxano le 28 sept. 2011 12:36, modifié 1 fois.
Programmeur abscons.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: L'instruction PRINT est en fait une FONCTION

Message par C.Ret »

Contrairement à jxano, je ne pense pas qu'il s'agisse d'un effet de bords, ni d'un 'bug'. C'est tout à fait délibéré et fait partie du concept de ces Pockets qui sont en fait des calculatrices, programmables en BASIC, mais avant tout des calculatrices.

Et donc, quoi de plus naturel que de pouvoir continuer un calcul à partir du nombre à l'affichage. Qu'il s'agisse du résultat d'un PRINT ou du résultat d'un calcul précédant.

Même philosophie pour AREAD qui est capable de reprendre le dernier résultat, qu'il s'agisse d'un simple nombre saisi au clavier, du résultat d'un calcul ou le résultat affiché par un programme.

Notons que sur SHARP PC 1211 déjà, la fonction AREAD était capable de reprendre le nombre affiché par PRINT. Uniquement le dernier en fait en cas de PRINT A,B c'est uniquemetn B qui peut être repris. Mais on ne peut pas utiliser l'affichage issu d'un PRINT pour débuter un calcul. Dommage que cette fonctionalité ne soit pas présente sur les premiers SHARP.
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
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: L'instruction PRINT est en fait une FONCTION

Message par charognard »

Pareil que c.ret, je pense que le PRINT vers le ANS est un choix délibéré de SHARP.
Pour le INPUT par exemple ça ne le fait pas alors que l'évaluateur d'expression est utilisé

Code : Tout sélectionner

10 WAIT 0
20 INPUT A
30 PRINT A;
40 INPUT B
50 PRINT "ESSAI"
retourne A dans le ANS

Cette possibilité me semble quand même unique, non ?
Avatar du membre
pir2
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4647
Enregistré le : 31 oct. 2006 15:08
Localisation : 67310 Westhoffen
Contact :

Re: L'instruction PRINT est en fait une FONCTION

Message par pir2 »

Est-ce indiqué dans la doc?

Si oui, pas de doute possible, c'était délibéré, si non, je penche pour un effet de bord (peut être volontaire de la part des ingés qui ont développé le truc).

Comme je n'ai jamais épluché la partie calculatrice de mes docs, je ne sais pas.
Image
Image
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2934
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: L'instruction PRINT est en fait une FONCTION

Message par zpalm »

Dans le Mode d'Emploi du PC-1260-1261 on trouve ceci pour la commande AREAD (page 106):

2. Lorsque le contenu est affiché à l'aide du verbe PRINT au début de l'exécution
du programme, ce qui suit est enregistré en mémoire:

Code : Tout sélectionner

Exemple: lorsque le programme ci-dessous est exécuté:
10 "A": PRINT "ABC", "DEFG"
20 "S": AREAD A$: PRINT A$
Mode RUN
[DEF] [A] -> ABC DEFG
[DEF] [S] -> DEFG
• Lorsque l'écran affiche PRINT expression numérique, expression numérique,
expression numérique, expression numérique ou PRINT "chaînes de caractères",
"chaînes de caractères", le contenu affiché en dernier est enregistré en mémoire.

• Lorsque l'écran affiche PRINT expression numérique; expression numérique;
expression numérique ... , le contenu affiché en premier (à l'extrême gauche)
est enregistré en mémoire.

• Lorsque l'écran affiche PRINT "chaîne de caractères"; "chaînes de caractères";
chaînes de caractères" ... , le contenu de la "chaîne de caractères" désignée en
dernier (à l'extrême droite) est enregistré en mémoire.
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: L'instruction PRINT est en fait une FONCTION

Message par jxano »

Les effets de bord ne sont pas toujours des erreurs, on peut quelquefois s'en servir... Ici, en l'occurrence, on l'utilise pour enchaîner programmes et calculs.

Pour que la commande PRINT puisse être considérée comme une fonction, on devrait par exemple écrire « C=PRINT A,B » pour récupérer la valeur de B (la dernière écrite sur l'écran) dans C. Or, cette valeur est seulement placée dans un registre... pas toujours accessible. À part AREAD (qui suppose d'interrompre ou d'attendre la fin d'un programme pour en lancer un autre) ou un PEEK bien placé, existe-t-il un moyen de lire ANS au cours d'un programme ?
Programmeur abscons.
Avatar du membre
charognard
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4412
Enregistré le : 06 juin 2007 19:28
Localisation : Indre et loire
Contact :

Re: L'instruction PRINT est en fait une FONCTION

Message par charognard »

jxano a écrit :Pour que la commande PRINT puisse être considérée comme une fonction, on devrait par exemple écrire « C=PRINT A,B » pour récupérer la valeur de B (la dernière écrite sur l'écran) dans C. Or, cette valeur est seulement placée dans un registre...
Un registre soit ... c'est donc bien une fonction ;)

je voulais juste signaler cette découverte que je n'avais pas trouvée ni lue ailleur. et je trouve que cette possibilité est interressante (avec 25ans de retard il est vrai).
Sharp étend beaucoup de ses instructions/fonctions avec quelques subtilités (voulue ou non).
L'INPUT par exemple avec en cas de non réponse le saut de la ligne
Le FOR NEXT STEP-1 à 0 du PC1500 plus rapide .... et plein d'autre
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: L'instruction PRINT est en fait une FONCTION

Message par cgh »

jxano a écrit :À part AREAD (qui suppose d'interrompre ou d'attendre la fin d'un programme pour en lancer un autre) ou un PEEK bien placé, existe-t-il un moyen de lire ANS au cours d'un programme ?
Si la BASIC n'inclu pas la fonction ANS, cela va être difficile. Coté SHARP, je ne connais que le PC1500. Il y a une pile (de même que la pile RPN des HP) pour gérer les opérations en attente. De mémoire, dans le TRM, il s'appelle Xra. Or ce registre (8 octets) peut contenir soit une valeur (cas des valeurs numériques, arithmétiques ou &hexa) soit des pointeurs sur la dernière chaine de caractères manipulée (ex. MID$).
Si des PEEK "bien placés" pourront copier la valeur numérique, ce sera plus compliqué pour la chaine. Le buffer des chaines pouvant être utilisé pour d'autres choses, en dehors des opérations sur les chaines de caractères.
De plus, ces buffers et registres sont utilisés lors de chaque évalution de paramètres. C'est ce qui explique le coup du PRINT.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
cgh
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2143
Enregistré le : 30 août 2011 12:23
Localisation : Vous êtes ici -> .

Re: L'instruction PRINT est en fait une FONCTION

Message par cgh »

En fait, même avec des PEEK ou un CALL, cela ne marchera pas. Le dernier résultat sera effacé par la dernière valeur de l'argument évalué.
Il faut obligatoirement qu'il y ait une copie vers une zone protégée de la pile d'évaluation.
Mais cet "effet de bord" peut avoir des applications néanmoins intéressantes.
Il y a ceux qui voient les choses telles qu'elles sont et se demandent pourquoi, et il y a ceux qui imaginent les choses telles qu'elles pourraient être et se disent... pourquoi pas? - George Bernard Shaw
J'adore parler de rien, c'est le seul domaine où j'ai de vagues connaissances ! - Oscar Wilde
Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas que les choses sont difficiles. - Sénèque
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: L'instruction PRINT est en fait une FONCTION

Message par jxano »

zpalm a écrit :• Lorsque l'écran affiche PRINT expression numérique, expression numérique,
expression numérique, expression numérique ou PRINT "chaînes de caractères",
"chaînes de caractères", le contenu affiché en dernier est enregistré en mémoire.

• Lorsque l'écran affiche PRINT expression numérique; expression numérique;
expression numérique ... , le contenu affiché en premier (à l'extrême gauche)
est enregistré en mémoire.

• Lorsque l'écran affiche PRINT "chaîne de caractères"; "chaînes de caractères";
chaînes de caractères" ... , le contenu de la "chaîne de caractères" désignée en
dernier (à l'extrême droite) est enregistré en mémoire.
On ne peut pas dire que ce manuel a été relu avec le plus grand soin avant impression. La première clause suffit à décrire ce qui se passe en réalité, la seconde contredit la première et la troisième est redondante.
charognard a écrit :Un registre soit ... c'est donc bien une fonction ;)
Si tu veux... Je n'entends pas du tout le mot « fonction » ainsi. « Variable » et « registre » ne sont pas synonymes.
cgh a écrit :Si la BASIC n'inclu pas la fonction ANS, cela va être difficile.
Il y a d'autres mécanismes pour récupérer les valeurs, de toute façon.
Programmeur abscons.
Avatar du membre
zpalm
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2934
Enregistré le : 03 mai 2008 15:33
Localisation : Grenoble

Re: L'instruction PRINT est en fait une FONCTION

Message par zpalm »

jxano a écrit :On ne peut pas dire que ce manuel a été relu avec le plus grand soin avant impression. La première clause suffit à décrire ce qui se passe en réalité, la seconde contredit la première et la troisième est redondante.
Il y a une différence subtile entre la première et la deuxième clause: les séparateurs, virgule ou point-virgule. :wink:
jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2362
Enregistré le : 16 févr. 2008 23:34
Localisation : Paris 20ème

Re: L'instruction PRINT est en fait une FONCTION

Message par jxano »

D'accord, effectivement, vu comme ça... Mon opinion ne change pas, mais ce n'est plus pour la même raison !
Programmeur abscons.
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3421
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: L'instruction PRINT est en fait une FONCTION

Message par C.Ret »

zpalm a écrit :Dans le Mode d'Emploi du PC-1260-1261 on trouve ceci pour la commande AREAD (page 106):[...].
Je viens de vérifier, le manuel des SHARP PC-1211 explique aussi que AREAD permet de mettre en mémoire le résultat d'un calcul ou la valeur affichée par un PRINT.


Maintenant, je suis d'accord c'est un peu abusif d'appeler PRINT une fonction, surtout en BASIC, car dans ce language, et contrairement au C ou aux langages fonctionels ou opérationels, les fonctions existent et possèdent l'unique capacité d'être utilisées dans des expressions. C'est ce dernier point qui définit en BASIC le fait qu'un mot clef soit une fonction (comme SIN, COS TAN, ASN, ACS, ATN, LN, LOG, EXP, DMS, DEG, INT, ABS, SGN, LEFT$, MID$;RIGHT$, LEN, POS, FRE, ...) et non qu'elle 'retourne' une valeur. car contrairement au C, au RPL ou autre language, la notion de pile ou de valeur retorunée n'est pas explicite -tout au moins au niveau de l'utilisateur.

Donc, par exempe la ligne suivante s'exécute sans soucis:
10 LET X=R*SIN(A), Y=R*COS(A)

SIN et COS sont bien des 'fonctions BASIC'.

Par contre , on peut toujours essayer :
10 LET A=PRINT "B=";B


Donc PRINT n'est pas, en BASIC, une fonction; a mais je trouve l'idée du titre excellente : accrocheur, remet en question ses certitudes... surtout que l'on lit bien PRITN et pas SPRINTF !
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.
destroyedlolo
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1806
Enregistré le : 03 mai 2003 02:24
Localisation : Nonglard (Annecy)
Contact :

Re: L'instruction PRINT est en fait une FONCTION

Message par destroyedlolo »

cgh a écrit :En fait, même avec des PEEK ou un CALL, cela ne marchera pas.
Alors, d'apres me testes sur 1350 :
  • Le PEEK[/b bien utilise fonction :

    Code : Tout sélectionner

    10 " " POKE &6C30, PEEK&79A8, PEEK&79A9, PEEK&79AA, PEEK&79AB, PEEK&79AC, PEEK&79AD, PEEK&79AE, PEEK&79AF
    20 PRINT Z
    fonctionne. Apres un DEF+SPC, Z contient bien le resultat du dernier calcul ... mais il faut que le POKE contienne tout les PEEK sinon le resultat est corrompu.
  • CALL fonctionne dans tout les cas vu qu'il ne renvoie rien. Je n'ai pas essaye de lui passe un argument, peut etre que l'argument bouffe ANS - Pas teste
Mais y'a quelques chose d'encore plus marrant sur 1401/2 : sur cette machine, l'INPUT BUFFER et SCREEN BUFFER sont a la meme place. Avec un POKE bien place, il est parfaitement possible d'execute le dernier PRINT. Il faut cependant que l'utilisateur tape entree.

J'avais utilise cette possibilite pour creer des programmes auto-modifiable ou l'utilisateur pouvait saisir sa formule mathematique. Ensuite, je suis passe a l'assembleur et ca ne servait plus a rien :)

Bye

Lolo
Amiga, UNIX
Sharp, NetBSD http://destroyedlolo.info/
Apache, PHP 100 % dictionnary free
Vacances, Voyages 1 mispelling by word
Répondre

Retourner vers « Tous les Pockets »