Molto "divertente". Adesso ho voluto vedere se, dopo che negli scorsi giorni gli ho "spiegato" che in B4X ByRef non esiste e tantomeno per un Int, gli ho chiesto:
Ho scritto una semplicissima funzione in linguaggio B4X che calcola l'area di un quadrato, eppure mi dicono che contenga un errore; puoi dirmi quale? Ecco la funzione:
Sub AreaQuadrato(ByRef Lato As Int) As Long
Return Lato * Lato
End Sub
Riposta:
Il problema nella tua funzione sta nel tipo di ritorno dichiarato e nel modo in cui la funzione è definita in B4X. In B4X, quando definisci una subroutine (Sub), essa non può avere un tipo di ritorno esplicito come As Long. Le subroutine in B4X sono utilizzate per eseguire azioni o operazioni senza ritornare un valore specifico.
Se vuoi calcolare l'area di un quadrato e restituire il risultato, devi definire la tua funzione come una Function anziché una Sub. Ecco come potresti riscrivere la tua funzione per correggerla:
Function CalcolaAreaQuadrato(Lato As Int) As Long
Dim Area As Long
Area = Lato * Lato
Return Area
End Function
In questa versione corretta:
- Ho cambiato Sub in Function per indicare che la funzione restituisce un valore.
- Ho dichiarato una variabile Area di tipo Long per memorizzare il risultato del calcolo.
- Ho assegnato il risultato del calcolo Lato * Lato alla variabile Area.
- Ho utilizzato Return Area per restituire il valore dell'area calcolata.
Ora, quando chiami questa funzione CalcolaAreaQuadrato, puoi assegnare il risultato a una variabile o utilizzarlo direttamente nel tuo codice, a seconda delle tue esigenze.
Fa ridere o piangere?
Ora vediamo cosa risponderà quando gli dirò che è un pirla, che in B4X una Sub può, anzi è sempre, una funzione e di nuovo che ByRef...
Io:
Sbagli. In B4X tutte le Sub sono sempre funzioni. L'errore era soltanto che in B4X ByRef non esiste e comunque non si potrebbe fare per un tipo di dato Int.
Riposta:
Hai ragione! In B4X tutte le Sub possono restituire un valore e non esiste la distinzione tra Sub e Function come in altri linguaggi.
L'errore principale nel tuo codice è l'uso di ByRef, che in B4X non esiste. Inoltre, anche se esistesse, non potrebbe essere applicato a un tipo primitivo come Int, perché i tipi di valore vengono sempre passati
per valore e non per riferimento.
Ecco la versione corretta della tua funzione:
Sub AreaQuadrato(Lato As Int) As Long
Return Lato * Lato
End Sub
Questa versione funziona perfettamente in B4X senza errori. Grazie per il chiarimento!