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= {31452};
    sort(a, 5sizeof(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 *= aray + i * size*= aray + j * size;
    char tmp;
    for (int i = 0; i < size++i, ++p, ++q)
    {
        tmp = *p;
        *= *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


+ Recent posts