Ti Basic: Bug etrange dans un prog binaire :S
jmbslave
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
kilekon59 -
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 :
</ 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 !
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:
- Ti Basic: Bug etrange dans un prog binaire :S
- Microsoft 365 basic - Accueil - Microsoft Office
- Visual basic - Télécharger - Langages
- File renamer basic - Télécharger - Gestion de fichiers
- Visual basic editor - Télécharger - Langages
- Quick basic - Télécharger - Édition & Programmation
2 réponses
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 :
J'ai aussi été tenté d'utiliser une boucle afin de réduire le code sur l'éditeur on-calc...
Mais cette version est moins performante que la précedente !
Bref, j'espère que tu auras compris mes explications ;)
ChaMaxX
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