PDA

Visualizza la versione completa : Parametri per copia e per riferimento


Tidus84
30-03-2008, 23:38
Salve colleghi!

Cortesemente qualcuno mi può spiegare cosa succede nei seguenti casi in generale:

1) IN per riferimento
2) IN per copia
3) OUT per riferimento
4) OUT per copia
5) IN-OUT per riferimento
6) IN-OUT per copia

e le eventuali conseguenze in un compilatore, cioè può restituire errori o meno...

Grazie anticipatamente... :)

MItaly
31-03-2008, 21:08
Linguaggio?

Tidus84
31-03-2008, 23:06
Originariamente inviato da MItaly
Linguaggio?

Un qualsiasi linguaggio... intendo in tipo generale...

MItaly
01-04-2008, 16:41
1) Alla funzione viene passato un puntatore al parametro che specifichi; qualunque modifica apportata quindi all'interno della funzione al parametro si ripercuote anche all'esterno della funzione.
2) Alla funzione viene passata una copia del parametro che specifichi; se il parametro viene modificato all'interno della funzione la modifica non si ripercuote all'esterno, visto che viene attuata ad una copia del parametro passato.
Se per OUT parli di parametri passati alla funzione in modo che essa ci memorizzi dei valori di ritorno, ci può essere solo per riferimento e funziona come il caso 1; se invece parli del valore restituito
3) La funzione restituisce un puntatore ai dati da restituire; questo metodo si può usare solo se i dati sono allocati nell'heap (nel qual caso il chiamante dovrà preoccuparsi di deallocarli - se non ci pensa già il linguaggio in automatico per lui) o sono variabili statiche; in nessun caso ha senso restituire puntatori a variabili locali della funzione, che sono allocate sullo stack e che cessano di esistere nel momento in cui la funzione ritorna.
4) La funzione restituisce una copia dei dati da restituire.
In generale il passaggio di parametri e la restituzione di un valore comunque avvengono ponendo i valori degli argomenti da passare sullo stack o in dei registri della CPU. Il caso 5 è analogo all'1, mentre il 6 mi pare piuttosto strano (nessun linguaggio che conosco lo usa), per cui non ti so dire nulla di preciso a proposito; al limite potrebbe avvenire passando alla funzione una copia del parametro e ricopiando la copia sull'originale al termine della funzione, ma non ha nessun senso, si fa molto prima con il passaggio per riferimento, a meno che non ci siano delle conversioni da effettuare "a metà strada" (qualcosa di simile ad esempio mi pare che accada in PInvoke quando si passa una stringa Unicode ad una funzione unmanaged ANSI: la stringa viene convertita in ANSI, viene passato un puntatore alla stringa temporanea alla funzione, quando la funzione ritorna si riconverte la stringa temporanea in Unicode e la si ricopia sul parametro originale).

Tidus84
02-04-2008, 00:08
Benissimo! Ti ringrazio... :)

MItaly
02-04-2008, 15:10
Di niente, ciao! :ciauz:

Loading