Funzione che restituisce 2 valori

di il
6 risposte

Funzione che restituisce 2 valori

Salve, devo fare una funzione che restituisca area e perimetro di una circonferenza.
Ho scritto in questo modo, e tutto mi pare funzioni
#include <iostream>
#include <cmath>
using namespace std;

void cerchi(float raggio, float*cfr, float*area);

int main()
{
    float area=0;
    float cfr=0;
    float raggio=5;

    cerchi(raggio,&cfr,&area);

    cout<<area<<endl;
    cout<<cfr;

    return 0;
}

void cerchi(float raggio, float*cfr, float*area)
{
    *area=M_PI*raggio*raggio;
    *cfr=2*M_PI*raggio;
}
Vorrei fare restituire un array in cui nelle prime due posiziono metto area e circonferenza ma sono un po' in difficoltà.
E' possibile fare questo? Credo di si ma non riesco.
Ho scritto questo prototipo
float*cerchiArray(float raggio, float*cfr, float*area);
ma non capisco bene come implementarla
ho immaginato di dover creare un array cosi
float*v=malloc(2*int);
e qui mi blocco.
Grazie se mi date una mano

6 Risposte

  • Re: Funzione che restituisce 2 valori

    Ma è C (vedi passaggio per puntatore alle funzioni e malloc) o C++ (vedi #include <iostream> e cout) ?

    Se si tratta di C++ tanto vale passare gli argomenti cfr e area per riferimento.
    Ah in C++ si utilizza new/delete e non malloc/free.
    Vorrei fare restituire un array in cui nelle prime due posiziono metto area e circonferenza ma sono un po' in difficoltà.
    E' possibile fare questo? Credo di si ma non riesco.
    Ovviamente si può fare e, considerando che un array viene individuato da un puntatore al suo primo elemento, verrebbe qualcosa del genere:
    #include <iostream>
    
    using namespace std;
    
    const double PI = 3.14;
    
    double* cerchi(float raggio)
    {
        double *v = new double[2];
        v[0] = PI * raggio * raggio;
        v[1] = 2 * PI * raggio;
        return v;
    }
    
    int main()
    {
        float raggio = 5;
        double *v = cerchi(raggio);
        cout << v[0] << endl << v[1];
        delete[] v;
    }
    ma sinceramente non ne vedo l'utilità. Se si tratta di un esercizio fine a se stesso ok, altrimenti meglio passare le due variabili per riferimento o al massimo impostare la funzione come void e mettere l'array come argomento.
  • Re: Funzione che restituisce 2 valori

    Un'alternativa potrebbe essere anche definire una struttura di tipo Cerchio e "inglobare" in essa le caratteristiche della figura. Tipo...
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    struct Cerchio{
        float raggio;
        float area;
        float circonferenza;
    };
    
    Cerchio cerchi(float r) {
        Cerchio c;
    
        c.raggio        = r;
        c.area          = ((float)M_PI)*r*r;
        c.circonferenza = 2*((float)M_PI)*r;
    
        return c;
    }
    
    int main() {
        Cerchio c = cerchi(5);
    
        cout<<c.area<<endl;
        cout<<c.circonferenza;
    
        return 0;
    }
  • Re: Funzione che restituisce 2 valori

    Se sei in C++ potresti anche creare una classe anziché una struttura e "inglobarci" la funzione che, dato il raggio, calcola "implicitamente" area e circonferenza nel momento stesso della creazione dell'oggetto.
  • Re: Funzione che restituisce 2 valori

    @AldoBaldo, ricorda che in C++ class e struct sono a tutti gli effetti lo stesso tipo di oggetto.
    L'unica cosa che cambia e' la visibilita' di default di quello che ci definisci dentro:

    class: privato
    struct: pubblico

    Qundi: 'una class anziche una struct' e' una frase che non ha senso. E' come dire: acqua o H2O (formula chimica dell'acqua)

    In C#, invece, class e struct sono due oggetti di tipo diverso.

    class e' trattato come un reference (un puntatore)
    struct invece come un valore (viene fatta la copia)
  • Re: Funzione che restituisce 2 valori

    Sono consapevole della "coincidenza" tra struct e class in C++, con le classi che hanno membri privati per default e pubblici (o protetti) solo se specificato in modo esplicito, e strutture che seguono il principio inverso. L'idea che intendevo esporre era che se operi in C puoi usare solo le struct (con le caratteristiche limitate che hanno le struct in C), mentre se operi in C++ puoi permetterti di usare anche le classi. Ovviamente, in C++ si potrebbe decidere di implementare strutture che comprendano creatore, distruttore, metodi e bla bla. Ad esempio...
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    class Cerchio{
        float r;
        float a;
        float c;
    
        public:
    
        Cerchio() { r=a=c=0.0f; }
        Cerchio(float misura_raggio) { raggio(misura_raggio); }
    
        void raggio( float misura_raggio ) {
            r = misura_raggio;
            a = ((float)M_PI)*r*r;
            c = 2*((float)M_PI)*r;
        }
    
        float raggio()          { return r; }
        float area()            { return a; }
        float circonferenza()   { return c; }
    };
    
    int main() {
        Cerchio c(5);
    
        cout<<c.area()<<endl;
        cout<<c.circonferenza();
    
        return 0;
    }
    ... potrebbe essere anche scritto, in modo equivalente, come ...
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    struct Cerchio{
        Cerchio() { r=a=c=0.0f; }
        Cerchio(float misura_raggio) { raggio(misura_raggio); }
    
        void raggio( float misura_raggio ) {
            r = misura_raggio;
            a = ((float)M_PI)*r*r;
            c = 2*((float)M_PI)*r;
        }
    
        float raggio()          { return r; }
        float area()            { return a; }
        float circonferenza()   { return c; }
    
        private:
    
        float r;
        float a;
        float c;
    };
    
    int main() {
        Cerchio c(5);
    
        cout<<c.area()<<endl;
        cout<<c.circonferenza();
    
        return 0;
    }
    Qualunque soluzione si scelga (strutture del C, classi del C++, strutture del C++) a me sembra preferibile, nel cose specifico, rispetto alla creazione di un array dinamico da restituire a cura della funzione sulla quale ha chieso lumi Reynold. Piuttosto, se si volesse insistere con l'avere in restituzione un puntatore a un vettore di float (magari deve svolgere un esercizio e gli è stato imposto di fare proprio quello), mi parrebbe preferibile una funzione che riceva in input l'indirizzo di un buffer costituito da un vettore con la quantità necessaria di float e che restituisca l'indirizzo allo stesso buffer dopo averci inserito i dati richiesti.
    float *cerchi( float raggio, buff_esiti *float );
    Poi, per la carità... basta leggere cosa c'è in calce ad ogni mio messaggio. Sono un praticone che ha imparato da sè quel poco che sa e che "programma" per gioco e nulla più.
  • Re: Funzione che restituisce 2 valori

    @AldoBaldo, quello che hai scritto in calce NON CONTA.

    Se devi dare consigli, li devi dare con cognizione di causa, altrimenti il tuo interlocutore si ritrova a dover leggere consigli corretti e quelli approssimati (ma questo lo capisce SOLO chi ha esperienza) e non e' in grado di scegliere/capire le differenze.

    Per uno che e' alle prime armi, introdurre differenziazioni che sono solo estetiche non aiuta.

    struct in C, class e struct in C++ SONO LA STESSA COSA, se USATE NELLO STESSO MODO, con la sola differenza della questione della visibilta.

    MA la questione della visibilita', per uno che non ha abbastanza esperienza, e' una complicazione inutile, QUINDI conviene non introdurla.

    In questo caso, quindi, non serviva introdurre la classe, ma usare direttamente la struttura.
Devi accedere o registrarti per scrivere nel forum
6 risposte