Passare a una funzione un numero imprecisato di argomenti

Da Gambas-it.org - Wikipedia.

Una funzione i cui argomenti sono in numero arbitrario si dice variadica.


Argomenti ovvero Parametri

Per poter passare un numero "imprecisato" di argomenti a una funzione occorre che la funzione faccia ricorso alla parola chiave '...'

 Private Sub Funzione(...)

Scritta così questa funzione o metodo accetterà un qualunque numero di argomenti di vario tipo.

Per fare in modo che la funzione possa leggere gli argomenti a lei passati e rispondere adeguatamente, Gambas ci mette a disposizione la classe statica Param

Con questa classe possiamo verificare i parametri passati attraverso la variabile vettoriale variant ottenuta attraverso Param.All e il numero di parametri attraverso Param.Count.

Invece per conoscerne il tipo ci avvarremo di TypeOf(variant[x])


Esempio pratico

Creeremo una funzione che sommerà tutti i numeri interi a lei passati:

 Public Sub Main()
 
   Print SommaInteri(1, 2, 3, 4, 5, 6, 7, 8, 9)
 
 End
 
 Private Function SommaInteri(...) As Long
 
   Dim aSomma As Variant = Param.All
   Dim iSomma As Long = 0
 
   For i As Integer = 0 To aSomma.Max
     If TypeOf(aSomma[i]) = 4 Then
       iSomma += aSomma[i]
     Else
       Print "#ERRORE: Tipo di dato non corrispondente"
       Return 0
     Endif
   Next
   Return iSomma
 
 End


Verifica del numero degli argomenti

Volendo applicare un ulteriore maggior controllo alla funzione potremo passare un primo dato che indichi alla funzione il numero degli argomenti passati:

 Public Sub Main()
 
   Print SommaInteri(5, 1, 2, 3, 4, 5)
 
 End
 
 Private Function SommaInteri(argomenti As Byte, ...) As Long
 
   Dim aSomma As Variant = Param.All
   Dim iSomma As Long = 0
 
   If Param.Count <> argomenti Then
     Print "#ERRORE: Numero di argomenti non corrispondente"
     Return 0
   Endif
   For i As Integer = 0 To aSomma.Max
     If TypeOf(aSomma[i]) = 4 Then
       iSomma += aSomma[i]
     Else
       Print "#ERRORE: Tipo di dato non corrispondente"
       Return 0
     Endif
   Next
   Return iSomma
 
 End