PROBLEMA [C] Scambio di valori

Pubblicità
Un po' di commenti nel codice non farebbero male, comunque penso che l'errore sia per lo più concettuale.
Alla funzione scambia tu passi due valori che sono gli indirizzi delle posizioni nel vettore che contiene puntatori a struttura, praticamente dei puntatori di puntatori (**) e fin qui è giusto, la firma della funzione è corretta.
Ora però per invertire i valori dei puntatori nel vettore, devi agire non su puntatori di puntatori, ma su puntatori a struttura, devi "scendere di un livello" sulla catena dei puntatori.
Questo codice dovrebbe funzionare:
Codice:
void scambia(struct appuntamento **A, struct appuntamento **B){
        struct appuntamento *temp;
        temp=*A;
        *A=*B;
        *B=temp;
        return;
    }
 
Un po' di commenti nel codice non farebbero male, comunque penso che l'errore sia per lo più concettuale.
Alla funzione scambia tu passi due valori che sono gli indirizzi delle posizioni nel vettore che contiene puntatori a struttura, praticamente dei puntatori di puntatori (**) e fin qui è giusto, la firma della funzione è corretta.
Ora però per invertire i valori dei puntatori nel vettore, devi agire non su puntatori di puntatori, ma su puntatori a struttura, devi "scendere di un livello" sulla catena dei puntatori.
Questo codice dovrebbe funzionare:
Codice:
void scambia(struct appuntamento **A, struct appuntamento **B){
        struct appuntamento *temp;
        temp=*A;
        *A=*B;
        *B=temp;
        return;
    }

Ed effettivamente funziona :D Gentile e chiaro, grazie mille ^^

Per quanto riguarda i commenti hai ragione, pardon :cav:
 
Permettimi di darti dei consigli:
1. Il cast da void* non è necessario
2. fflush(stdin) ha un undefined behavior.
3. Non usare i puntatori se non ti servono realmente (struct appuntamento A[MAX];)
4. scanf("%s") espone a buffer oveflows.
5. La funzione scambia non fa altro che scambiare due indirizzi, non i valori all'intero della struttura (che sarebbe più complicato)
 
Permettimi di darti dei consigli:
1. Il cast da void* non è necessario
2. fflush(stdin) ha un undefined behavior.
3. Non usare i puntatori se non ti servono realmente (struct appuntamento A[MAX];)
4. scanf("%s") espone a buffer oveflows.
5. La funzione scambia non fa altro che scambiare due indirizzi, non i valori all'intero della struttura (che sarebbe più complicato)

1. Non ho capito a quale riga di codice ti riferisci :grat:
2 e 4. Potrei sostituire lo scanf("%s") con gets(stringa), in modo da evitare anche l'utilizzo di fflush(stdin), che ne pensi?
3. Lo so, in questo caso li ho utilizzati per esercitarmi ^^
5. La funzione scambia, con le modifiche apportate in seguito ai consigli di 1nd33d, scambia effettivamente i valori all'interno della struttura.

Cmq grazie mille per i consigli :D
 
1. Non ho capito a quale riga di codice ti riferisci :grat:
2 e 4. Potrei sostituire lo scanf("%s") con gets(stringa), in modo da evitare anche l'utilizzo di fflush(stdin), che ne pensi?
3. Lo so, in questo caso li ho utilizzati per esercitarmi ^^
5. La funzione scambia, con le modifiche apportate in seguito ai consigli di 1nd33d, scambia effettivamente i valori all'interno della struttura.

Cmq grazie mille per i consigli :D

1. Quando chiami la malloc
2. Peggio ancora; usa fgets o scanf("%SIZEs") dove SIZE è il numero dei caratteri da leggere
5. Non credo. Se tu avessi scambiato fisicamente i valori, avresti usato la memmove/memcpy oppure "a mano".
 
1. Quando chiami la malloc
2. Peggio ancora; usa fgets o scanf("%SIZEs") dove SIZE è il numero dei caratteri da leggere
5. Non credo. Se tu avessi scambiato fisicamente i valori, avresti usato la memmove/memcpy oppure "a mano".

1. Senza il cast esplicito il compilatore mi restituisce un errore :grat:
2. scanf("%SIZEs") sarebbe l'equivalente di cin.getline del c++?
5. Provando a fare la stampa, i valori risultano effettivamente scambiati.
 
1. Senza il cast esplicito il compilatore mi restituisce un errore :grat:
2. scanf("%SIZEs") sarebbe l'equivalente di cin.getline del c++?
5. Provando a fare la stampa, i valori risultano effettivamente scambiati.
1. Se compili con g++, è normale. Se compili con gcc, non ti darà nessun errore.
2. Non ha senso paragonare un costrutto C-style con uno C++-style.
 
Pubblicità
Pubblicità
Indietro
Top