void *에 구조체를 넘기기에 대한 질문입니다.

초코리의 이미지

void *에 구조체를 넘길때 계속 컴파일 에러가 나서 질문드립니다.

                                                                                                          
typedef struct{
        int b;
}STRUCT_TYPE;
                                                                                                          
void test_func(void  * d){
       int a;
                                                                                                          
       a =  (STRUCT_TYPE)d->b;
}

이렇게 쓰면 컴파일시에 void *는 구조체나 공용체가 아니라 라는 에러가 나더군요. 타입 캐스팅해서 쓰면 될것 같은데 안되었습니다.
                                                                                                          
typedef struct{
        int b;
}STRUCT_TYPE;
                                                                                                          
void test_func(STRUCT_TYPE  * d){//void *를 인자로 받은 다름 함수에서넘어옴
       int a;
                                                                                                          
       a =  d->b;
}

이렇게 쓰면 컴파일 이상없이 잘돌아 가는데요. 처음 방법처럼 타입 캐스팅 해서 쓰는 방법은 없는지 알고 싶습니다.

그리고 질문 한가지더 있습니다.

(void)(fn *)(int,short,void *)로 받는 인자로 함수가 있습니다.

  event_set(struct event *ev, int fd, short event, void (*fn)(int, short, void *), void *arg);

위와 같은 함수가 그런데요 저기서
(void)(fn *)(int,short,void *)를 (void)(fn*)(int,short,struct *) 이런함수를 사용하니 인자가 틀리다고 경고가 나더군요..

그래서 타입캐스팅을 하여 넘기려 하는데 어떤방식으로 타입캐스팅을 하면될까요 ...

전그냥 ((void)(*)(int,short,struct *)) func 라고 썼는데 에러가 나더군요..

bugiii의 이미지

a = (STRUCT_TYPE)d->b;

별이 빠졌네요.

a = (STRUCT_TYPE*)d->b;

그리고,

((void)(*)(int,short,struct *)) 이건... struct 다음에 구분자가 없으니 문법 에러에 일단 걸리겠네요.

그리고 받는 쪽 함수 포인터의 마지막 인자는 void* 이니까 그냥

((void)(*)(int,short,void *)) 이걸로 캐스팅하시면 되지 않을까요?

그리고 함수 포인터는 왠만하면 typedef로 하시는게 보기도 좋고 이해하기도 좋습니다.

그럼, 이만...

초코리의 이미지

답변 감사드립니다. 실제로 간단하게 만들어서 테스트 하고 있는

코드 입니다.

 #include <stdio.h>
                                                                                
typedef struct{
        int b;
}STRUCT_TYPE;
                                                                                
void test_func(void  * d){
        int a;
        a = (STRUCT_TYPE*)d->b;
        printf("");
}
void func(void  *c){
        printf("");
        test(c);
}
                                                                                
                                                                                
int main(void){
        STRUCT_TYPE a;
                                                                                
        a.b = 7;
        func(&a);
                                                                                
        printf("");
        return 0;
}

[root@chokori struct]# gcc -o struct struct.c
struct.c: In function `test_func':
struct.c:9: warning: dereferencing `void *' pointer
struct.c:9: request for member `b' in something not a structure or union
[root@chokori struct]#

bugiii님 께서 이야기 해주신데로도 해봤었는데 계속 에러가 나네요.

저렇게 일단 넘기고 캐스팅하면 안되나요??

그리고

 event_set(&event_group[local_for_loop].ev,event_group[local_for_loop].fd,
                        event_group[local_for_loop].event_type,
                        ((void)(*)(int,short,void *))call_back_func,
                        &event_group[local_for_loop].ev);

이렇게 해봤지만 여전히 에러가 나네요....
advanced의 이미지

        a = (STRUCT_TYPE*)d->b;
        printf("");

일단 다른 내용은 그만 두더라도 9라인을 아래와 같이 바꾸어 줘야 할것

같습니다

        a = ((STRUCT_TYPE*)d)->b;
        printf("");

- advanced -

초코리의 이미지

Advanced wrote:
        a = (STRUCT_TYPE*)d->b;
        printf("");

일단 다른 내용은 그만 두더라도 9라인을 아래와 같이 바꾸어 줘야 할것

같습니다

        a = ((STRUCT_TYPE*)d)->b;
        printf("");

- advanced -

그냥

        a = (STRUCT_TYPE*)d->b;
        printf("");

이렇게 하면 될줄 알았는데 전체를 묶어

줘야 하는군요.

답변 감사합니다. 점심 시간이네요.. 점심 맛있게 드세요
..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.