il valore di a dipende da dove lo "misuri" ma soprattutto quando.
nel tuo esempio in entrambe le sub a è una variabile locale e quindi valida solo all' interno della sub stessa, quando la sub finisce a viene "eliminata" e torna torna per così dire ad un valore iniziale ovvero false per le variabili booleane
Public a as boolean
PUBLIC SUB Form_Open()
DIM a1 AS boolean
a1 = true
Sub2(a1)
END
PUBLIC SUB Sub2(a2 as boolean)
a =a2
END
risultato finale a = true alla fine della sub 2
se non erro così gli passi per valore, quindi crei una copia della variabile per quella sub, senza modificare il valore originale, prova a non passarglielo
cioè:
PUBLIC a AS boolean
PUBLIC SUB Form_Open()
a = true
Sub2()
END
PUBLIC SUB Sub2()
a = true
END
se non erro così gli passi per valore, quindi crei una copia della variabile per quella sub, senza modificare il valore originale...
E' giusto...passare una variabile per valore significa crearne una copia sulla quale si effettueranno le modifiche lasciando in alterata quella principale....il tipo di passaggio che modifica la variabile originale è quella per riferimento: ovvero tu passi alla funzione l'indirizzo di memoria in cui si trova la variabile e la stessa verrà modificata direttamente poichè la funzione si rivolgerà allo spazio di memoria e non al nome della variabile.
Tieni presente però che puoi benissimo modificare la variabile originale in questo modo:
PUBLIC FUNCTION Main()
DIM a AS INTEGER = 1
PRINT a ' stampa 1
a = Modifica(a) ' cambia valore a e lo riassocia
PRINT a ' stampa 3
END
PUBLIC FUNCTION Modifica(a as Integer) AS INTEGER
RETURN a = 3
END
Attenzione perché Gambas usa il passaggio di variabili un po' a modo suo. Solo con Gambas3 verrà introdotto il termine BYREF per specificare esplicitamente il passaggio per riferimento.
Gambas2, invece, adotta un passaggio MISTO.
Se le variabili sono di tipo semplice, il passaggio è per valore ed il metodo non modifica la variabile iniziale. Ma con i vettori il passaggio è per riferimento e viene modificato il vettore passato.
PUBLIC SUB Form_Open()
DIM i AS Integer[1]
i[0] = 1
Modifica(i)
PRINT i[0]
END
PUBLIC SUB Modifica(j AS Integer[])
j[0] += 1
END
Nel terminale verrà stampato 2.