passaggio per riferimento

Messaggioda zerbo1000 » 04/07/2018, 11:18

ciao ragazzi

perchè in c++ se una funzione deve restituire più di un valore devo usare il passaggio per riferimento, e il passaggio
per valore non mi da il risulato atteso?

grazie
Una mente matematica cerca un fine, una mente artistica lo stabilisce.
zerbo1000
Senior Member
Senior Member
 
Messaggio: 593 di 1244
Iscritto il: 13/04/2015, 20:29

Re: passaggio per riferimento

Messaggioda Fabbioo » 04/07/2018, 13:39

Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore (avrai già sentito parlare del classico $return 0$).
Avendo questo limite, la soluzione consiste semplicemente nel non lavorare con delle variabili locali dichiarate nella funzione scritta, bensì lavorare con variabili passate alla funzione per riferimento.
In questo modo non si può dire che la funzione ritorni più valori, in quanto, come detto prima, può ritornare uno ed un solo valore, ma si vanno a modificare i valori delle variabili contenute nella funzione chiamante.
È ovvio che il passaggio per riferimento sortisce lo stesso effetto del return, ma è applicabile a più variabili.

Un esempio classico e semplice da capire è quello di calcolare il perimetro e l'area di un triangolo rettangolo sfruttando due funzioni: una, dichiarata void, che prende come parametri dal main (o da qualsiasi altra funzione chiamante) i valori immessi da tastiera dei due cateti e il valore del perimetro (per semplicità dichiarato float ed inizializzato a 0) e modifica il valore del perimetro per riferimento, l'altra dichiarata come float che prende i due lati e l'area (dichiarata float ed inizializzata a 0) e calcola l'area, restituendola poi con un semplice return.
Fabbioo
Junior Member
Junior Member
 
Messaggio: 160 di 346
Iscritto il: 02/11/2017, 14:07

Re: passaggio per riferimento

Messaggioda zerbo1000 » 04/07/2018, 15:00

Fabbioo ha scritto:Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore (avrai già sentito parlare del classico $return 0$).


:smt023 :smt023 :smt023 :smt023 :smt023 :smt023 :smt023
Una mente matematica cerca un fine, una mente artistica lo stabilisce.
zerbo1000
Senior Member
Senior Member
 
Messaggio: 594 di 1244
Iscritto il: 13/04/2015, 20:29

Re: passaggio per riferimento

Messaggioda Super Squirrel » 05/07/2018, 11:11

Aggiungerei che in alcuni casi la soluzione potrebbe essere l'utilizzo delle struct/classi.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 239 di 1486
Iscritto il: 16/05/2013, 22:05

Re: passaggio per riferimento

Messaggioda claudio86 » 06/07/2018, 08:03

Fabbioo ha scritto:Perché, per configurazione dello stesso c++, quando si sfrutta l'istruzione $return$ è possibile restituire uno ed un solo valore


Come nella quasi totalità dei linguaggi. La soluzione è restituire una tupla:

Codice:
#include <iostream>
#include <tuple>
#include <cmath>

double compute_area(
        double const a,
        double const b,
        double const c)
{
        auto s = (a + b + c) / 2;
        return std::sqrt(s * (s - a) * (s - b) * (s - c));
}

std::tuple<double, double> compute_area_and_perimeter(
        double const a,
        double const b,
        double const c)
{
        auto area = compute_area(a, b, c);
        auto perimeter = a + b + c;
        return std::make_tuple(area, perimeter);
}

int main()
{
        auto a = 3.0;
        auto b = 4.0;
        auto c = 5.0;
        auto [area, perimeter] = compute_area_and_perimeter(a, b, c);
        std::cout
                << "area: " << area << '\n'
                << "perimeter: " << perimeter << '\n';
}
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 487 di 1130
Iscritto il: 09/01/2011, 15:12


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite