함수포인터 질문입니다.

alwaysN00b의 이미지

struct 안에 함수포인터를 포함 시키는 방법은 없나요?

꼭 struct 을 사용하지 않고
함수 set(?) 을 넘겨줄수 있어도 좋습니다.

질문이 부족한것 같습니다만 코드좀 봐주시길 ^^

void bf(int);
void af(int);

typedef struct Renderor {

        void (*fn_bf)();
        void (*fn_af)();

        fn_bf = bf;
        fn_af = af;

} Renderor;


void makeupIndex();
void myrenderor(Renderor);
int main(){

        makeupIndex();

}

void makeupIndex(){
        //call function

        myrenderor(renderor);
}

void myrenderor(Renderor p){
        (*(p.fn_bf))(1);
        (*(p.fn_af))(2);
}

void bf(int a){
        printf("bf : %d \n",a);
}
void af(int a){
        printf("af : %d \n",a);
}
익명 사용자의 이미지

fn_bf = bf;
fn_af = af;

이 부분을 별도의 생성자 함수를 만들어서 처리하십시오.

C++이라면 생성자에 써주면 되고, C라면 createRenderor() 와 같은 함수를 만들어서 다음과 같이 처리하십시오.

Renderor *p = createRenderor();

mr.lee의 이미지

윗 분이 잘 설명해 주셨네요.
이를테면 이런식이겠죠...

#include <iostream>


void bf(int);
void af(int);

struct Renderor {

   void (*fn_bf)(int);
   void (*fn_af)(int);
   Renderor() : fn_bf(bf), fn_af(af) {}

} renderor;


void makeupIndex();
void myrenderor(Renderor);

int main(){

   makeupIndex();

}

void makeupIndex() {
   //call function
   myrenderor(renderor);
}

void myrenderor(Renderor p){
   (*(p.fn_bf))(1);
   (*(p.fn_af))(2);
}

void bf(int a){
   printf("bf : %d \n",a);
}
void af(int a) {
   printf("af : %d \n",a);
}
alwaysN00b의 이미지

답변 감사드립니다.

struct 안에서 저런 코드를 사용하고선

에러나는 이유는 몰랐습니다.

언제나 시작

익명 사용자의 이미지

typedef int (*Render_t)(int x, int y, void *msg);

typedef struct tagRender {
   int fd;
   Render_t print_it;
}MyRender_t;

//////
int print_horizontal( int x, int y, void *msg)
{
   printf("x = %d, y = %d, msg=[%s]\n", x, y, (char *)msg);

   return 999;
}

int print_vertical( int x, int y, void *msg)
{
   printf("x = %d\n", x);
   printf("y = %d\n", y);
   printf("msg[%s]\n", (char *)msg);

   return 2005;
}

int main()
{
  MyRender_t mTest;

   printf("---- start 1----\n");
   mTest.print_it = print_horizontal;
   mTest.print_it(1,2,"hello world");
   printf("---- start 2 ----\n");
   mTest.print_it = print_vertical;
   mTest.print_it(1,2,"hello world");
   printf("---- e n d ----\n");

   return 0;
}
alwaysN00b의 이미지

typedef int (*fn_Renderor)(Renderor *); 

typedef struct Renderor { 
		int val1;
		int val2;
        fn_Renderor fn_bf;
        fn_Renderor fn_af; 
} Renderor; 

Renderor *createRenderor(int fooval1,int fooval2,void (*fn1)(),void (*fn2)())
{
	Renderor *rs;
	rs = (Renderor *)malloc(sizeof(Renderor));
	
	rs->val1 = fooval1;
	rs->val2 = fooval2;
	rs->fn_bf = fn1;
	rs->fn_af = fn2;
	
	return rs;
}

void makeupIndex(Redneror *); 

int main(){ 

	Renderor *myRenderor ;
	myRenderor = createRenderor(fooval1,fooval2,bf,af);
	
	makeupIndex(myRenderor); 

} 

void makeupIndex(Renderor *p){ 
        (*(p->fn_bf))(p); 
        (*(p->fn_af))(p); 
} 

void bf(Renderor *thiss){ 
        printf("bf : %d \n",thiss->val1); 
} 
void af(Renderor *thiss){ 
        printf("af : %d \n",thiss->val2); 
}

답변 감사드립니다.

요고 비슷하게 만들려고 합니다. ^^

언제나 시작

댓글 달기

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