Oppure

Loading
10/03/09 16:57
Inserendo questo codice molto semplice:
Dim ris As Integer

Private Sub Form_Load()
ris = 3
MsgBox "ris è uguale a " & ris, vbCritical
somma (ris)
MsgBox "ris è uguale a " & ris, vbCritical
End Sub

Private Sub somma(ByRef ris As Integer)
ris = ris + 4
MsgBox "ris è uguale a " & ris, vbCritical
End Sub

l'msg successivo alla chiamata della procedura dovrebbe restituire 7, essendo la variabile ris passata per indirizzo; invece mi mostra ancora 3.
Su tutte le guide di vb la sintassi che ho usata è quella giusta;
invece se nella dichiarazione della procedura metto byref attaccato al nome della variabile funziona correttamente e alla fine mi mostra 7.
Funziona correttamente dichiarando in questo modo la procedura somma:

Private Sub somma(ByRefris As Integer)
ris = ris + 4
MsgBox "ris è uguale a " & ris, vbCritical
End Sub
Qualcuno sa spiegarmi il motivo ed eventualmente se sbaglio qualcosa?
Grazie ancora
10/03/09 17:31
GrG
quando attacchi, vb la interpreta come nomrale variabile ossia la vede come "ciao as integer" è per questo che funziona... comunque prova con un ByVal il ByRef mi sembra servisse con gli array cioè con cose del tipo: ByRef i(2) as integer
aaa
10/03/09 17:43
Non penso centri l'argomento degli array poichè indipendentemente da quello,usando byval il valore del parametro attuale viene passato per valore e non per indirizzo.
Non capisco quale possa essere la causa.
Mettendo byrefris viene giusto poichè è come dici tu...la procedura lavora direttamente sulla variabile senza usare il parametro (poichè è byrefris e non esiste o meglio non lavora su questa).
Se cè qualcuno che sappia spiegarmi sono qui per ascoltare :)
grazie
Ultima modifica effettuata da 10/03/09 17:48
10/03/09 18:35
GrG
ho visto un'attimo meglio il codice...
allora se tu vedi ti da prima msgbox 3 ed è giusto poi richiama la funzione che ti da 7 e poi ritorna alla sub che chiama la msgbox dopo la somma ma ridà 3... è questo il problema? se si è facile... infatti se noti non hai dichiarato ris quindi diciamo è come se all'inizio della sub è sottointeso dim ris as integer... nella function hai fatto ByRef ris as integer i nomi delle 2 variabili coincidono ma è come fossero 2 cose diverse quindi la variabile ris della funzione è diversa dalla variabile ris della sub... per ovviare a questo problema scrivi fuori dalla sub una variabile pubblica dim ris2 as integer e poi modifichi solo il nome della variabile così:
Private Sub Form_Load()
ris2 = 3
MsgBox "ris2 è uguale a " & ris2, vbCritical
somma (ris2)
MsgBox "ris2 è uguale a " & ris2, vbCritical
End Sub

Private Sub somma(ByRef ris As Integer)
ris2 = ris + 4
MsgBox "ris2 è uguale a " & ris2, vbCritical
End Sub 
aaa
10/03/09 19:22
ah ora ho capito...grazie di tutto veramente.:k:
10/03/09 20:15
theprogrammer
Mi dispiace Grg, ma quello che hai detto, non ha molto senso e comunque non c'entra con il problema lamentato.

La corretta spiegazione e' che, se si scrive

somma (ris)

il VB non passa l'indirizzo della variabile alla funzione ma l'indirizzo dell'area temporanea creata per valutare l'espressione dato che sono state inserite delle parentesi.
Ovvero, con questo tipo di chiamata, le parentesi NON vengono usate per racchiudere gli argomenti. La chiamata corretta e'

somma ris

oppure

Call somma(ris)
aaa
10/03/09 20:23
GrG
theprogrammer quello che dici tu è correttissimo e non ne avevo tenuto conto... però il suo problema è che dopo aver richiamato la sub diciamo che il numero di partenza (3) rimane tale e non gli viene sommato 4...ho preso il codice iniziale postato nel 1° post e ho messo call somma(ris) però come prevedibile il problema rimane....percaso non ho capito quello che volevi dire? In questo caso spiegami...:)
aaa
10/03/09 21:33
theprogrammer
Postato originariamente da GrG:

theprogrammer quello che dici tu è correttissimo e non ne avevo tenuto conto... però il suo problema è che dopo aver richiamato la sub diciamo che il numero di partenza (3) rimane tale e non gli viene sommato 4...ho preso il codice iniziale postato nel 1° post e ho messo call somma(ris) però come prevedibile il problema rimane....percaso non ho capito quello che volevi dire? In questo caso spiegami...:)


No ... con il codice SENZA la call hai 3 messaggi con i valori

3
7
3

... se metti la call, ottieni

3
7
7

Ok?
aaa