Poster un nouveau sujet Poster une réponse
[BUG] DelVar End Lbl guillemet store
Auteur Message
linkakro



Autorisation : Membre
Nb de messages : 3767
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 10 Jui 2011, 22:41   Citer 

Certains connaissent déjà une astuce concernant les "DelVar"/"EffVar".
http://www.siteduzero.com/tutoriel-3-407895-optimisation.html#ss_part_5
C'est basé sur la juxtaposition de DelVar et d'une autre commande sans ":".
DelVar A1->B

De la même manière, on est tenté de placer des instructions sur une même ligne, même si cela demande de séparer avec ":" et parfois des ponctuations.
Par exemple
:If X:1->Y

Cela est obtenu aussi dans le cas d'étiquettes (label) Lbl.
Lbl A:99
99:Lbl A

Vous apprendrez que dans les deux cas des bugs peuvent survenir si on le fait avec des Labels, des End ou autres mots clés de boucles et alternatives sans faire attention.

Ces études débouchent à la même occasion sur une étude des procédés de scrutation de la TI.
On en distingue les Goto et les Boucles, et un problème général lié à la juxtaposition des commandes sur une ligne.


Etude du DelVar (EffVar)

La compression du Delvar:
Les DelVar peuvent être mis bout-à-bout entre eux et avec une fonction à la fin, sans retour à la ligne ni fin d'instruction ":".
Code
DelVar ADelVar BDelVar CDelVar DClrHome



Astuce présentée par Mdr1 :

On s'aperçoit que rassembler des DelVar et une action sur une seule ligne sous un If permet de se passer de Then/End.

Code
If A
DelVar ADelVar BDelVar CDelVar DDisp "A"  //si A=0 alors toutes ces fonctions sont ignorées



On vérifie avec
Code
If 0:DelVar ADisp1:Disp2  // affiche seulement 2



premier bug connu avec IF/DELVAR/END :
Manoeuvre pour créer le bug :
1-créez une alternative
2-mettez dedans la structure de Mdr1 avec un End

>>>> Le End n'est pas respecté, on atterrit n'importe où et on rencontre aussi des End considérés comme indéfinis


Code
If A
Then
 // ( Else )
...
DelVar ADelVar BDelVar CDelVar DEnd
      //le End n'est pas détecté si DelVar n'est pas executé
...   //ceci n'est pas lu non plus dans ce cas ! jusqu'au prochain End



Code
If A
Then
...
DelVar ADelVar BDelVar CDelVar DElse
      //le Else n'est pas détecté si DelVar n'est pas executé
...   //ceci n'est pas lu non plus dans ce cas !
End



situation générale

Ce qui est associé au DelVar dans une alternative ou une boucle non-executée n'est pas détecté.

Ainsi, lorsqu'un mot clé d'algorithmie quelconque est associé au DelVar et n'est pas détecté, toute l'algorithmie qui suit est perturbée.


Exemples : While, Repeat, For, End, Else, If

Exemple pour While
Code
If 0
Then
 DelVar AWhile 0    // PAS DETECTE
 End    // ON ATTERIT SUR CE END
End     // PLANTE : prouve que le while n'est pas détecté


Code
If 0
Then
 While 0
 DelVar AEnd        // PAS DETECTE
End     // ON ATTERIT SUR CE END



Explications (a posteriori)

En temps normal, lorsqu'une alternative ou une boucle est évitée, l'intérieur est quand même parcouru à la recherche des ":" et retours à la ligne, tout en respectant les chaînes de caractères qui peuvent contenir ":".
Chaque mot clé d'algorithmie est compté pour retrouver le bon Else/End quand on imbrique.

Mais DelVar n'est pas détecté par cette procédure, et ce qui suit collé derrière sans ":" est considéré comme dans la même instruction puisque le prochain retour est après. Ainsi la commande n'est pas executée.

Et quand on place un mot clé d'algorithmie (While, End, etc.), le compteur est perturbé, la suite du programme ne tient pas compte du mot clé manqué.


La mémorisation des boucles est abordée dans l'article sur les bugs de Goto.

--- quelques preuves

Le If seul.

Code
:If 0
:DelVar ADisp 1:Disp 2 // affiche 2


Code
:If 0
:Disp 1:Disp 2
// affiche 2

Le Else soumis à If/Then.
Code
:If 0
:Then
:Else:"A"
:Disp 1
:End
:If 0
:Then
:"A":Else
:Disp 2
:End
// affiche 1 et 2 donc tout marche

Le End soumis à If/Then.
Code
:If 1
:Then
:"A":End // donc marche
:End // erreur


Code
:If 0
:Then
:"A":End // donc marche
:End // erreur


Code
:If 0
:Then
:End:"A
:Disp 1
// affiche 1 donc End détecté

Le End soumis à Else.
Code
:If 1
:Then
:Else
:"A":End
:Disp 1
//affiche 1 donc End détecté


Code
:If 1
:Then
:Else
:End:"A
:Disp 1
//affiche 1 donc End détecté


Et on a les mêmes problèmes avec les boucles.
Voir l'exemple du chapitre sur les bugs généraux.
Autres exemples
Code
While 0
DelVar AEnd  // marche pas


Code
If 0
DelVar AWhile 1
End  // marche pas


et caetera

--- Remarque : incompatibilité chaîne/juxtaposition

Comme les ":" de juxtaposition des commandes ne sont pas reconnus comme séparateur dans les chaînes, cela prouve au moins que les guillemets sont détectés par la procédure de scrutation.

Code
If 0
Then
Disp 1
Output(1,1,"LOL:End   // End non détecté
Disp 2
Output(2,1,"XX":End  // End détecté  // la parenthèse est facultative, aussi...
Pause 3
End  //plante
Disp 4
 // programme affiche 1,2,3

Je prouve aussi que cela compte seulement les paires de guillemets. "Sto->" n'est pas respectée.
Code
If 0
Then
"abs(->Str1":End":End  // plante juste après le premier End donc il est appliqué
Disp 1
End
Disp 2


Code
If 0
Then
"abs(->Str1:End":End
Disp 1
End    // afiche 1 puis plante ici donc c'est le deuxième End qui marche
Disp 2

Cependant ce comportement de TI n'est pas parfait car on peut utiliser une syntaxe juste de chaînes de caractères et bugguer quand même.
Code
If 0
Then
"1->Str1:End:"2->Str2:End
Disp 1
End    // afiche 1 puis plante ici
Disp 2



Etude des LABELS Lbl

La scrutation des Lbl est faite toujours depuis le début, et le premier Label est utilisé.

Code
0->A
Goto 1
Disp 0
Lbl 1
Disp 1
Lbl 1
Disp 2

A+1->A
If A<2
Goto 1

// l'affichage est 1212, donc seul le premier Lbl 1 fonctionne
// qu'il soit avant ou après le Goto
// Cela montre que la scrutation est faite du début à la fin



Si un Lbl n'est pas au début d'une ligne, il n'est pas détecté.

Code
:Goto 1
:"A":Lbl 1  // rate
:Disp 1
:Lbl 1:"A"  // marche
:Disp 2
:Lbl 1      // sécurité (pour éviter une possible erreur label désagréable)
// affiche 2


Code
Menu("","",1,"",2):Lbl 1:Lbl 2  // les Lbl ratent
Disp 1
Lbl 1
Lbl 2
Disp 2
// affiche 2

Explications (a posteriori) :
Chaque fois que la TI recherche un Lbl, elle observe seulement le début de chaque ligne.
Les lignes sont délimitées par les retours à la ligne de la touche entrer. Les ":" ne comptent pas car ils délimitent les commandes pour l'execution et les alternatives.
La scrutation de Lbl est faite depuis le début du programme.


Conflit guillemet/Label/TI82 NON-stats

La TI82 non-stats (donc certainement ses prédécesseurs) ne détecte pas les Labels si la ligne au dessus ne ferme pas les guillemets, malgré le retour à la ligne.
D'habitude le retour à la ligne en TI-Basic dispense de fermer les syntaxes.

Voici ma première source dans la discussion du snake de Ratuss page 56.
http://tout82.free.fr/forum/sujet.php?message=52498#52498


Code
:Goto 0
:Text(1,2,"3   // Text(1,2,"3" // erreur à gauche, pas d'erreur à droite
:Lbl 0
:4


Code
:Goto 0 // pas d'erreur
:Text(1,2,"3
:
:Lbl 0
:4



===== fin

Le bug du delvar initial a été découvert par un débutant du forum et j'en ai trouvé l'explication avant de connaître le chapitre concerné du tutoriel du site-du-zéro.
edit: site-du-zéro=OpenClassrooms maintenant

edit 08/09/2014: le site tibd avertit contre deux cas d'abus de DelVar. (End ou Lbl) mais pas contre les autres (Else,For,While,Repeat), en tout cas pas à la date où j'écris ce paragraphe.
http://tibasicdev.wikidot.com/delvar


EDIT 08/08/2014 : ajout du chapitre guillemet/label/ti82.
EDIT 06/08/2014 : renommé depuis "[BUG] Astuce et contraintes de DelVar, End, Lbl" en "[BUG] DelVar End Lbl guillemet store"
EDIT 16/4/2013: tutoriel renommé depuis [BUG] L'astuce des "Delvar" et amélioré en ajoutant deux chapitres en fin (pour ajouter le Lbl et des expériences de tout)
EDIT 30/7/2013: réécriture des termes "instruction" pour "commande" et mention du Else dans le bug original
EDIT 26/9/2013: renommé depuis "[BUG] L'astuce des "Delvar" et la contrainte End/Lbl". Puis réécriture globale pour signaler l'interaction avec tous les mots clés d'algorithmie, au lieu de seulement End.
EDIT 12/11/2013 : séparation du constat et de l'explication du Label
EDIT 15/11/2013 : ajout d'une remarque sur l'incompatibilité des chaînes avec la juxtaposition par ":".
EDIT 31/12/2013 : ajout du commentaire sur la scrutation des Lbl.


----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
Poster un nouveau sujet Poster une réponse





  Powered by Fire-Soft-Board v1.0.10 © 2004 - 2024 Groupe FSB
Page générée en 9 requêtes
BlackOne par Grimmlink