DOMANDA Qualche Chiarimento Sull'utilizzo Delle Funzioni (sottoprogrammi) In C++

Evans221

Nuovo Utente
6
0
Salve a tutti, ho da poco iniziato a studiare le funzioni, che consentono di chiamare dal main la parte di istruzioni che vogliamo eseguire, definita esternamente ad esso.

Ho ancora qualche dubbio sull'argomento: quali solo le variabili che vanno dichiarate (sia nei prototipi che nella definizione) all'interno delle parentesi?

Ad esempio, voglio scrivere una funzione void leggi che mi permette di leggere gli elementi di un vettore.
La funzione in se è:

cout << "Inserisci numero di elementi del vettore: ";
cin >> riemp;
for (i=0; i<riemp; i++)
cout << "Inserisci valore del " << i+1 << " elemento: ";
cin >> vettore;

E dunque nel prototipo e nella definizione quali sono le variabili che devo chiamare? Riemp e Vettore? E perchè non chiamare anche i allora? All'inizio pensavo venissero chiamate tutte le variabili che compaiono nelle istruzioni ma non mi è ben chiaro cosa mettere nelle parentesi delle funzioni...
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
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
Salve a tutti, ho da poco iniziato a studiare le funzioni, che consentono di chiamare dal main la parte di istruzioni che vogliamo eseguire, definita esternamente ad esso.

Ho ancora qualche dubbio sull'argomento: quali solo le variabili che vanno dichiarate (sia nei prototipi che nella definizione) all'interno delle parentesi?

Ad esempio, voglio scrivere una funzione void leggi che mi permette di leggere gli elementi di un vettore.
La funzione in se è:

cout << "Inserisci numero di elementi del vettore: ";
cin >> riemp;
for (i=0; i<riemp; i++)
cout << "Inserisci valore del " << i+1 << " elemento: ";
cin >> vettore;

E dunque nel prototipo e nella definizione quali sono le variabili che devo chiamare? Riemp e Vettore? E perchè non chiamare anche i allora? All'inizio pensavo venissero chiamate tutte le variabili che compaiono nelle istruzioni ma non mi è ben chiaro cosa mettere nelle parentesi delle funzioni...

Nel prototipo (o dichiarazione, se è questa che intendi) non è obbligatorio utilizzare il nome, è sufficiente il tipo. Banalmente per spiegarmi:

Dichiarazione:
Codice:
int somma(int, int);

Definizione:
Codice:
int somma(int a, int b)
{
  // Corpo della funzione
}

In generale, alla funzione passi i parametri che servono alla funzione stessa, per poter effettuare una determinata operazione. Se hai una funzione che - ad esempio - eleva al quadrato, ti servirà passare alla funzione solo un numero: ovvero il numero che vuoi elevare al quadrato.
Tieni presente che tutte le variabili che crei nella funzione, lì rimangono. Sono tutte variabili locali, che esistono cioè solo nel corpo della funzione (o, in generale, in un preciso blocco); quando la funzione termina (restituendo o no un valore) le variabili dichiarate al suo interno verranno distrutte. Quindi se vuoi popolare un vettore, è sensato passare alla funzione il vettore stesso (che poi sarà un puntatore al primo elemento del vettore, la locazione 0), altrimenti non te ne farai molto essendo locale a quella funzione.

Mi sembri molto confuso riguardo ai parametri anche. Se hai domande di qualche tipo, ponile pure, e cercheremo di risponderti il meglio possibile. Così ti saranno più chiari questi concetti (che sono alla base di altri).
 
  • Mi piace
Reazioni: Mursey

Evans221

Nuovo Utente
6
0
Nel prototipo (o dichiarazione, se è questa che intendi) non è obbligatorio utilizzare il nome, è sufficiente il tipo. Banalmente per spiegarmi:

Dichiarazione:
Codice:
int somma(int, int);

Definizione:
Codice:
int somma(int a, int b)
{
  // Corpo della funzione
}

In generale, alla funzione passi i parametri che servono alla funzione stessa, per poter effettuare una determinata operazione. Se hai una funzione che - ad esempio - eleva al quadrato, ti servirà passare alla funzione solo un numero: ovvero il numero che vuoi elevare al quadrato.
Tieni presente che tutte le variabili che crei nella funzione, lì rimangono. Sono tutte variabili locali, che esistono cioè solo nel corpo della funzione (o, in generale, in un preciso blocco); quando la funzione termina (restituendo o no un valore) le variabili dichiarate al suo interno verranno distrutte. Quindi se vuoi popolare un vettore, è sensato passare alla funzione il vettore stesso (che poi sarà un puntatore al primo elemento del vettore, la locazione 0), altrimenti non te ne farai molto essendo locale a quella funzione.

Mi sembri molto confuso riguardo ai parametri anche. Se hai domande di qualche tipo, ponile pure, e cercheremo di risponderti il meglio possibile. Così ti saranno più chiari questi concetti (che sono alla base di altri).

No in realtà appena iniziate a studiare avevo poco chiara la differenza tra passaggio per valore e per riferimento e quindi non capivo molto bene come impostare una funzione. Ti ringrazio, la tua risposta è sta chiarissima e d'aiuto!
In pratica se una funzione somma ha 3 variabili ad esempio
Codice:
int a, b;
int tot = a+b;

La funzione per accedervi sarebbe:
Codice:
/*Prototipo:*/ int somma(int, int, int);
/*Definizione:*/ int somma(int a, int b, int tot);
/*Chiamata:*/ somma(a, b, tot);

Giusto?
E potrei anche evitare di dichiararla in parentesi ma dichiararla nella funzione stessa? Ad esempio anzichè
Codice:
int somma(int a, int b, int tot)

potrei scrivere
Codice:
int somma(int a, int b) {
int tot;
}

cioè dichiare la 3° variabile tot all'interno della funzione stessa? Funzionerebbe comunque?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,222
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
No, non è propriamente come dici. Una funzione somma() sarebbe più simile a:

Codice:
int somma(int, int);

e definita quindi come:

Codice:
int somma(int a, int b)
{
  return a+b;
}

E verrà quindi chiamata come:

Codice:
int main()
{
  printf("Risultato: %d", somma(10, 20));

  return 0;
}

Scopo di una funzione è solamente eseguire un compito. Si tratta di quel tipo di compito che viene magari richiesto più volte nel programma; oppure di una funzionalità particolare del programma.
Altri esempi di funzioni sono quelle che utilizzi correntemente: la funzione printf ad esempio. A questa funzione passi una stringa (che è il formato, come ho fatto lì sopra), ed uno o più valori (dipende se devi stampare valori e quanti ne devi stampare). Altro aspetto importante delle funzioni è che astraggono una funzionalità. Nel caso della printf() non ti serve sapere come funziona internamente, non ti serve sapere cosa fa insomma, per poterla utilizzare.
Discorso analogo per scanf() e qualsiasi altra funzione.

Per quanto riguarda la tua altra domanda, sì, puoi dechiarare variabili nelle funzioni. Anzi, è cosa assai frequente. Si tratta sempre di variabili locali che esistono solo per la durata della funzione stessa: al termine della funzione, non esisteranno più (la faccio breve senza dettagli solo perchè rischierei di mandarti in confusione ;) ).

Cosa importante: il parametro della funzione riceve il valore che passi al momento della chiamata. Quindi tutte queste variabili vengono distrutte. Un parametro ha senso solo se alla funzione serve un parametro per eseguire un compito. Nel caso della somma tra due numeri, ha senso usare solo due parametri in quanto la somma avviene appunto tra soli due numeri. Il totale non ti serve; piuttosto, sarà il valore che restituirai da quella funzione. Ovviamente puoi anche memorizzare il risultato in una variabile, e poi restituirlo (ma in un caso del genere sarebbe anche inutile l'esistenza della variabile).

Codice:
int somma(int a, int b)
{
  int tot = a+b;
  return tot;
}
 
  • Mi piace
Reazioni: Evans221

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
No in realtà appena iniziate a studiare avevo poco chiara la differenza tra passaggio per valore e per riferimento e quindi non capivo molto bene come impostare una funzione.
@Evans221
Eccoti un banale esempio di passaggio per valore e per parametro, l'esempio è cosi base che te darà un idea molto chiara.

VALORE:
Codice:
int eleva_Al_Quadrato(int);
main(){

int numero = 2;

eleva_Al_Quadrato(numero);

printf("%d", numero);
return 0;
}

eleva_Al_Quadrato(int parametro){
return parametro*parametro;
}

PARAMETRO

Codice:
void eleva_Al_Quadrato(int);
main(){

int numero = 2;

eleva_Al_Quadrato(&numero);

printf("%d", numero);
return 0;
}

eleva_Al_Quadrato(int *iPtr){
*iPtr = *iPtr * *iPtr;
}

Nel primo esempio int numero continuerà a valere 2, nel secondo varrà 4. Non mi metto a scrivere papiri sul perchè, ma se hai dubbi te li chiarirò volentieri
 
  • Mi piace
Reazioni: Evans221

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

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili