Newsgroup: it.comp.appl.access
Titolo: Domanda sul passare variabili per indirizzo o per valore

Guardate  la semplice Sub f in fondo e (gentilmente) seguitemi
nel breve ragionamento che segue :
 
Se faccio 
 
dim x as string
x = "ciccio"
f x 
 
ottengo  la  x  trasformata  dalla f  definita   sotto
perche' gli passo l' indirizzo in ram della  variabile
x, cosicche' la f() lavora proprio con la variabile x.
E va bene.
 
Se invece faccio 
f "ciccio" 
in effetti *esattamente* che diavolo gli passo alla f ? 
 
Ossia in questo caso la f, in teoria, non dovrebbe funzionare
(dovrebbe  dare  errore)  perche'  s'  aspetta  un  indirizzo 
e invece gl' arriva una stringa. 
 
Addirittura gia' in fase di compilazione, in teoria, si 
dovrebbe verificare un errore.
 
Invece (anche se ovviamente non modifica la x) la f funziona
e non si verifica nessun errore. Certo, il valore manipolato
viene perso.
 
Ne dovrei dedurre che anche quando faccio f "ciccio" il compilatore
produce un' altra variabile (temporanea ?) avente un certo indirizzo
e gia' impostata al valore "ciccio". 
 
O no ? 
 
sub f(byref x as string) 
   ' manipolo la stringa x
   ' ...
end sub
 
 


Mai sentito parlare di "stack"?
Quando passi per valore cio' che passi viene copiato e poi ceduto alla 
funzione. Fatto sta che quando passi per valore se tu modifichi tale 
valore non lo trovi modificato alla uscita della funzione,
Se tu passi per riferimento (tutti gli oggetti vengono passati cosi') 
alla funzione viene ceduto, appunto, l'indirizzo originale. In questo 
caso, se modifichi, te lo trovi modificato anche dopo l'uscita dalla 
funzione.
 
-- 
ac (x=y-1)
Aborro il Killfile
(La violenza e' l'ultimo rifugio degli incapaci -Salvor Hardin-)
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
http://www.avast.com
 
 


Intanto grazie per la risposta. 
 
Sissi certo conosco lo stack ecc ecc : non l' ho citato esplicitamente
perche' anch' esso non e' altro che un insieme di indirizzi in ram, in
fin dei conti (Ok : a parte ottimizzazioni nella cachs, cash ... o come
cavolo si  scrive  non mi viene adesso. Cmq la cash sempre una zona di 
memoria e', gira che ti rigira)
 
Pero' scusa ... ripeto  la  domanda : se  la  funzione s' aspetta  un 
riferimento (un indirizzo) e tu invece gli passi la stringa  "ciccio"
la funzione funziona ugualmente (ma non modifica il valore all' uscita
quello e ovvio) 
 
Dico : perche' funziona lo stesso ? 
 
 
 
 


si scrive cache
 
Magari il sistema capisce che sei un po' "naive" e se ne frega che tu 
gli dica byref?
Oppure lui si fa la copia e visto che gli hai detto byref poi ti passa 
l'indirizzo alla copia (la "stringa" fissa lui da qualche parte deve 
pure scriverla/memorizzarla)?
In tutti e due i casi vince lui e tu non vai al manicomio.
Come invece succede ad alcuni (non il tuo caso) a cui, seppure cerchi di 
spiegarlo, ancora si chiedono perche' il sistema modifica gli oggetti 
passati alla funzione o quelli  che ... trattano recordsetclone e 
recordset.clone come se fosse la stessa cosa.


 pure scriverla/memorizzarla)?
 
Si ... anche.
E' che mi sarebbe piaciuto capire bene come funziona internamente.
Tutto qua.