PDA

Visualizza la versione completa : [C++] Funzioni e spiegazione modalità passaggio di parametri


raven27
09-01-2011, 13:26
Ciao a tutti,
sono un principiante del c++, lo sto studiando per l'università, ma essendo non frequentante, ho parecchi problemi, tra cui un esame a breve :facepalm: .
Vado al punto:
in una funzione del genere:

#include <iostream>
using namespace std;
void test(int a, int& b)
{
a /= 2;
for (int k = 0; k < a; k++)
{
b *= 2;
}
}

void main()
{
int x = 4, y = 1;
test(x, y);
cout << x << " " << y << endl;

test(y, x);
cout << x << " " << y << endl;
}

Non capisco perchè il risultato è:

x = 4 y = 4
x = 16 y = 4

In pratica non capisco il procedimento. :confused:
Come già detto le basi minime le ho studiate,
ma non avendo frequentato il corso mi manca davvero tanto!!!
Mi scuso in anticipo se per voi è una domanda banale. :) :) :)

Ippo343
09-01-2011, 13:45
Il modo migliore per capire cosa fa è prendere un pezzo di carta ed eseguire a mano l'algoritmo. Ricorda che test(x,y) è diverso da test(y,x), dato che inverti l'ordine dei parametri.

Prova a farlo, poi se hai ancora problemi torni.

Alex'87
09-01-2011, 13:49
Originariamente inviato da raven27
Non capisco perchè il risultato è:

x = 4 y = 4
x = 16 y = 4

In pratica non capisco il procedimento. :confused:Conosci la differenza tra il passaggio di parametri per valore e per riferimento? Il succo dell'esercizio è tutto qui ;)

raven27
09-01-2011, 14:52
Dunque dalle dispense che sto studiando ho intuito che il problema
riguarda lo scambio di parametri, ma non capisco le definizioni: :dhò:

"nello scambio per valore la funzione chiamante passa alla funzione chiamata
i valori dei parametri attuali, non i parametri attuali"

"nello scambio per riferimento la funzione chiamante passa alla funzione chiamata
il riferimento dei parametri attuali".

nella riga
void test(int a, int& b)
cosa indica la &???, il tipo di passaggio del parametro???

e poi gli operatori /= *=
o anche ++ -- += -=

non ci crederete, ma non ho trovato ancora una spiegazione!!!
Vi assicuro che ci sto provando a risolvere da me, infatti, sono partito dal non sapere affatto usare visual studio, a scrivere semplici programmi con costrutti condizionali e iterativi, facili operazioni di calcolo...E tutto anche grazie a voi. :)

ma proprio questa parte non riesco a capirla :confused: :confused: :confused:

Alex'87
09-01-2011, 15:11
Originariamente inviato da raven27
"nello scambio per valore la funzione chiamante passa alla funzione chiamata
i valori dei parametri attuali, non i parametri attuali"Passaggio per valore: la funzione riceve una copia delle variabili passate. Questo significa che ogni modifica effettuata sui parametri non sarà visibile al di fuori della funzione.

Originariamente inviato da raven27
"nello scambio per riferimento la funzione chiamante passa alla funzione chiamata
il riferimento dei parametri attuali".Passaggio per riferimento: la funzione riceve un riferimento alle variabili passate. In pratica le evetuali modifiche a quelle variabili si rifletteranno anche al di fuori della funzione.


Originariamente inviato da raven27
nella riga
void test(int a, int& b)
cosa indica la &???, il tipo di passaggio del parametro???Indica che b viene passato per riferimento (a invece viene passato per valore).


Originariamente inviato da raven27 e poi gli operatori /= *=
o anche ++ -- += -=
non ci crederete, ma non ho trovato ancora una spiegazione!!!Su cosa stai studiando? Mi pare impossibile che tu non riesca a trovare il significato di questi operatori...

In breve:

x /= y è la forma abbreviata di x = x / y (e cosi via gli altri)
x++ sta per x = x +1

raven27
09-01-2011, 16:15
Ho studiato dalla dispensa che il prof ha messo in rete, solo che è molto superficiale, ad esempio elenca quasi tutti i termini e gli operatori fondamentali per la programmazione c++, ma non ne spiega il significato, probabilmente perchè è stato spiegato in laboratorio o a lezione.
Io ci sono arrivato o attraverso i forum o rifacendo gli esercizi che hanno svolto in lab.

Vi scrivo quello che ho capito finora, al massimo vi fate 2 risate :zizi: :zizi:
La funzione copia il valore di x e lo "inserisce" nella variabile A che viene divisa per 2.
ma siccome la variabile A è presa per valore il programma restituisce x=4

Poi esegue il ciclo di for per 2 volte pertanto il riferimento di y che viene "inserito" nella variabile B viene restituito con valore pari a 4.

Però non mi spiego i risultati che mi dà se inverto x e y :confused:

scusatemi ancora se ho scritto delle oscenità!!!

ShaleN
09-01-2011, 17:42
Originariamente inviato da raven27:
Però non mi spiego i risultati che mi dà se inverto x e y.


Ricordati che tra le due funzioni i valori non vengono resettati, quindi dopo la prima funzione x=4 e y=4.

Poi fai lo stesso ragionamento solo che la seconda volta che chiami la funzione a = valore di y, quindi a = 4 mentre b = riferimento di x, quindi b = 4. Tuttavia ogni modifica fatta su b si ripercuoterà su x.

:ciauz:

deleted_29
09-01-2011, 17:45
la risposta è più facile di quello che sembra (... anche se in realtà in logica proposizionale è mooooolto più difficile di quello che si può sospettare :mem: )

Vabbè la spiegazione-niubbo è questa:

quando passi una variabile ad una funzione (per valore)questa viene "sdoppiata", e può mantenere lo stesso nome, oppure no.

Quando nella definizione della funzione c'è scritto
(tipo nomevariabile,...) avrai una variabile nomevariabile del tutto INDIPENDENTE dal valore della variabile "padre".
Alla chiamata della funzione nomevariabile viene impostata al valore che passi alla funzione, poi "si sgancia".

Dimezzi la variabile "figlia" (dentro la funzione) fuori dalla funzione la variabile "padre" rimarrà identica.
----------
Il passaggio per "riferimento" è un modo per "incapsulare" i puntatori C; lo riconosci perchè c'è

(tipo & nomevariabile,...)

In questo caso nomevariabile è un [i]alias[/b] della variabile "padre".
Se dimezzi la variabile "figlia", anche la variabile "padre" sarà dimezzata

EDIT:

// a viene sempre lasciato invariato FUORI da questa funzione
// perchè è passata per valore (int a, manca l' &)
// quindi puoi paciugare il primo parametro quanto vuoi, ma FUORI
// non avrai effetti collaterali

// mentre il secondo parametro (b) viene passato per riferimento,
// (c'è la &), QUINDI le modifiche che farai al SECONDO PARAMETRO
// varranno anche fuori dalla funzione test

void test(int a, int& b)
{
a /= 2;
for (int k = 0; k < a; k++)
{
b *= 2;
}
}

void main()
{
int x = 4, y = 1;
test(x, y);
cout << x << " " << y << endl;

// nella prima chiamata il PRIMO PARAMETRO
// non viene modificato (è passato per valore)
// quindi x (primo parametro) prima e dopo la chiamata sarà identico
// ossia x=4 test() x=4
// il SECONDO parametro invece cambia anche FUORI
// y=1 test() y=4


test(y, x);
cout << x << " " << y << endl;

// bene, stesso discorso.
// solo che questa volta il PRIMO parametro (quello "fisso") è y
// y=4 test() y=4
// mentre il SECONDO parametro cambia
// x=4 test() x= 16
}



Riassumendo: il PRIMO PARAMETRO rimane invariato (fuori), il SECONDO viene paciugato.

Indipendentemente da come si chiamano fuori:
test(pippo,pluto) => pippo rimane uguale,e pluto cambia
test(x,y) => x rimane uguale, y cambia
test(y,x) => y rimane uguale, x cambia

test(x,x) COSA FA? (te lo lascio per esercizio!)

raven27
10-01-2011, 18:56
Ok ci sono!!! :)
grazie a tutti, non mi resta che fare parecchio esercizio!!!

con test(x,x)
i valori di ritorno saranno
x=16 y=1

perchè la variabile x viene presa sia per valore che per riferimento
e pertanto verrà modificata. :yuppi:

bubino91
10-01-2011, 22:42
@Raven72 per la prossima volta mi raccomando il codice tra i tag ma soprattutto formattato: è molto più comprensibile sebbene si tratti di programmi semplici!

Loading