2015-04-16 7 views
5

Zastanawiam się, czy jest możliwe, aby jedna funkcja, taka jak zamiana(), była używana w dwóch różnych strukturach do zamiany? Tak na przykład,Jedna funkcja wymiany do użycia przez 2 różne struktury

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; 

Tak, na podstawie, że jest to możliwe dla funkcji zamiany, aby móc zamienić elementy w elemencie? E.g można użyć: 1. swap (arr [1], arr [2]); 2. swap (brr [1], brr [2]);

Z tego punktu widzenia nie można tego zrobić, ponieważ typ danych zarówno dla struct (jak i dla jej elementu) jest inny. Zastanawiam się nad stworzeniem funkcji modułowej dla jednego z moich projektów, więc pomoc byłaby naprawdę doceniana.

Dzięki.

+0

można definiować makra dla tego –

+1

Korzystanie C i jak napisałeś to nie. Nie jest to możliwe bez napisania naprawdę paskudnego kodu. Możesz jednak zbadać związki. –

+0

makro lub zmień na 'swap (foo, bar, size) – user3528438

Odpowiedz

4

Będziesz potrzebować rodzajowe funkcję, która pobiera pamięć odnosi się do wymiany zamiast:

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

Zamiast elementów, można przejść w ich adresami:

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

To makro, a nie funkcjonować. Przetestowałem to na GCC i Clang na Linux x86-64 z optymalizacją -O1. Wygląda na to, że kompilatory są wystarczająco inteligentne, aby pozbyć się malloc, memcpy i darmowych dla małych struktur. Ten kod powinien się skompilować do czegoś mniejszego niż poprawne wywołanie funkcji.

#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);\ 
} 

Przykład zastosowania:

one arr[8]; 
two brr[8]; 
/* Set these two arrays. */ 
swap(arr, 1, 2); 
swap(brr, 1, 2); 
Powiązane problemy