2015-04-16 2 views
5

Интересно, можно ли использовать одну функцию, такую ​​как swap(), для использования в двух разных структурах для их замены? Так, например,Одна функция подкачки, которая будет использоваться двумя различными структурами

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; 

Итак, основываясь на том, что это возможно для функции подкачки, чтобы иметь возможность поменять местами элементы в структурах? Например, можно использовать: 1. swap (arr [1], arr [2]); 2. swap (brr [1], brr [2]);

С моей точки зрения, такая вещь не может быть выполнена, так как тип данных для struct (а также его элемента) различен. Мне было интересно создать модульную функцию для одного моего проекта, поэтому помощь была бы действительно оценена.

Спасибо.

+0

можно определить макрос для этого –

+1

Использование C и, как вы написали, нет. Это невозможно без написания действительно уродливого кода. Однако вам может потребоваться расследование профсоюзов. –

+0

или изменить его на 'swap (foo, bar, size)' – user3528438

ответ

4

Вы должны были бы обобщенная функция, которая принимает адрес памяти для замены вместо:

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

Вместо элементов, вы передаете их адрес:

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

Это макрос, а не функция. Я тестировал его на GCC и Clang на Linux x86-64 с оптимизацией -O1. Похоже, компиляторы достаточно умен, чтобы избавиться от malloc, memcpy и бесплатно для небольших структур. Этот код должен скомпилироваться с чем-то меньшим, чем правильный вызов функции.

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

Пример использования:

one arr[8]; 
two brr[8]; 
/* Set these two arrays. */ 
swap(arr, 1, 2); 
swap(brr, 1, 2); 
Смежные вопросы