2015-04-16 10 views
5

Mi chiedo se sia possibile utilizzare una funzione come swap() in due diverse strutture per scambiarle? Così, per esempio,Una funzione di scambio da utilizzare con 2 diverse strutture

typedef struct{ 
char a; 
}one; 

typedef struct{ 
int c; 
}two; 

swap(??,??){ 
// code to swap 2 elements 
} 

one arr[8]; 
arr[1].a='a'; 
arr[2].a='b'; 

two brr[8]; 
brr[1].c = 11; 
brr[2].c = 12; 

Quindi, in base a questo, è possibile che la funzione di scambio per essere in grado di scambiare gli elementi in struct? E.g è possibile utilizzare: 1. swap (arr [1], arr [2]); 2. swap (brr [1], brr [2]);

Dalla mia comprensione, tale cosa non può essere eseguita poiché il tipo di dati sia per struct (che per il suo elemento) sono diversi. Mi sono chiesto di creare una funzione modulare per un mio progetto in modo che l'aiuto sarebbe molto apprezzato.

Grazie.

+0

è possibile definire macro per questo –

+1

Utilizzando C e, come hai scritto, no. Non è possibile senza scrivere un codice veramente brutto. Tuttavia, potresti voler indagare sui sindacati. –

+0

macro, o cambiarlo in 'swap (foo, bar, size)' – user3528438

risposta

4

Si avrebbe bisogno di una funzione generica che porta la memoria indirizzi per scambiare invece:

void swap(void *a, void *b, size_t size) 
{ 
    void *tmp = malloc(size); 
    // you should make sure the memory allocation was successful 

    memcpy(tmp, a, size); 
    memcpy(a, b, size); 
    memcpy(b, tmp, size); 

    free(tmp); 
} 

Al posto degli elementi, si passa nei loro indirizzi:

swap(&arr[1], &arr[2], sizeof(one)); 
0

Questa è una macro, non un funzione. L'ho provato su GCC e Clang su Linux x86-64 con ottimizzazioni -O1. Sembra che i compilatori siano abbastanza intelligenti da sbarazzarsi di malloc, memcpy e free per le piccole strutture. Questo codice dovrebbe essere compilato a qualcosa di più piccolo di una chiamata appropriata a una funzione.

#define swap(a, i1, i2)\ 
{\ 
    size_t size = sizeof(a[i1]);\ 
    void *tmp_elm = malloc(size);\ 
    memcpy(tmp_elm, &a[i1], size);\ 
    memcpy(&a[i1], &a[i2], size);\ 
    memcpy(&a[i2], tmp_elm, size);\ 
    free(tmp_elm);\ 
} 

L'esempio di utilizzo:

one arr[8]; 
two brr[8]; 
/* Set these two arrays. */ 
swap(arr, 1, 2); 
swap(brr, 1, 2); 
Problemi correlati