DOMANDA Utilizzo di void in c++

Stato
Discussione chiusa ad ulteriori risposte.

MPG

Utente Attivo
544
4
Ho iniziato questa funzione ma non capisco quando usarla. Leggo che si usa quando non deve restituire alcun valore ma se ad esempio in un problema si cerca "l'area del trapezio" un valore si trova alla fine... Leggo anche che si riferisce al return 0 , ma ancora non ho bene chiaro ripeto il suo uso o non uso..
Per esempio se il problema come questo sotto è " riceve un parametro intero e ne restituisce il valore assoluto" io l'ho compilato senza usare void ma potevo farlo con void o no e perchè?
Grazie a tutti

Post unito automaticamente:

Codice:
#include <iostream>

using namespace std;

double trovaAssoluto(double n)
{
if(n>0)
    return n;
else
    return -n;
}

int main()
{
double numero;
cin>>numero;
double valoreassoluto;
valoreassoluto=trovaAssoluto(numero);
cout<<valoreassoluto;
    return 0;
}
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Non sono sicuro che tu abbia chiaro, almeno concettualmente di che cosa è una funzione.
Una funzione è, semplicisticamente, un blocco di istruzioni a cui viene assegnato un nome. Una funzione può (ma non è necessario) accettare dei parametri come input, e può (ma non è necessario) "ritornare" al contesto chiamante un output. Nel caso in cui la funzione non debba ritornare nulla, allora si definisce funzione "void".
Detto questo, non vedo dove sia il problema. Penso piuttosto che tu non abbia ancora nozione di riferimenti e puntatori, perchè la risposta alla tua domanda risiede probabilmente in questi.
Immagina di voler definire una funzione che calcola il doppio di un valore. Potresti scrivere
Codice:
double doppio1(double x){
    return x*2;
}

int main(){
    double y1;
    y1 = doppio1(3);
    cout << y1;   //stampa 6
    return 0;
}
ovvero una funzione che accetta un double come parametro e restituisce un double.
Puoi risolvere questo problema con una funzione void, che non ritorna nulla? Certamente si, quello che cambia è il modo in cui il valore raggiunge la funzione chiamante (la funzione main per intenderci).
Codice:
void doppio2(double x, double *y){
    *y = x*2;
}

int main(){
    double y2;
    doppio2(3, &y2);
    cout << y2;    //stampa 6
    return 0;
}
Quello che ho fatto è passare alla funzione doppio2 il riferimento (l'indirizzo in memoria) della variabile y2 definita in main, la funzione doppio2 usa il puntatore (tipo double*) per scrivere in quella posizione in memoria e poi termina, senza ritornare nulla.
Una funzione di questo tipo si dice avere "side effects" perchè altera un contesto diverso dal proprio.
Invece la prima funzione fa il suo lavoro e restituisce un valore che deve essere esplicitamente raccolto dalla funzione chiamante.
Per esempio se il problema come questo sotto è " riceve un parametro intero e ne restituisce il valore assoluto" io l'ho compilato senza usare void ma potevo farlo con void o no e perchè?
Se la consegna dice "ritorna", immagino che sia richiesta una funzione int, non void. Puoi usare anche una funzione void, come dimostrato sopra, ma non sarebbe quello richiesto dall'esercizio.
 

MPG

Utente Attivo
544
4
Non ho ancora capito benissimo, faccio un po' fatica..

Scusa si puo' scrivere cosi' per trovare la somma di 2 numeri ?


Codice:
#include <iostream>

using namespace std;

double sommaDouble (double a, double b)

int main()
{
    cin>>a;
    cin >>b;
    return (a+b);
    }


Soluzione migliore qui sotto:

Codice:
#include <iostream>

using namespace std;
int a;
int b;
int somma;

void sommaValori ()

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }

In ogni caso mi puoi mostrare la differenza con o senza void con la somma di 2 o 3 numeri?
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Non ho ancora capito benissimo, faccio un po' fatica..

Scusa si puo' scrivere cosi' per trovare la somma di 2 numeri ?
In ogni caso mi puoi mostrare la differenza con o senza void con la somma di 2 o 3 numeri?

Codice:
#include <iostream>

using namespace std;

double sommaDouble (double a, double b)

int main()
{
    cin>>a;
    cin >>b;
    return (a+b);
    }
Qui vedo la dichiarazione di una funzione (sommaDouble) e la funzione main, che è la funzione di ingresso del programma. Quello che fai qui è calcolare una somma e restituirla come output dell'intero programma. Tipicamente main ritorna 0 per segnalare che il programma è stato eseguito correttamente, per cui quello che stai facendo in quel codice non è propriamente corretto.
La somma dovresti farla nella funzione sommaDouble, ma devi prima aver chiaro cosa vuoi fare (stampare la somma in console?).
Codice:
double sommaDouble (double a, double b){
     return a + b;
}
int main()
{
    int a,b;
    cin >>a;
    cin >>b;
    cout << sommaDouble(a,b);
    return 0;
}
Il fatto che mi chiedi l'esempio "void" per la somma di due numeri, mi fa supporre che in realtà tu non abbia capito nemmeno il mio post precedente.
Lascia stare void per ora, cerca di capire i concetti nel giusto ordine, partendo dalle cose semplici. Stai almeno seguendo un qualche libro o corso fatto bene? E dotati di un compilatore per provare il codice.
 
Ultima modifica:

MPG

Utente Attivo
544
4
Si stampare la somma a video.
Sarebbe meglio cosi'?
Il return 0 devo sempre metterlo?
Ma in pratica se la consegna dice "ritorna" o "restituisce" non devo usare il void ?

Codice:
#include <iostream>

using namespace std;
int a;
int b;
int somma;

void sommaValori ()

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Si stampare la somma a video.
Sarebbe meglio cosi'?

Codice:
#include <iostream>

using namespace std;
int a;
int b;
int somma;

void sommaValori ()

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }
Si va bene, in questo caso hai usato void perchè hai deciso di stampare l'output dentro la funzione stessa. E' una possibilità.
Le variabili a, b e somma potresti dichiararle dentro la funzione sommaValori, visto che fuori non ti servono.
 

MPG

Utente Attivo
544
4
Ma se faccio cosi' non va..
Per il discorso void che faccio fatica a capire e' che ho letto che è una funzione senza valore di ritorno , che non restituisce nessun risultato di calcolo e che le funzioni di tipo void in C++ non hanno bisogno di usare l'istruzione return al proprio interno, dal momento che in effetti non ritornano nulla al chiamante. Pero' penso poi che vengono in realtà fatti dei calcoli... Scusa sono un po' duro...

Codice:
#include <iostream>

using namespace std;



void sommaValori (a, b, somma)

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }
 
Ultima modifica:

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Ma se faccio cosi' non va..
Per il discorso void che faccio fatica a capire e' che ho letto che è una funzione senza valore di ritorno , che non restituisce nessun risultato di calcolo e che le funzioni di tipo void in C++ non hanno bisogno di usare l'istruzione return al proprio interno, dal momento che in effetti non ritornano nulla al chiamante. Pero' penso poi che vengono in realtà fatti dei calcoli... Scusa sono un po' duro...

Codice:
#include <iostream>

using namespace std;



void sommaValori (a, b, somma)

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }
Questo non va per almeno duemotivi:
1. Non hai dichiarato il tipo dei parametri della funzione sommaValori.
2. La chiamata a sommaValori nel main deve indicare i parametri della funzione, ma tu non lo fai.
In ogni caso non ha molto senso quello che stai cercando di fare, le variabili a, b e somma non hanno senso di essere tra i parametri della funzione. Andava bene il codice di prima.

Comunque penso che tu ancora non abbia chiaro cos'è una funzione, sai cos'è un funzione in ambito matematico? E' più o meno la stessa cosa. E ripeto, affidati a un buon libro introduttivo, mi sembra che tu stia andando un po' troppo a tentoni.
 
  • Mi piace
Reazioni: DispatchCode

MPG

Utente Attivo
544
4
Fatto cosi' ma nulla, perchè?

Codice:
#include <iostream>

using namespace std;

int somma;

void sommaValori (double a, double b, double  somma)

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori (double a, double b, double somma);
    }
 

1nd33d

Utente Attivo
653
279
CPU
Intel i5 3570K @ 4,5Ghz
Dissipatore
Scythe Mugen 2
Scheda Madre
Gigabyte Z77X-UD3H
HDD
Samsung 840 PRO 256GB + Sandisk Ultra 250GB + Sandisk Plus 960GB
RAM
2x8GB Crucial Ballistix Tactical @2000Mhz CL9
GPU
XFX RX480 GTR Black Edition
Audio
Auzentech X-Fi Forte
Monitor
AOC i2369VW
PSU
Seasonic P660
Case
eh?
Periferiche
Razer Naga HEX v2
OS
Windows 10 64bit - Linux Mint 18
Fatto cosi' ma nulla, perchè?

Codice:
#include <iostream>

using namespace std;

int somma;

void sommaValori (double a, double b, double  somma)

{
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori (double a, double b, double somma);
    }
No, non ci siamo proprio.
Stai dichiarando delle variabili nella chiamata di una funzione. Quando chiami una funzione, devi passare dei valori, non delle dichiarazioni. Ma probabilmente non sai nemmeno cosa siano la dichiarazione e l'assegnazione di variabile, che penso sia spiegato nel primo capitolo, se non paragrafo di qualsiasi libro di programmazione C/C++.
E per come hai definito quella funzione, non serve che le passi alcunché. Il codice giusto lo avevi scritto qualche post fa: https://www.tomshw.it/forum/threads/utilizzo-di-void-in-c.741432/post-7032817

Penso che tu non sappia quello che stai facendo. Ripeto, prenditi un libro, studialo almeno un po' e poi eventualmente potremo risponderti a domande più ponderate. Non puoi cambiare a caso il codice senza sapere cosa stai facendo e chiedere se è giusto o meno, dai su.
 
  • Mi piace
Reazioni: BAT e DispatchCode

MPG

Utente Attivo
544
4
Scusa guarda che questa parte di funzioni, void, variabili , scope .. la stiamo facendo ora e non è scritta nel primo paragafo..
Se avevo scritto prima il codice giusto insomma non sono proprio scemo.. volevo far euna alternativa.
Comunque in una spiegazione a scuola c'era come esempio:
void sommaValori (double val1, double val2)
in una stampa a video di 2 double passati come parametri, pensavo di fare cosi' anche qui

Tornando a quello che mi avevi scritto prima:
"Questo non va per almeno duemotivi:
1. Non hai dichiarato il tipo dei parametri della funzione sommaValori.
2. La chiamata a sommaValori nel main deve indicare i parametri della funzione, ma tu non lo fai.

Il tipo di parametri non sono double a, double b e double somma?

Codice:
#include <iostream>

using namespace std;

int somma;

void sommaValori ()

{
    double a;
    double b;
    double  somma;
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Comunque in una spiegazione a scuola c'era come esempio:
void sommaValori (double val1, double val2)
in una stampa a video di 2 double passati come parametri, pensavo di fare cosi' anche qui

Quella si chiama firma della funzione. Serve solo a dare un nome alla funzione che si deve creare descrivendo quelli che sono gli argomenti della funzione stessa (ovvero sono i parametri che dovrai passare alla funzione che creerai).

Tornando a quello che mi avevi scritto prima:
"Questo non va per almeno duemotivi:
1. Non hai dichiarato il tipo dei parametri della funzione sommaValori.
2. La chiamata a sommaValori nel main deve indicare i parametri della funzione, ma tu non lo fai.

Il tipo di parametri non sono double a, double b e double somma?

Codice:
#include <iostream>

using namespace std;

int somma;

void sommaValori ()

{
    double a;
    double b;
    double  somma;
    cin >>a;
    cin >>b;
    somma= a+b;
    cout<<somma;
}


int main()
{
   sommaValori ();
    }

Riprendendo quanto ho appena scritto: la tua funzione sommaValori() non rispetta la firma in quanto "a" e "b" dovrebbero essere i parametri.
Quindi la versione corretta sarebbe:

C++:
void sommaValori(double a, double b)
{
  cin >> a;
  cin >> b;
  cout << (a+b);
}

Se noti la funzione è "void" e significa quindi che non viene restituito nessun valore al chiamante; il chiamante è quel codice che invoca la funzione stessa, nel tuo caso il main().

I parametri della funzione sono quelli che passi alla funzione quando la chiami e non le variabili dichiarate al suo interno (quelle sono variabili locali alla funzione, ma sono cose che forse vedrete a breve).
 

MPG

Utente Attivo
544
4
MI hai appena anticipato avevo preparato cosi':

Codice:
#include <iostream>

using namespace std;



void sommaValori (double a, double b)

{
cin>>a;
cin >>b;
cout<<a+b;
}


int main()
{
    double a, b;
    sommaValori (a,b);

    }
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il parametro "s" non ti serve a niente.
La stampa viene fatta dall'istruzione cout Inoltre, non so se vi è stato accennato ma spero di si, quando passi dei parametri alla funzione questi vengono passati "per valore". Significa che viene passato il valore contenuto dalla variabile e che quindi questa variabile, all'interno della funzione chiamata, non esiste.

Per essere chiaro, prendo come esempio il tuo codice:
C++:
sommaValori (a,b,s);

tu chiami la funzione sommaValori in questo modo; viene quindi copiato il valore di a, b ed s e passato alla funzione. Questo valore viene memorizzato nei parametri a, b ed s della funzione sommaValori, ma queste variabili non sono le stesse che hai nel main().Quindi qualsiasi modifica fatta alle variabili in sommaValori, verrà persa al termine della funzione.

Spero sia chiaro come concetto, se hai dubbi, domanda pure.
Alcuni concetti purtroppo sono un pò ostici, ma proseguendo con lo studio verranno chiariti, vedrai.
 

MPG

Utente Attivo
544
4
Ho tolto s hai ragione, ma cosi' è giusta?
Quando mi è stato appuntato :
"La chiamata a sommaValori nel main deve indicare i parametri della funzione, " si riferisce al fatto che dovevo scrivere cosi' nel main:

sommaValori (a,b);


Poi non ho capito bene.
"Tu chiami la funzione sommaValori in questo modo; viene quindi copiato il valore di a, b ed s e passato alla funzione. Questo valore viene memorizzato nei parametri a, b ed s della funzione sommaValori, ma queste variabili non sono le stesse che hai nel main().Quindi qualsiasi modifica fatta alle variabili in sommaValori, verrà persa al termine della funzione.
"
Cioè se do' a a valore 3 e a b valore 5 che mi da somma 8 questi valori sono memorizzati nei parametri della funzione sommaValori ma queste variabili non sono le stesse del main? Non capisco sinceramente...
Infine quando prima scrivi per questa parte:

"
void sommaValori(double a, double b)
{
cin >> a;
cin >> b;
cout << (a+b);
}

"
Se noti la funzione è "void" e significa quindi che non viene restituito nessun valore al chiamante; il chiamante è quel codice che invoca la funzione stessa, nel tuo caso il main(). Poichè faccio sempre fatica a capirlo perchè si dice che non restituisce alcun valore anche se in questo caso dice di fare la somma di a+b ? perchè in realtà il valore lo determina il main? puoi spiegarmelo diversamente?
Ti ringrazio molto.



Codice:
#include <iostream>

using namespace std;



void sommaValori (double a, double b)

{
cin>>a;
cin >>b;
cout<<a+b;
}


int main()
{
    double a, b;
    sommaValori (a,b);

    }
 
Ultima modifica:
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili