Ti Basic: Bug etrange dans un prog binaire :S

jmbslave Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
 kilekon59 -
Bonjour,

Je suis en train d'écrire un programme pour TI84+ en Ti Basic et j'ai un pb : Le programme se termine trop tot pourtant il est tres simple je comprends pas d'où ca vient :'(

D'abord une petite description du programme :
Nom : SAVEMAT
Logiciel : TI program editor

Le but du prog est d'enregistrer le contenu de la matrice [A] dans un PIC pour liberer la matrice dans le cas ou toutes les matrices sont utilisées. Question d'honneur, je ne veut pas utiliser d'autres méthode que celle là !

Pour cela, et c'est là que ca devient compliqué, les valeurs de [A] sont transformées en binaire et stockées en octet dans le PIC
Cela sous entend que :
pixel noir = 1
pixel blanc = 0
Les valeures de la matrices doivent etres inferieures a 255
le programme dessine la valeur sur une ligne de largeur 8 pix et passe a la ligne suivante pou la valeur suivante.

Mon programme actuellement ne veut ecrire que la premiere valeure de la matrice et apres il s'arrete !
Pour la premiere valeure les pixels dessinés correspondent a l'ecriture binaire de la valeur donc a priori c'est pas ca qui cloche...
Par exemple y'a 145 dans la matrice [A]
En pixel ca donne :
10001001
1+16+128 = 145 !

Bref voici le code :
0->C
0->D
0->E

ClrHome
Disp "- SAVE  MATRIX -            //intro
Disp " 
Disp "Effacer le graph             //securite graph
Disp "Actuel ?
Disp "1:Oui 0:Non
Input A

If A=1
Then
Goto A
Else
ClrHome
Disp "Enregistrez
Disp "le graph et
Disp "recommencez !
Stop
End



Lbl A
ClrDraw
ClrHome
Disp "Entrez les 
Disp "dimensions
Disp "de [A] (L,C)
Disp " 
Input X
Input W



For(A,1,X)               // verif si aucune valeure ne depasse 255
For(B,1,W)
If [A](A,B)>255
Then
ClrHome
Disp "Cette entree est
Disp "superieure a 255
Disp A
Disp B
Disp "Notez la !"
Pause
1->C
End
End
End


If C=1                          // arret du programme si valeur > 255
Then
ClrHome
Disp "valeurs > 255
Disp "....
Disp "Impossible de
Disp "Continuer ...
Stop
End

ClrHome
Disp "Start writing...       // dernier avertissement
Disp "Continue ?
Disp "1:Oui 0:Non
Input A

If A=1
Then
0
Else
ClrHome
Disp "Arret du prog
Disp "...
Stop
End

Disp "ok!"



                        //attention c'est la que ca devient chaud...
rappel des variables :
X : nbr de lignes de [A]
W :  nbr de coonnes de [A]

For(A,1,X)
For(B,1,W)
[A](A,B)->V

D+1->D            // D est l'ordonnée de la ligne où l'octet qui est écrite
                         // A chaque nouvelle valeur de [A] D est incrémentée
Lbl B 



If (V/128)>=1         //debut de la conversion en binaire de la valeure
Then
8->E
V-128->V
Goto Z
End

If (V/64)>=1
Then
7->E
V-64->V
Goto Z
End

If (V/32)>=1
Then
6->E
V-32->V
Goto Z
End

If (V/16)>=1
Then
5->E
V-16->V
Goto Z
End

If (V/8)>=1
Then
4->E
V-8->V
Goto Z
End

If (V/4)>=1
Then
3->E
V-4->V
Goto Z
End

If (V/2)>=1
Then
2->E
V-2->V
Goto Z
End

If (V/1)>=1
Then
1->E
V-1->V
Goto Z
End


Lbl Z                       // dans ce label on dessine le pixel
Pxl-On(D,E
If V>0
Then
Goto B
End

End                    // fin des deux For
End

</ fin du code>

Avis à tout les chevronnés du TI-Basic ! S--O--S !!!

N'hésitez pas a me demander plus de précisions sur le deroulement du programme !
A voir également:

2 réponses

ChaMaxX Messages postés 1 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

En tant qu'ancien "chevronné-amateur" du TI-Basic, je me suis penché sur ton programme.

En programmation, il est préférable de ne jamais utilisé de "If" dans une boucle,
et il est pratiquemment interdit d'utiliser des "Goto, Label" dans une boucle ! (et de manière général aussi).

Je vais tenter de t'expilquer pourquoi ton programme s'arrete trop tôt.

Commencons a l'endroit "//debut de la conversion en binaire" avec V=160,
- If (V/128)>=1 vrai, le programme attend un "End"
- 8->E
- V passe 32 (V-128->V)
- Goto Z ! c'est ici qu'il y a un problème, car le programme quitte le If sans passer par le End

- Affichage du Pxl en 1,8
- V > 0 (car V=32) donc Goto B

- If (V/32)>=1 vrai, le programme attend donc un deuxième "End"
- 6->E
- V passe a 0 (V-32->V)
- Goto Z on quitte encore le If sans passer par le "End" donc le programme se croit toujours dans 2 If successifs

- Affichage du Pxl en 1,6
- Pas de Goto B car V=0

!!!!!!!!!!!!!!!!
Maintenant le programme arrive au 2 "End" finaux.
En tout le programme attend 4 End : 2 pour les If qui ne sont pas terminés et 2 pour les boucles For.
Les 2 If sont donc interprétés comme des "End If" et non comme des "End For"
et comme il n'y a pas d'instructions après, le programme s'arrète.
!!!!!!!!!!!!!!!!

Pour corriger ça, il ne faut pas rajouter des End à la fin (non, non !) mais réécrire le programme de manière a ne pas utiliser de Label.
Je te propose cette solution :
0->C
0->D

//ta 1ère partie de programme ne pose pas de problèmes...

For(A,1,X)
For(B,1,W)
[A](A,B)->V

If (V/128)>=1      //conversion en binaire en un seul passage
Then
V-128->V
Pxl-On(D,7    //on évite les labels! (sinon disfonctionnements,ralentissements...) 
End

If (V/64)>=1
Then
V-64->V
Pxl-On(D,6
End

If (V/32)>=1
Then
V-32->V
Pxl-On(D,5
End

If (V/16)>=1
Then
V-16->V
Pxl-On(D,4
End

If (V/8)>=1
Then
V-8->V
Pxl-On(D,3
End

If (V/4)>=1
Then
V-4->V
Pxl-On(D,2
End

If (V/2)>=1
Then
V-2->V
Pxl-On(D,1
End

If (V/1)>=1
Then
V-1->V
Pxl-On(D,0
End

D+1->D   // on passe a la ligne d'affichage suivante
End      // fin du 1er For
End      // fin du 2eme For : Le programme n'attend plus de "End" ^^


J'ai aussi été tenté d'utiliser une boucle afin de réduire le code sur l'éditeur on-calc...
0->C
0->D
{1,2,4,8,16,32,64,128}->L1

//ta 1ère partie du programme

For(A,1,X)
For(B,1,W)
[A](A,B)->V

	For(Y,8,1,-1)
	    If (V/L1(Y))>=1
	    Then
	    V-L1(Y)->V
	    Pxl-On(D,Y-1
	    End
	End

D+1->D
End     // fin des deux For
End

Mais cette version est moins performante que la précedente !

Bref, j'espère que tu auras compris mes explications ;)

ChaMaxX
0
kilekon59
 
bonjour,je voudrai debuter la programmation sur ma TI-82 .Dois-je telecharger un truc spéciale ?si non ,ou pourrai-je apprendre le language basic?et comment realiser un programme et/ou une image sur TI-82?Si vous pouvez m 'apprendre j en serai ravi
merci
0