Débogage sous CaRMetal

mercredi 28 octobre 2009
par  Alain BUSSER

Les outils de débogage (pause, points d’arrêt, mode pas-à-pas) ne servent pas seulement à déboguer. Ils peuvent servir à parcourir une boucle au rythme de l’utilisateur (l’élève : Peut aider à percevoir le fonctionnement de la boucle). On peut aisément les simuler dans des CarScripts.

Exemple

On voudrait par une boucle, calculer la somme des 10 premiers nombres entiers. Par exemple, en initialisant une somme avec la valeur zéro, puis en lui ajoutant la valeur courante de l’indice à chaque passage dans la boucle. Voici la version AlgoBox :

Version AlgoBox
Tester l'algorithme :


(cliquer sur le bouton ci-dessus pour lancer ou relancer l'exécution de l'algorithme)
Remarque : si les messages "Algorithme lancé" et "Algorithme terminé" n'apparaissent pas au bout d'un moment dans la zone ci-dessous, c'est que l'algorithme contient une erreur.

Résultats :

Code de l'algorithme :
1     VARIABLES
2       indice EST_DU_TYPE NOMBRE
3       somme EST_DU_TYPE NOMBRE
4     DEBUT_ALGORITHME
5       POUR indice ALLANT_DE 1 A 10
6         DEBUT_POUR
7         somme PREND_LA_VALEUR somme+indice
8         FIN_POUR
9       AFFICHER somme
10    FIN_ALGORITHME

Et maintenant la version JavaScript (sous CaRMetal) :

somme=0;
for(indice=1;indice<=10;indice=indice+1){
	somme=somme+indice;
}
Println(somme);

L’ennui c’est que beaucoup d’élèves réalisent que la boucle est parcourue 10 fois mais ne perçoivent pas bien ce qui se passe lors de chacun de ces 10 passages. Dans ce cas il est souhaitable

  1. qu’ils essayent avec le papier-crayon, de simuler le fonctionnement de la boucle, ce qu’ils seront de toute façon bien obligés de faire le jour du contrôle ;
  2. à défaut, qu’ils aient le temps de voir ce qui se passe à l’intérieur de la boucle.

Pour cela il faut un affichage des variables pertinentes, mais aussi un moyen de ralentir l’exécution du programme.


Affichage des variables

En plaçant l’instruction d’affichage « Println » à l’intérieur de la boucle, on peut visualiser son fonctionnement, surtout si on sait concaténer des chaînes de caractères :

somme=0;
for(indice=1;indice<=10;indice=indice+1){
	somme=somme+indice;
	Println("L'indice vaut "+indice+" et la somme vaut "+somme);
}

L’exécution de ce script ouvre une fenêtre d’affichage dans laquelle CaRMetal écrit presque instantanément ceci :

L’indice vaut 1 et la somme vaut 1
L’indice vaut 2 et la somme vaut 3
L’indice vaut 3 et la somme vaut 6
L’indice vaut 4 et la somme vaut 10
L’indice vaut 5 et la somme vaut 15
L’indice vaut 6 et la somme vaut 21
L’indice vaut 7 et la somme vaut 28
L’indice vaut 8 et la somme vaut 36
L’indice vaut 9 et la somme vaut 45
L’indice vaut 10 et la somme vaut 55

qui donne une vision synthétique et statique de l’exécution du programme. Une vision dynamique est préférable, car la boucle étant parcourue plusieurs fois, l’exécution revêt forcément un caractère dynamique (le temps est mesuré par la valeur de l’indice).


Affichage séquentiel dans la figure

D’une part, il est tout-à-fait possible de dessiner un tableau en CarScript, avec l’instruction « Expression » dont les deux dernières variables sont des coordonnées. Mais pour afficher séquentiellement des variables (pour voir comment elles varient dans le temps), il est plus simple de les utiliser comme alias de points : En créant deux points I (comme indice) et S (comme somme) et en ajoutant dans la boucle une instruction « Pause(1000) », les valeurs de I et S sont actualisées toutes les secondes :

somme=0;
for(indice=1;indice<=10;indice=indice+1){
	somme=somme+indice;
	SetAlias("I",indice);
	SetAlias("S",somme);
	Pause(1000);
}

Las ! On ne voit les valeurs de I et S qu’à la fin (10 et 55). La fonction « Pause » est donc plus utile avec des objets graphiques (mise à jour de coordonnées). Et de toute façon, si le temps d’attente est toujours le même, la méthode manque de souplesse, certains élèves ayant besoin de réfléchir plus longtemps que d’autres à ce qui se passe.


La meilleure façon de marcher, c’est de mettre un pied devant l’autre...

Alors on a besoin d’un mode pas-à-pas où l’exécution de la boucle s’arrête jusqu’à ce que l’utilisateur décide de la relancer. Pour ce faire, on a besoin d’un bouton « OK » à cliquer pour passer à la boucle suivante. En CarScript on peut faire ça avec l’instruction « Alert » mais aussi en créant un point qui s’appelle « OK » et qui ne sert qu’à être sélectionné. La figure ressemble à ceci :

Le script précédent est assez facile à modifier, il suffit de remplacer la ligne avec « Pause » par celle avec « InteractiveInput » :

somme=0;
for(indice=1;indice<=10;indice=indice+1){
	somme=somme+indice;
	SetAlias("I",indice);
	SetAlias("S",somme);
	v=InteractiveInput("Cliquer sur OK","Point");
}

Pour passer à la valeur suivante, l’utilisateur du programme n’a qu’à cliquer sur le point « OK » comme c’est demandé dans la barre qui est au bas de la fenêtre. En cours d’exécution (après avoir cliqué 6 fois sur « OK ») l’utilisateur voit ceci :

qui évoque un peu les programmes sous Scratch.

On est très proche de la perfection (un mode pas-à-pas facile à créer et fonctionnel). Cependant pour passer à la valeur suivante de l’indice, l’utilisateur peut cliquer sur n’importe quel point, pas nécessairement sur « OK ». Ce n’est d’ailleurs absolument pas gênant mais on peut quand même exiger que le point cliqué soit « OK » et pas un autre.


... et de recommencer

Il suffit pour cela d’initialiser (et de réinitialiser régulièrement) la variable v à une chaîne vide, et d’exiger que non seulement elle soit le nom d’un point sélectionné, mais aussi que ce nom soit « OK » :

var somme=0, v="";
for(indice=1;indice<=10;indice=indice+1){
	somme=somme+indice;
	SetAlias("I",indice);
	SetAlias("S",somme);
	while (v!="OK"){
		v=InteractiveInput("Cliquer sur OK","Point");
	}
	v="";
}

Commentaires