Dubbio su una funzione in c

Messaggioda Cicchi27 » 12/03/2020, 19:27

Salve, vorrei qualche chiarimento su un esercizio: dovrei praticamente scrivere un programma in c che usi una funzione di nome "scambio" per effettuare,ovviamente, lo scambio semplicemente stampandolo. Scrivendo il codice il programma viene effettivamente compilato, ma quando inserisco i numeri, al posto della seconda variabile, viene stampato un numero gigante che rimane lo stesso per ogni numero che inserisco.

Questo è il codice, è la prima volta che ho cominciato a usare le funzioni:

#include <stdio.h>

int scambio( int x, int y);



int main(void)
{

int a;
int b;

printf("digita due numeri: ");
scanf("%d", &a);
scanf("%d", &b);

printf("valori dopo lo scambio:\n");
printf("a : %d, b : %d\n", scambio(a, b));
}
int scambio( int x, int y)
{

x = x ^ y;
y = y ^ x;
x = x ^ y;



return y, x;
}
Cicchi27
New Member
New Member
 
Messaggio: 3 di 84
Iscritto il: 01/03/2020, 10:11

Re: Dubbio su una funzione in c

Messaggioda apatriarca » 13/03/2020, 00:01

Ci sono tantissimi errori nel tuo codice. In effetti è praticamente tutto sbagliato.

1. Partiamo dal prototipo della funzione scambio. L'hai dichiarata come una funzione che restituisce un singolo valore intero a partire da due argomenti interi. Ci sono già due errori qui. Il primo è che sembri voler restituire due valori, ma il C non lo permette. Sarebbe quindi stato piuttosto necessario usare una struttura per agglomerare questi due valori. Tuttavia non è quello che una funzione di scambio dovrebbe fare. Quello che vuoi fare è scambiare il valore contenuto nelle due locazioni di memoria corrispondenti agli argomenti passati, non restituire i due valori scambiati. È insomma necessario passare gli argomenti per riferimento e non per copia come nel tuo caso. In C si usano i puntatori. Il prototipo della tua funzione avrebbe insomma dovuto avere la forma:
Codice:
void scambio(int * x, int * y);


2. A questo punto è necessario fare una piccola parentesi sull'operatore , (la virgola) in C. Questo operatore "esegue" l'espressione alla sua sinistra e restituisce quella a destra. Il seguente codice restituisce insomma semplicemente y.
Codice:
// il seguente è uguale a "return y"
return x, y;


3. Non mi è chiaro perché stai usando l'operatore XOR per lo scambio delle variabili. È MOLTO meno leggibile (devi più o meno già conoscere il trucco per poterlo comprendere a prima vista) e non è più efficiente. Questo genere di "ottimizzazioni" lasciale al compilatore se le ritiene necessarie.

4. La stringa di formato del printf richiede il passaggio di due argomenti interi, ma stai passando solo il valore restituito da scambio. Se anche la funzione restituisse in qualche modo più di un valore (tramite una struttura per esempio) non potresti comunque passare tali valori al printf in questo modo. Quello che andava fatto era scrivere:
Codice:
scambio(&a, &b);
printf("a: %d, b: %d\n", a, b);
apatriarca
Moderatore
Moderatore
 
Messaggio: 5379 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Dubbio su una funzione in c

Messaggioda Cicchi27 » 13/03/2020, 01:47

Grazie per la risposta. Purtroppo ancora non ho affrontato molte cose di programmazione e stavo cercando di recuperare diversi argomenti arretrati svolgendo i vari esercizi che trovavo allegati. Continuerò a perseverare.
Cicchi27
New Member
New Member
 
Messaggio: 4 di 84
Iscritto il: 01/03/2020, 10:11

Re: Dubbio su una funzione in c

Messaggioda Cicchi27 » 13/03/2020, 11:41

#include <stdio.h>

void scambio( int * x, int * y);



int main(void)
{

int a;
int b;


printf("digita due numeri: ");
scanf("%d", &a);
scanf("%d", &b);

printf("valori dopo lo scambio:\n");
scambio(&a, &b);
printf("a : %d, b : %d\n", a, b);
}
void scambio( int * x, int * y)
{
* x = * x + * y;
* y = * x - * y;
* x = * x - * y;


}

Ho riscritto il programma con le modifiche del caso e funziona perfettamente. Ci sono ancora alcuni dubbi: tralasciando il fatto che ancora non ho affrontato per niente l'argomento puntatori, vorrei capire bene il perché il "return" al fine della funzione sia praticamente inutile. Ok, la funzione non sta effettivamente calcolando nessun valore poiché sta soltanto rimaneggiando qualcosa che inserisco io, però, siccome non ho trovato niente sull'argomento nel libro da dove sto studiando, da quello che ho capito non da comunque nessun tipo di errore o warning. Quindi in tutti i tipi di funzione dove non devo restituire nessun valore al main posso omettere il return? Forse è una domanda stupida ma vorrei avre un quadro della cosa più chiaro.
Cicchi27
New Member
New Member
 
Messaggio: 5 di 84
Iscritto il: 01/03/2020, 10:11

Re: Dubbio su una funzione in c

Messaggioda Cicchi27 » 13/03/2020, 16:55

Niente alla fine mi sono risposto da solo : se la funzione non restituisce nessun valore, non serve return ^^'
Cicchi27
New Member
New Member
 
Messaggio: 6 di 84
Iscritto il: 01/03/2020, 10:11

Re: Dubbio su una funzione in c

Messaggioda apatriarca » 14/03/2020, 21:43

Non mi è chiaro perché continui ad usare operazioni aritmetiche o bitwise per fare lo scambio invece di usare il classico:
Codice:
int tmp = *x;
*x = *y;
*y = tmp;

Per quanto riguarda la domanda ti sei già risposto giustamente da solo.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5380 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Dubbio su una funzione in c

Messaggioda Cicchi27 » 25/03/2020, 19:58

Non avrei dovuto usare una terza variabile per fare lo swap come esercizio, ma ho dimenticato di specificarlo ^^'.
Cicchi27
New Member
New Member
 
Messaggio: 7 di 84
Iscritto il: 01/03/2020, 10:11

Re: Dubbio su una funzione in c

Messaggioda vict85 » 26/03/2020, 10:02

La cosa assurda della richiesta è che l'esercizio dà per scontato che il compilatore elimini la funzione, ma che non sappia ottimizzare un scambio.
vict85
Moderatore
Moderatore
 
Messaggio: 10105 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite