C 에서 함수 포인터를 인수로 전달하는 방법이요...

waltherppk의 이미지

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' 가 떠요.

전혀 감이 안잡힙니다.... ㅠㅠ
기초가 부족한 것이라면, 적당한 책의 추천도 부탁드립니다.

읽어주셔서 감사합니다. (^^) (__) 꾸벅

익명 사용자의 이미지

function_pointer부분에 관해 다음과 같이 틀 만들어봤어요.
보시고 이해가시면 만세 3번 불러요~ "만만만세"

void *MyFunction(void *s_Data)
{
  /* 뭔가 하는 함수 */
 return(s_Data);
}

void list_init(List *list, void (*destroy)(void *data)) 
{ 
   list -> size = 0; 
   list -> destroy = destroy; 
   list -> head = NULL; 
   list -> tail = NULL; 
   return; 
}

int main(void)
{
  List *s_MyList;
  /* s_MyList 에 관련된 생성하는 부분. */

  /* 호출 */
  list_init(s_MyList, MyFunction);
  return(0);
}
waltherppk의 이미지

이해는 가는데요... 만만만세~~~~~~~~~~

근데 컴파일이 안되요... ㅠㅠ

에러메세지는요...

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 형식으로요

답변 다시한번 감사드립니다. (^^) (__) 꾸벅

teguru75의 이미지

list_init 함수를 보면 반환형이 void인 함수에 대한 포인터를 두번째 인자로 받고 있네요....

void MyFunction(void *s_Data)
{
 /* 뭔가 하는 함수 */
 return(s_Data);

}

이렇게 하던가 아니면
void list_init(List *list, void* (*destroy)(void *data)) 
{ 
   list -> size = 0; 
   list -> destroy = destroy; 
   list -> head = NULL; 
   list -> tail = NULL; 
   return; 
}

이렇게 수정해야 합니다.

minzkn wrote:
function_pointer부분에 관해 다음과 같이 틀 만들어봤어요.
보시고 이해가시면 만세 3번 불러요~ "만만만세"

void *MyFunction(void *s_Data)
{
  /* 뭔가 하는 함수 */
 return(s_Data);
}

void list_init(List *list, void (*destroy)(void *data)) 
{ 
   list -> size = 0; 
   list -> destroy = destroy; 
   list -> head = NULL; 
   list -> tail = NULL; 
   return; 
}

int main(void)
{
  List *s_MyList;
  /* s_MyList 에 관련된 생성하는 부분. */

  /* 호출 */
  list_init(s_MyList, MyFunction);
  return(0);
}
waltherppk의 이미지

둘다 안되요... ㅠㅠ

nangchang의 이미지

void list_init(List *list, void (*destroy)(void *data)) 
{
   ...
}

라면...

void MyFunction(void *s_Data)
{
   ...
}

이런 모양의 함수를 넘겨야 되는거 아닌가요?

lovehis의 이미지

대충 이런식.....

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

waltherppk의 이미지

고맙습니다.~~~~~

해결되었어요!!!!!!!

만세~~ 만세~~ 만세~~

답변해주신분들 다시한번 감사드립니다.

(^^) (__) 꾸벅

맹고이의 이미지

list_init이 정의되어있는 *.c 파일을 같이
컴파일 하지 않은게 아닌가요-_-a
아니면 선언이랑 정의가 다르다던지요..

waltherppk의 이미지

예... 컴파일을 잘못했어요...

^^ㅋ

정말 제 머리가 돌머리같군요...

다시한번 답변해주신분들 감사드립니다....

귀찮으시겠지만 자주 질문 올리겠습니다....

(^^) (__) 꾸벅

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.