Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

Dubbio su una funzione in c

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;
}

Re: Dubbio su una funzione in c

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);

Re: Dubbio su una funzione in c

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.

Re: Dubbio su una funzione in c

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.

Re: Dubbio su una funzione in c

13/03/2020, 16:55

Niente alla fine mi sono risposto da solo : se la funzione non restituisce nessun valore, non serve return ^^'

Re: Dubbio su una funzione in c

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.

Re: Dubbio su una funzione in c

25/03/2020, 19:58

Non avrei dovuto usare una terza variabile per fare lo swap come esercizio, ma ho dimenticato di specificarlo ^^'.

Re: Dubbio su una funzione in c

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.
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.