Autore Topic: [RISOLTO] passagio variabili tra sub  (Letto 835 volte)

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
[RISOLTO] passagio variabili tra sub
« il: 05 Maggio 2010, 22:44:39 »
Ciao a tutti. Grazie sin da ora per l'aiuto. Non riesco a capire perchè quando  passo una variabile ad una sub che le cambia il valore, quando torna alla prima sub la variabile assume il valore della prima sub.
PUBLIC SUB Form_Open()
  DIM a AS boolean
  
  a = true  
 
  Sub2(a)
  
END

PUBLIC SUB Sub2(a as boolean)

 a = true

END

risultato finale a = false

Grazie
« Ultima modifica: 16 Maggio 2010, 23:05:43 da doublemm »
Matteo DoubleMM Mion

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: passagio variabili tra sub
« Risposta #1 il: 05 Maggio 2010, 23:03:24 »
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

Codice: [Seleziona]

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



Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: passagio variabili tra sub
« Risposta #2 il: 05 Maggio 2010, 23:11:34 »
ho capito. Ma se lo stesso risultato lo voglio alla fine della sub1 e la sub2 dovesse essere in un altro modulo (la chiamo con altromodulo.sub2(a) come faccio?
Matteo DoubleMM Mion

Offline ealmuno

  • Maestro Gambero
  • ****
  • Post: 388
    • Mostra profilo
    • http://www.ealmuno.com
Re: passagio variabili tra sub
« Risposta #3 il: 06 Maggio 2010, 11:14:43 »
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è:
Codice: [Seleziona]
PUBLIC a AS boolean
PUBLIC SUB Form_Open()
  a = true
  Sub2()
END
PUBLIC SUB Sub2()
 a = true
END
il mio nuovo sito : ealmuno.com

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: passagio variabili tra sub
« Risposta #4 il: 06 Maggio 2010, 11:22:12 »
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:

Codice: [Seleziona]
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

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: passagio variabili tra sub
« Risposta #5 il: 06 Maggio 2010, 11:47:53 »
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.
Codice: [Seleziona]
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.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: passagio variabili tra sub
« Risposta #6 il: 06 Maggio 2010, 14:59:00 »
grazie tra un po provo poi vi so dire.
Matteo DoubleMM Mion