Cet article part du principe que vous avez connaissance d'un article intitulé Small Basic: Comment Simuler des Paramètres. Veuillez lire cet article en premier.

Regardons à quoi ressemble une fonction VB qui utilise des variables locales. Voici une fonction VB appelée GetSum() qui retourne la somme des 10 premiers entiers positifs:

Function GetSum()
    i = 0
    sum = 0
    
    while i < 10
        i = i + 1
        sum = sum + i
    wend

    return sum
End Function

Quand une sous-routine similaire est créée en Small Basic, les variables i et sum deviennent globales, a la place de locales. Celà est dû au fait que Small Basic ne supporte pas actuellement les variables locales. Ce qui implique que si vous avez une autre sous-routine qui utiliser la variable i, elle va référencer la même variable.

Vous pouvez contourner le problème en faisant un nom de variable unique. Par exemple, au lieu de i et sum, nommez-les GetSum_i et GetSum_sum. Cela résout le problème avec de multiples fonctions utilisant le même nom de variable, mais ça ne fonctionne pas si certaines de ces fonctions sont appelées récursivement. Autrement dit, si GetSum() s'appelle elle-même. Ou appelle une autre fonction, qui à son tour finit par appeler de nouveau GetSum(). Ce type de réentrance et d'imbrication de fonctions n'est par rare.

Pour simuler les variables locales comme en VB, il est préférable d'enregistrer les valeurs d'une manière complètement différente, et les tableaux ("Array") du Small Basic sont très pratique pour cela.

Donc au lieu d'écrire le code comme:

i = 0

Vous devrez écrire le code suivant:

Array.SetValue( , "i", 0 )

La classe Array nécessite que vous spécifiez un nom de tableau (arrayname). Premièrement, nous savons que chaque fonction doit avoir ces propres variables locales,  donc son arrayname doit être à minima unique pour chaque fonction. Deuxièmement, nous savons que nous avons besoin, pour prendre en charge les imbrications qui ont lieues quand la fonction est appelée une seconde fois (récursivement), que le nom du tableau doit être différent. Donc, définissons que le nom du tableau sera "GetSum1" la première fois et "GetSum2" la seconde fois. Voici une méthode pour construire un nom de tableau de ce type:

Sub GetSum
  GetSum_Locals = GetSum_Locals + 1

  ' Expression du nom de tableau:
  Text.Append( "GetSum", GetSum_Locals)

  GetSum_Locals = GetSum_Locals - 1
EndSub

Donc la fonction avec seulement "i=0" dans le corps, doit ressembler à:

Sub GetSum
  GetSum_Locals = GetSum_Locals + 1

  ' i = 0  
  Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "i", 0 )

  GetSum_Locals = GetSum_Locals - 1
EndSub

L'instruction i=i+1 sera:

  Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "i", Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "i" ) + 1 )

Et la sous-routine GetSum entière donnera:
Sub GetSum
  GetSum_Locals = GetSum_Locals + 1

  ' i = 0  
  Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "i", 0 )
  
  ' sum = 0  
  Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "sum", 0 )
  
  ' while i < 10
  While Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "i" ) < 10

  '  i = i + 1
    Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "i", Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "i" ) + 1 )

  '  sum = sum + i
    Array.SetValue( Text.Append( "GetSum", GetSum_Locals), "sum", Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "sum" ) + Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "i" ) )

  EndWhile

  'Return Sum
  Stack.PushValue( "p", Array.GetValue( Text.Append( "GetSum", GetSum_Locals), "sum" ) )
  
  GetSum_Locals = GetSum_Locals - 1
EndSub

Et vous pouvez l'appeler ainsi:
GetSum()
TextWindow.WriteLine( Stack.PopValue( "p" ) )

Par Kenny Kasajian http://kasajian.com 

Autres Langues