1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | // 확장성이 강력한 정렬 프로그램 만들기 #include <stdio.h> #include <stdlib.h> #include <string.h> int intCompare(void *a, void *b) { return *((int *)a) > *((int *)b); } int doubleCompare(void *a, void *b) { return *((double *)a) > *((double *)b); } int floatCompare(void *a, void *b) { return *((float *)a) > *((float *)b); } int charCompare(void *a, void *b) { return *((char *)a) > *((char *)b); } int shortCompare(void *a, void *b) { return *((short *)a) > *((short *)b); } void sort(void *arr, int len, size_t esize, int (*compare)(void *, void *)); int main() { int a[5] = {3, 1, 4, 5, 2}; sort(a, 5, sizeof(int), intCompare); for (int i = 0; i < 5; ++i) printf("%d ", a[i]); } void generic_swap(void *arr, int i, int j, size_t size) //넘어올때는 char*로 넘어오지만 받는게 void*니까 또 캐스팅 필요 { //memcpy말고 char배열을 swap하듯이 해도된다.int면 char를 4번 스왑한다는 뜻. char *aray = (char *)arr; char *p = aray + i * size, *q = aray + j * size; char tmp; for (int i = 0; i < size; ++i, ++p, ++q) { tmp = *p; *p = *q; *q = tmp; } } void sort(void *arr, int len, size_t esize, int (*compare)(void *, void *)) { void *tmp = malloc(esize); for (int i = 0; i < len - 1; ++i) for (int j = i + 1; j < len; ++j) { if (compare((char *)arr + esize * i, (char *)arr + esize * j)) //주소+정수 연산으로 주소를 뽑아내는데 //i*가리키는 타입의 크기만큼 가게 된다. void*일경우 사이즈를 계산하지 못하기 때문에 //char*로 형변환 시킨 후 i*데이터타입의 크기를 해주면 그만큼 넘어간 주소가 된다. //compare함수에 void*를 두개 넘겨주는 이유는, 함수를 파라미터로 넘겨줄때 인자가 int*이런식으로 //타입이 정해져버리면 sort함수의 인자를 통일시킬수없기 때문에 //(void*,void*)형식의 함수로 넘겨주고, compare함수 내에서 자체적으로 해결해야한다. { //compare함수에서 넘어온 값을 믿고 그냥 바이트단위로 복사한다. //여기서도 핵심은 void*를 char*로 변환해서 주소+정수연산을 이용한다는 점이다. //memcpy(tmp,(char*)arr + esize*i, esize); //memcpy((char*)arr+i*esize, (char*)arr+j*esize, esize); //memcpy((char*)arr+j*esize,tmp,esize); generic_swap(arr, i, j, esize); //넘길때 void* + 정수 하면 안된다고! } } free(tmp); } | cs |
C언어
- 제네릭 sort함수 2019.03.20 1
제네릭 sort함수
2019. 3. 20. 09:57