2011-09-15 13 views
3

私は仕事のために数時間前にopenGLを学んだばかりで、テッセレーションを使って凹面ポリゴンをレンダリングすることを任されています。私は、関連する章もavailable onlineことで、OpenGL Programming Guide, Seventh Editionから得ているOpenGLでコールバックを登録するときのコンパイルエラー

#ifndef CALLBACK 
#define CALLBACK 
#endif 

#include "GL/gl.h" 
#include "GL/glu.h" 

void CALLBACK beginCallback(GLenum which); 

void drawHook() 
{ 
    GLUtesselator* tessObj = gluNewTess(); 
    gluTessCallback(tessObj, GLU_TESS_BEGIN, beginCallback); 
} 

void CALLBACK beginCallback(GLenum which) 
{ 
    glBegin(which); 
} 

:私は、次のコードをコンパイルしようとしています。しかし、次のエラーが返される:

hook.cc:28: error: invalid conversion from ‘void (*)(GLenum)’ to ‘void (*)()’ 
hook.cc:28: error: initializing argument 3 of ‘void gluTessCallback(GLUtesselator*, GLenum, void (*)())’ 

このエラーはgluTessCallbackの3番目の引数は引数を取らない関数で、まだそうでない場合は「公式」のOpenGL参照状態であることを信じるように私をリード。

ここに何か不足しているか、本が間違っていますか?

答えて

2

本は正しいです。関数ポインタをvoid(*)()にキャストするだけです。タイプは正確ではありません(正確ではありません)ので、必要です。あなたがリンクされ

gluTessCallback(tessObj, GLU_TESS_BEGIN, (void(*)())&beginCallback); 
2

ドキュメントはgluTessCallbackの3番目の引数はパラメータなしの関数であることを述べています。 (右見出しテッセレーションコールバックルーチン後)

しかし、実施例11-1パラメータなしいずれかに実際の関数ポインタをキャスト:

gluTessCallback(tobj, GLU_TESS_ERROR, (GLvoid (*)()) &errorCallback); 
             ^^^^^^^^^^^^^^^ 
関連する問題