3.4 Chasse aux bogues du labyrinthe, un jeu dont vous êtes le héros
Transcription
3.4 Chasse aux bogues du labyrinthe, un jeu dont vous êtes le héros
Chasse aux bogues du labyrinthe, un jeu dont vous êtes le héros 3.4 Chasse aux bogues du labyrinthe, un jeu dont vous êtes le héros On s’intéresse ici à réaliser un débogage d’un morceau de programme travaillant sur des labyrinthes. Notre programme travaille sur des fichiers texte au format ascii décrivant différents labyrinthes. Dans un soucis d’efficacité, les étudiants en charge de ce projet ont commencé par écrire une procédure permettant la visualisation d’un labyrinthe ainsi qu’une procédure de chargement et d’analyse d’un fichier d’entrée. Avant d’aller plus loin et de réaliser des fonctions plus complexes, nos étudiants décident de réaliser une première passe de correction de bogues. Cette étape leur permettra ainsi de disposer d’une base solide avant d’attaquer des fonctions plus complexes. Note: Il est possible de vous aider lors d’une étape de déboguage avec l’outil adatracex ( http://ada-tl1.googlecode.com/files/adatracex). Celui-ci s’utilise en ligne de commande de la manière suivante: adatracex fichier_executable arguments_fichier_executable. Le programme ’fichier_executable’ est alors lancé avec ses arguments comme avec un simple fichier_executable arguments_fichier_executable. Adatracex va néanmoins permettre que dans le cas où une exception provoque l’arrêt du programme, vous disposiez d’un nombre plus important d’informations : la totalité de la pile d’appels est alors affichée. Votre objectif consiste donc à déboguer le code Grenoble INP 1/3 with Ada.Text_Io; use Ada.Text_Io; with Ada.Command_line; use Ada.Command_Line; procedure Sortie is type Cellule is (entree, sortie, couloir, mur); type TableauCell is array (0..30, 0..30) of Cellule; type Labyrinthe is record Hauteur : Natural; Largeur : Natural; Tableau : TableauCell; end record; Laby : Labyrinthe; function Lecture_Labyrinthe(Nom_Fichier : String) return Labyrinthe is Fichier : File_Type; Ligne : String(1..30); Laby : Labyrinthe; Num_Ligne : Positive := 1; Lu : Natural; begin Open(Fichier, In_File, Nom_Fichier); while not End_Of_File(Fichier) loop Get_Line(Fichier, Ligne, Lu); for I in 0..Lu loop if Ligne(I) = 'E' then Laby.Tableau(Num_Ligne, I) := entree; elsif Ligne(I) = 'S' then Laby.Tableau(Num_Ligne, I) := sortie; elsif Ligne(I) = ' ' then Laby.Tableau(Num_Ligne, I) := couloir; elsif Ligne(I) = '#' then Laby.Tableau(Num_Ligne, I) := mur; end if; end loop; Num_Ligne := Num_Ligne + 1; end loop; Laby.Largeur := Lu; Laby.Hauteur := Num_Ligne; return Laby; end Lecture_Labyrinthe; procedure Afficher_Labyrinthe(Laby : Labyrinthe) is begin for I in 0 .. Laby.Largeur loop for J in 0 .. Laby.Hauteur loop case Laby.Tableau(I, J) is when entree => Put('E'); when sortie => Put('S'); when mur => Put('#'); when others => Put(' '); end case; end loop; New_Line; end loop; end Afficher_Labyrinthe; begin for Arg in 1..Argument_Count loop Laby := Lecture_Labyrinthe("/home/perms/wagnerf/" & Argument(Arg)); --Calculer_Chemin Afficher_Labyrinthe(Laby); New_Line; end loop; end Sortie; Grenoble INP 2/3 Téléchargement de ce fichier Une part de la difficulté de cet exercice vient du fait que c’est à vous de trouver des exemples de fichiers déclenchant les bugs. Il vous est donc demandé, en plus du déboguage, d’écrire des fichiers de tests permettant de vérifier le bon fonctionnement du programme sur différentes configurations. Les fichiers d’entrée sont au format ASCII. Les caractères autorisés sont ’E’, ’S’, ’ ’ et ’#’ où ’E’ désigne l’entrée du labyrinthe, ’S’ la sortie, ’#’ un mur et ’ ’ un morceau de couloir. On peut ainsi imaginer le fichier suivant: ####### #E## S# # ## ####### Chaque ligne d’une entrée contient une ligne du labyrinthe. Toutes les lignes ont une taille inférieure ou égale à 30 caractères. Il est nécessaire d’avoir une entrée et une sortie, et il ne peut y en avoir qu’une de chaque. L’affichage d’un labyrinthe contenu dans un fichier ’laby.txt’ est réalisé par un appel à ./sortie laby.txt. 1. Déboguez le programme fourni et écrivez une base de tests la plus complète possible. 2. Une fois terminé le débogage, téléchargez la base de tests testslaby.tgz. Pour chaque test, vérifiez que votre programme fonctionne ou que le fichier d’entrée est invalide (deux fichiers parmi ceux fournis ne respectent pas le format d’entrée). Avez-vous été capable d’éviter tous les problèmes ? Quelles sont les erreurs dans les fichiers invalides ? Grenoble INP 3/3