포인터 함수... ㅠ.ㅠ

아래 소스에서 compare_string 와 compare_long 를 부르는 bubble의 인자
*fptr을 쓰는 방법이 이해가 안되거든요.
이게 어떻게 적용되고 어떻게 응용되는지 가르쳐 주세요.
바쁜 와중에 긴 소스를 보시고 답변해주시는 이곳의 고수님들께 진심으로
감사드립니다.
즐거운 하루 되세요.
----------------------- 소스 시작 -----------------------
#include
#include
#define MAX_BUF 256
long arr[10] = { 3,6,1,2,3,8,4,1,7,2};
char arr2[5][20] = { "Mickey Mouse",
"Donald Duck",
"Minnie Mouse",
"Goofy",
"Ted Jensen" };
void bubble(void *p, int width, int N,
int(*fptr)(const void *, const void *));
int compare_string(const void *m, const void *n);
int compare_long(const void *m, const void *n);
int main(void)
{
int i;
puts("\nBefore Sorting\n");
for (i = 0; i < 10; i++) /* show the long ints */
{
printf("%ld ",arr[i]);
}
puts("\n");
for (i = 0; i < 5; i++) /* show the strings */
{
printf("%s\n", arr2[i]);
}
bubble(arr, 4, 10, compare_long); /* sort the longs */
bubble(arr2, 20, 5, compare_string); /* sort the strings */
puts("\n\nAfter Sorting\n");
for (i = 0; i < 10; i++) /* show the sorted longs */
{
printf("%d ",arr[i]);
}
puts("\n");
for (i = 0; i < 5; i++) /* show the sorted strings */
{
printf("%s\n", arr2[i]);
}
return 0;
}
void bubble(void *p, int width, int N,
int(*fptr)(const void *, const void *))
{
int i, j, k;
unsigned char buf[MAX_BUF];
unsigned char *bp = p;
for (i = N-1; i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
k = fptr((void *)(bp + width*(j-1)), (void *)(bp +
j*width));
if (k > 0)
{
memcpy(buf, bp + width*(j-1), width);
memcpy(bp + width*(j-1), bp + j*width , width);
memcpy(bp + j*width, buf, width);
}
}
}
}
int compare_string(const void *m, const void *n)
{
char *m1 = (char *)m;
char *n1 = (char *)n;
return (strcmp(m1,n1));
}
int compare_long(const void *m, const void *n)
{
long *m1, *n1;
m1 = (long *)m;
n1 = (long *)n;
return (*m1 > *n1);
}
----------------------- 소스 끝 -----------------------
함수 포인터입니다.
void bubble(void *p, int width, int N,
int(*fptr)(const void *, const void *)); int 를 리턴하고, const void * 와 const void * 를 인자로 받는
함수를 가리키는 포인터를 bubble 함수의 네번째 인자로 선언한 겁니다.
자세한 것은 C 서적에서 함수 포인터를 설명한 부분을 보세요.
함수 포인터...간단한 주석입니다.
#include
#include
#define MAX_BUF 256
long arr[10] = { 3,6,1,2,3,8,4,1,7,2};
char arr2[5][20] = { "Mickey Mouse",
"Donald Duck",
"Minnie Mouse",
"Goofy",
"Ted Jensen" };
void bubble(void *p, int width, int N,
int(*fptr)(const void *, const void *));
int compare_string(const void *m, const void *n);
int compare_long(const void *m, const void *n);
int main(void)
{
int i;
puts("\nBefore Sorting\n");
for (i = 0; i < 10; i++) /* show the long ints */
{
printf("%ld ",arr[i]);
}
puts("\n");
for (i = 0; i < 5; i++) /* show the strings */
{
printf("%s\n", arr2[i]);
}
bubble(arr, 4, 10, compare_long); /* sort the longs */
bubble(arr2, 20, 5, compare_string); /* sort the strings */
puts("\n\nAfter Sorting\n");
for (i = 0; i < 10; i++) /* show the sorted longs */
{
printf("%d ",arr[i]);
}
puts("\n");
for (i = 0; i < 5; i++) /* show the sorted strings */
{
printf("%s\n", arr2[i]);
}
return 0;
}
/******************************************************************/
/* void *p 실제 비교할 데이타의 시작주소
*/
/* int width 비교할 데이타의 size */
/* int N 비교할 데이타의 갯수 */
/* int (*fptr) (const void *, const void *) */
/* 함수형 포인터로서 인자로 변형되지 않는 임의데이타를 가르킬 수 있
음 */
/*******************************************************************/
void bubble(void *p, int width, int N,
int(*fptr)(const void *, const void *))
{
int i, j, k;
unsigned char buf[MAX_BUF];
unsigned char *bp = p;
for (i = N-1; i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
k = fptr((void *)(bp + width*(j-1)), (void *)(bp + \
j*width));
/*앞뒤 인접한 원소를 비교한다.*/
if (k > 0)
/* 앞이 크면 */
{
memcpy(buf, bp + width*(j-1), width);
/* buf에 앞을 복사한다.*/
memcpy(bp + width*(j-1), bp + j*width , width);
/* 앞에 뒤를 copy.*/
memcpy(bp + j*width, buf, width);
/* 뒤에 buf(앞의 내용)을 복사 */
}
/* 결국 앞이 크면 앞뒤를 바꾼다 */
/* 뒤에 큰 데이타가 온다 */
}
}
}
int compare_string(const void *m, const void *n)
{
char *m1 = (char *)m;
char *n1 = (char *)n;
return (strcmp(m1,n1));
}
int compare_long(const void *m, const void *n)
{
long *m1, *n1;
m1 = (long *)m;
n1 = (long *)n;
return (*m1 > *n1);
}
댓글 달기