Cet article couvre les bases de l'utilisation des Piles dans Small Basic, avec pour exemple une recherche récursive de tous les fichiers images jpg dans un dossier initial ainsi que ces sous-dossiers.

Qu'est-ce qu'une Pile ?

Une pile est une liste ordonnée dans laquelle les entrées sont ajoutées et retirées dans l'ordre du Dernier-Entré-Premier-Sorti. Le nom de "pile" vient du fait qu'on peut la voir comme une pile d'assiettes. Quand on ajoute une assiette, elle est placée en haut de la pile et quand on retire une assiette c'est la dernière ajoutée que l'on enlève.

Une pile est utile pour stocker des choses que l'on veut traiter au fur et à mesure que l'on déroule la pile, récupérant les éléments à traiter. Si nous connaissions a l'avance tous les éléments nous aurions juste à les placer dans un tableau.

Les Méthodes des Piles

Les Piles sont gérées par l'objet 'Stack', seules trois méthodes existent, elles sont :

  • count = Stack.GetCount(stackName) - retourne le nombre d'éléments présents dans la pile.
  • Stack.PushValue(stackName, value) - ajoute une valeur dans la pile (empile).
  • value = Stack.PopValue(stackName) - récupère une valeur et la retire de la pile (dépile).

Le nom de la pile (paramètre 'stackName') est une chaîne texte, qui est un texte entouré de guillemets, par exemple "ma_pile". Cette valeur peut être n'importe quelle variable Small Basic ou bien une valeur.

Exemple

Nous voulons créer un tableau avec tous les fichiers images jpg dans un dossier ainsi que ces sous-dossiers, recherchant dans tous les dossiers récusivement.

La première chose est de créer un tableau vide pour enregistrer les chemins des fichiers images ainsi que le nombre de fichiers (commençant par zéro). Nous allons également définir le dossier du début de la recherche et l'ajouter dans le pile nommée "folders" ('dossiers' en anglais). Dans cet exemple le dossier de la recherche et le dossier où se trouve le fichier source de notre programme Small Basic (Program.Directory).

images = ""
imageCount = 0
startFolder = Program.Directory
Stack.PushValue("folders",startFolder)

Ensuite nous allons continuer le traitement tant que nous avons des dossiers à vérifier, c'est à dire tant que la pile contient encore des dossiers. Nous utilisons une boucle While pour celà. Dans la boucle While nous allons traiter le dernier dossier ajouté, donc il sera dépiler en premier.

While Stack.GetCount("folders" ) > 0
   currentFolder = Stack.PopValue("folders")
  ' More work to do here
EndWhile

Maintenant nous voulons traiter ce dossier ; en premier lieu nous allons récupérer tous les sous-dossiers du dossier en cours et les empiler dans la pile pour être traités plus tard dans une des boucles.

   folders = File.GetDirectories(currentFolder)
   For i = 1 To Array.GetItemCount(folders)
    Stack.PushValue("folders",folders[i])
  EndFor

Une fois les sous-dossiers ajoutés pour un prochain traitement, nous allons chercher tous les fichiers dans le dossiers courant qui se terminent par ".jpg" dans le tableau. Nous commençons par par mettre le nom du fichier tout en minuscule afin de prendre en compte toutes les variantes de l'extension : jpg JPG etc.

   files = File.GetFiles(currentFolder)
   For i = 1 To Array.GetItemCount(files)
     fileName = files[i]
     fileNameLower = Text.ConvertToLowerCase(fileName)
     If (Text.EndsWith(fileNameLower,".jpg") ) Then
       imageCount = imageCount+1
      images[imageCount ] = fileName
    EndIf
  EndFor

Pour finir nous affichons le résultat, et voilà le résultat complet.

images = ""
imageCount = 0
startFolder = Program.Directory
Stack.PushValue("folders",startFolder)
 
While Stack.GetCount("folders" ) > 0
   currentFolder = Stack.PopValue("folders")
   folders = File.GetDirectories(currentFolder)
   For i = 1 To Array.GetItemCount(folders)
    Stack.PushValue("folders",folders[i])
  EndFor
   files = File.GetFiles(currentFolder)
   For i = 1 To Array.GetItemCount(files)
     fileName = files[i]
     fileNameLower = Text.ConvertToLowerCase(fileName)
     If (Text.EndsWith(fileNameLower,".jpg") ) Then
       imageCount = imageCount+1
      images[imageCount ] = fileName
    EndIf
  EndFor
EndWhile
 
For i = 1 To Array.GetItemCount(images)
  TextWindow.WriteLine(images[i])
EndFor

Autres Langues