C 에서 함수 포인터를 인수로 전달하는 방법이요...
글쓴이: waltherppk / 작성시간: 금, 2003/06/27 - 6:59오전
void list_init(List *list, void (*destroy)(void *data)) { list -> size = 0; list -> destroy = destroy; list -> head = NULL; list -> tail = NULL; return; }
Algorithm with C 번역판 -O'Rielly- 의 연결리스트 구현예제코드의 일부입니다. 이걸 호출하는 방법을 모르겠어요...
list_init(list, function_pointer); list_init(list, function_pointer(void *)); int data = 0; list_init(list, function_pointer((void *)&data));
함수를 List 구조체에 등록만하는 것이 목적같은데...
비스무리한 거 때려넣어도 모조리
컴파일러에서 parse error before "void"나
undefined reference to 'list_init' 가 떠요.
전혀 감이 안잡힙니다.... ㅠㅠ
기초가 부족한 것이라면, 적당한 책의 추천도 부탁드립니다.
읽어주셔서 감사합니다. (^^) (__) 꾸벅
Forums:
function_pointer부분에 관해 다음과 같이 틀 만들어봤어요.
function_pointer부분에 관해 다음과 같이 틀 만들어봤어요.
보시고 이해가시면 만세 3번 불러요~ "만만만세"
이해는 가는데요... 만만만세~~~~~~~~~~근데 컴파일이 안되
이해는 가는데요... 만만만세~~~~~~~~~~
근데 컴파일이 안되요... ㅠㅠ
에러메세지는요...
warning : passing arg 2 of 'list_init' from incompatible pointer type
undefined reference to 'list_init'
컴파일환경은 Win-XP에서 Dev-C++갖다가 gcc 로 gcc -o Test Test.c 형식으로요
답변 다시한번 감사드립니다. (^^) (__) 꾸벅
list_init 함수를 보면 반환형이 void인 함수에 대한 포인터를
list_init 함수를 보면 반환형이 void인 함수에 대한 포인터를 두번째 인자로 받고 있네요....
이렇게 하던가 아니면
이렇게 수정해야 합니다.
둘다 안되요... ㅠㅠ
둘다 안되요... ㅠㅠ
[code:1]void list_init(List *list,
라면...
이런 모양의 함수를 넘겨야 되는거 아닌가요?
대충 이런식.....void dlist_init(DList *li
대충 이런식.....
void dlist_init(DList *list, void (*destroy)(void *data),
int (*compare)(const void *key1, const void *key2),
void (*print)(DList *list))
{
list->size = 0;
list->head = list->tail = NULL;
list->destroy = destroy;
list->compare = compare;
list->print = print;
return;
}
void list_init()
{
dlist_init(&FileList, element_destroyer,
element_compare,element_print);
}
int element_compare(const void *e1, const void *e2)
{
size_t len = strlen( (const char *)(((Element *)(e1))->header) ) >
strlen((const char *)(e2)) ?
strlen(e2)
strlen( (const char *)(((Element *)(e1))->header) );
return strncmp((const char *)(((Element *)
(e1))->header), (const char *)e2, len);
}
void element_print(DList *list)
{
DListElmt *current;
int i;
current = list->head;
if (current == NULL) return;
for ( i = 0; i < dlist_size(list); i++) {
printf(" %s %s %d\n", ((Element *)(current->data))->header,
((Element *)(current->data))->include,
((Element *)(current->data))->line_no);
current = current->next;
}
}
void element_destroyer(void *element)
{
if (element == NULL) {
return;
}
free(((Element *)element)->header);
free(((Element *)element)->include);
}
고맙습니다.~~~~~해결되었어요!!!!!!!만세~~ 만세~
고맙습니다.~~~~~
해결되었어요!!!!!!!
만세~~ 만세~~ 만세~~
답변해주신분들 다시한번 감사드립니다.
(^^) (__) 꾸벅
list_init이 정의되어있는 *.c 파일을 같이 컴파일 하지 않은
list_init이 정의되어있는 *.c 파일을 같이
컴파일 하지 않은게 아닌가요-_-a
아니면 선언이랑 정의가 다르다던지요..
예... 컴파일을 잘못했어요...^^ㅋ정말 제 머리가 돌머
예... 컴파일을 잘못했어요...
^^ㅋ
정말 제 머리가 돌머리같군요...
다시한번 답변해주신분들 감사드립니다....
귀찮으시겠지만 자주 질문 올리겠습니다....
(^^) (__) 꾸벅
댓글 달기