<![CDATA[Latest posts for the topic "Function Pointer trong C++"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Function Pointer trong C++ /*constructive.c Constructive Solid Geometry*/ #include <GL/glut.h> #include <stdlib.h> #include <math.h> void firstInsideSecond(void (*a) (void), void (*b) (void), GLenum face, GLenum test) { glEnable(GL_DEPTH_TEST); glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glCullFace(face); /* controls which face of a to use */ a(); /* draw a face of a into depth buffer */ /* use stencil plane to find parts of a in b */ glDepthMask(GL_FALSE); glEnable(GL_STENCIL_TEST); glStencilFunc(GL_ALWAYS, 0, 0); glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); glCullFace(GL_BACK); b(); /* increment the stencil where the front face of b is drawn */ glStencilOp(GL_KEEP, GL_KEEP, GL_DECR); glCullFace(GL_FRONT); b(); /* decrement the stencil buffer where the back face of b is drawn */ glDepthMask(GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(test, 0, 1); glDisable(GL_DEPTH_TEST); glCullFace(face); a(); /* draw the part of a that's in b */ } void fixDepth(void (*a) (void)) { glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glEnable(GL_DEPTH_TEST); glDisable(GL_STENCIL_TEST); glDepthFunc(GL_ALWAYS); a(); /* draw the front face of a, fixing the depth buffer */ glDepthFunc(GL_LESS); } /* "and" two objects together */ void and(void (*a) (void), void (*b) (void)) { firstInsideSecond(a, b, GL_BACK, GL_NOTEQUAL); fixDepth(b); firstInsideSecond(b, a, GL_BACK, GL_NOTEQUAL); glDisable(GL_STENCIL_TEST); /* reset things */ } /* subtract b from a */ void sub(void (*a) (void), void (*b) (void)) { firstInsideSecond(a, b, GL_FRONT, GL_NOTEQUAL); fixDepth(b); firstInsideSecond(b, a, GL_BACK, GL_EQUAL); glDisable(GL_STENCIL_TEST); /* reset things */ }   Sau đó tớ include file này vào trong file main.cpp để sử dụng các hàm trong file đó. Nội dụng trong file main.cpp như sau:
#include "constructive.c" class CMaSim { public: ... void Subtract(); void RenderCutter(); void RenderObject(); ... } void CMaSim::Subtract() { sub( RenderCutter, RenderObject); // <----- bi ba'o loi
Sau khi chạy thì bị báo lỗi ở dòng màu vàng trên với nội dung lỗi là
error C2664: 'sub' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void) 
Giờ ko biết sửa thế nào đây, mong các bạn đưa ra giải pháp giúp đỡ]]>
/hvaonline/posts/list/16903.html#101525 /hvaonline/posts/list/16903.html#101525 GMT
Function Pointer trong C++ /hvaonline/posts/list/16903.html#101527 /hvaonline/posts/list/16903.html#101527 GMT Re: Function Pointer trong C++ pointer-to-member-function và pointer-to-function. Pointer-to-member-function có dạng (lấy ví dụ của bạn nhé): Code:
void RenderCutter(CMaSim::*)(void)
là một thành phần non-static của class CMaSim. Trong khi đó, nếu RenderCutter là một function đơn lẻ, nó sẽ có dạng: Code:
void RenderCutter(*)(void)
Với đoạn code trên mình có 2 cách sửa:
  • [*](Thông dụng) Thêm một member static, giả sử: Code:
  • class CMaSim
    {
        public:
        void Subtract();
    	void RenderCutter();
        static void staticRenderCutter() {
        }
    	void RenderObject();
        static void staticRenderObject() {
        }
    };
    Lúc đó bạn gọi Code:
  • sub(staticRenderCutter, staticRenderObject);
    như bình thường [*](Dễ dùng hơn) Dùng wrapper function, như thế này chẳng hạn Code:
  • CMaSim *wrapperObj;
    
    void wrapperRenderCutter() {
    	return wrapperObj->RenderObject();
    }
    
    void wrapperRenderObject() {
    	return wrapperObj->RenderObject();
    }
    Lúc đó, bạn gọi: Code:
  • sub( wrapperRenderCutter, wrapperRenderObject );
    là ổn
Chúc bạn thành công. P.S: Mod sửa lại thẻ list giùm mình với :(, sao BBCode nó không lên nhỉ]]>
/hvaonline/posts/list/16903.html#101537 /hvaonline/posts/list/16903.html#101537 GMT
Re: Function Pointer trong C++ Code:
void CMaSimView:Subtract()
{
  glEnable(GL_DEPTH_TEST);
  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glCullFace(GL_FRONT);     /* controls which face of a to use */
  RenderCutter();                  /* draw a face of a into depth buffer */

  /* use stencil plane to find parts of a in b */
  glDepthMask(GL_FALSE);
  glEnable(GL_STENCIL_TEST);
  glStencilFunc(GL_ALWAYS, 0, 0);
  glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
  glCullFace(GL_BACK);
  RenderObject();             /* increment the stencil where the front face of b is 
                           drawn */
  glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
  glCullFace(GL_FRONT);
  RenderObject();             /* decrement the stencil buffer where the back face of b is drawn */

  glDepthMask(GL_TRUE);
  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

  glStencilFunc(GL_NOTEQUAL, 0, 1);
  glDisable(GL_DEPTH_TEST);

  glCullFace(GL_FRONT);
 RenderCutter();

  ////////////////////
  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glEnable(GL_DEPTH_TEST);
  glDisable(GL_STENCIL_TEST);
  glDepthFunc(GL_ALWAYS);
  RenderObject();                  /* draw the front face of a, fixing the depth buffer */
  glDepthFunc(GL_LESS);
  /////////////////

  glEnable(GL_DEPTH_TEST);
  glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
  glCullFace(GL_BACK);     /* controls which face of a to use */
  RenderObject();                  /* draw a face of a into depth buffer */

  /* use stencil plane to find parts of a in b */
  glDepthMask(GL_FALSE);
  glEnable(GL_STENCIL_TEST);
  glStencilFunc(GL_ALWAYS, 0, 0);
  glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
  glCullFace(GL_BACK);
  RenderCutter();                  /* increment the stencil where the front face of b is 
                           drawn */
  glStencilOp(GL_KEEP, GL_KEEP, GL_DECR);
  glCullFace(GL_FRONT);
  RenderCutter();                  /* decrement the stencil buffer where the back face
                           of b is drawn */
  glDepthMask(GL_TRUE);
  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);

  glStencilFunc(GL_EQUAL, 0, 1);
  glDisable(GL_DEPTH_TEST);

  glCullFace(GL_BACK);
 RenderObject();

  glDisable(GL_STENCIL_TEST);
}
]]>
/hvaonline/posts/list/16903.html#101842 /hvaonline/posts/list/16903.html#101842 GMT