CODINGBUG ★ COMMENT RETROUVER UNE ERREUR DANS UNE LIGNE DE DATAS ★

Comment retrouver une erreur dans une ligne de Datas
Les programmes les plus intéressants sont souvent écrits en langage machine, et les listings correspondants reproduits dans les revues comme des suites de DATAs...

Souvent, les programmeurs intègrent une “Checksum” (somme de contrôle) aux lignes en question, permettant de déceler une éventuelle erreur de saisie. Cette “checksum” ne permet pas toujours de retrouver une erreur...
Le cas le plus flagrant, où l'erreur n'apparaîtra pas, est lorsque deux données sont interverties sur la même ligne : résultat, la somme reste la même et il est impossible de délecter l'erreur autrement que par une lecture attentive du listing. Pour parer à cette éventualité, il faudrait faire un contrôle “lignes-colonnes” permettant décerner l'erreur.

Par contre, il arrive fréquemment que l'on tombe sur un message d'erreur assez laconique, du genre “Type mismatch error”, affectant la ligne où se trouve la boucle FOR-NEXT incluant le READ de lecture des DATAs. Dans ce cas, le programme est incapable de diagnostiquer une erreur, l'analyseur du BASIC étant bloqué avant lui. Ceci se produit essentiellement lorsque l'on cherche à lire une donnée qui ne correspond pas à la variable à laquelle on veut l'affecter. Supposons que nous ayons tapé le listing de la figure 1 .

On obtiendra un “Type mismatch in 20”. La première réaction consiste à dire : “Je n'ai pas d'erreur sur la ligne 20, c'est donc que ce programme est mal foutu !”... et de téléphoner ou d'écrire à la rédaction. Et pourtant, l'erreur est bien dans le listing si vous avez tapé celui-ci comme tel... Pour débusquer l'erreur, il suffit de faire PRINT D$. On obtient alors “g0” qui n'est pas une valeur hexadécimale... Pas étonnant que l'ordinateur la refuse : il est incapable de POKEr quelque chose qui ne soit pas une valeur numérique... De même, il serait incapable de POKEr une valeur supérieure à 255...

Dans notre cas, la recherche de l'erreur n'est pas difficile : Il y a très peu de lignes de DATAs et la valeur en cause sera vite découverte. Si l'on travaillait sur un long listing, il serait judicieux de procéder différemment. Après avoir noté la valeur erronée (par PRINT D$), il faut repérer la position du compteur de la boucle FOR-NEXT par un simple PRINT N (dans l'exemple évoqué). Ici, on obtient N = 30009. Il suffit de faire ? 30009 - 30000 (valeur de départ de la boucle) pour savoir que c'est la 10e (9 + 1) DATA qui est en cause. On retrouvera aisément cette DATA si le listing contient toujours le même nombre de données par ligne. Ici on a 6 données par lignes : notre “g0” doit se trouver sur la 2e ligne (2x6) de DATAs. La méthode est simple. Répétons-le, elle est “superflue” ici car le listing est court mais... s'il y avait 3 pages de DATAs on pourrait commencer à voir son intérêt !

Denis BONOMO , AMSTAR n°7

★ EDITEUR: AMSTAR
★ ANNÉE: 1987
★ AUTEUR: Denis BONOMO
 

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Bug , petit bug (CPC 464) (Microstrad)
» Coding » Reduction du Code Basic (Amstar&CPC)
» Coding » Le Son sur Amstrad
» Coding » A bug in the CPC464 (Computing with the Amstrad)
» Coding » Cours et initiation d'ANTIBUG
» Coding » Essai Compilateur Basic
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop
Page créée en 109 millisecondes et consultée 314 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.