Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[OpenGL, C++] wglGetProcAddress - error: invalid conversion from ‘const char*’ to ‘const GLubyte*’

Ostatnio zmodyfikowano 2014-02-21 17:26
Autor Wiadomość
xyc1993
Temat założony przez niniejszego użytkownika
[OpenGL, C++] wglGetProcAddress - error: invalid conversion from ‘const char*’ to ‘const GLubyte*’
» 2014-02-21 13:33:13
Witam, ucze sie samodzielnie bilbioteki OpenGL korzystajac z kursu dostepnego na tej stronie oraz ksiazki "OpenGL w praktyce" J. Ganczarskiego
Mam problem z programem z rozdz. "Światła i materiały": http://cpp0x.pl/kursy​/Kurs-OpenGL-C++​/Swiatla-i-materialy/226. Ten sam blad wystepuje mi w pliku: "swiatlo_kierunkowe.cpp" oraz "reflektor.cpp" Kod ze strony skopiowalem bez wprowadzania zmian.

Problem lezy w tej czesci kodu:
C/C++
void ExtensionSetup()
{
    // pobranie numeru wersji biblioteki OpenGL
    const char * version =( char * ) glGetString( GL_VERSION );
   
    // odczyt wersji OpenGL
    int major = 0, minor = 0;
    if( sscanf( version, "%d.%d", & major, & minor ) != 2 )
    {
        #ifndef WIN32
        printf( "Błędny format wersji OpenGL\n" );
        #else
       
        printf( "Bledny format wersji OpenGL\n" );
        #endif
       
        exit( 0 );
    }
   
    // sprawdzenie czy jest co najmniej wersja 1.4
    if( major > 1 || minor >= 4 )
    {
        // pobranie wskaźnika wybranej funkcji OpenGL 1.4
        glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress( "glWindowPos2i" ); //linijka 669
    }
    else
    // sprawdzenie czy jest obsługiwane rozszerzenie ARB_window_pos
    if( glutExtensionSupported( "GL_ARB_window_pos" ) )
    {
        // pobranie wskaźnika wybranej funkcji rozszerzenia ARB_window_pos
        glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress( "glWindowPos2iARB" ); //linijka 676
    }
    else
    {
        printf( "Brak rozszerzenia ARB_window_pos!\n" );
        exit( 0 );
    }
}

Otrzymuje blad:
13d.cpp: In function ‘void ExtensionSetup()’:
13d.cpp:669: error: invalid conversion from ‘const char*’ to ‘const GLubyte*’
13d.cpp:669: error:   initializing argument 1 of ‘void (* glXGetProcAddressARB(const GLubyte*))()’
13d.cpp:676: error: invalid conversion from ‘const char*’ to ‘const GLubyte*’
13d.cpp:676: error:   initializing argument 1 of ‘void (* glXGetProcAddressARB(const GLubyte*))()’

Programy pisze i kompiluje na Linuxie Debian na VirtualBoxie, korzystam z takich flag przy kompliowaniu: -lGL -lGLU -lglut

EDIT:
Sprawdziłem pliki również na Windowsie 7 przy pomocy Microsoft Visual C++ 2010 Express. W przypadku Windowsa, występują inne błędy przy linijkach 669 i 676:
669: error C2659: '=' : function as left operand
676: error C2659: '=' : function as left operand

Ponadto występuje też dodatkowy błąd:
main.cpp(22): error C2365: 'glWindowPos2i' : redefinition; previous definition was 'function'
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\gl\glext.h(444) : see declaration of 'glWindowPos2i'

A oto linijka odpowiadająca temu błędowi:
PFNGLWINDOWPOS2IPROC glWindowPos2i = NULL;
P-105049
Gabes
» 2014-02-21 15:27:33
Pobierz Ze strony OpenGL najnowszą bibliotekę
<GL/glext.h> czy <GL/wglext.h> nie wiem co tam dokładnie należy pobrać do 'Visuala' do MinGW w Code::Blocks wystarczył ten pierwszy.Chodzi właśnie o rozszerzenia. 
P-105058
xyc1993
Temat założony przez niniejszego użytkownika
» 2014-02-21 16:17:57
Wielkie dzięki za odpowiedź, na Windowsie problem działa bez problemu, faktycznie wystarczyło pobrać najnowsze biblioteki.

EDIT:
Za to przy Debianie na VisualBoxie nadal sie nie kompiluje, mimo pobrania najnowszych bibliotek.

Przy linijce:
glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress( "glWindowPos2i" );
Wyskakuja bledy:
13d.cpp: In function ‘void ExtensionSetup()’:
13d.cpp:669: error: invalid conversion from ‘const char*’ to ‘const GLubyte*’
13d.cpp:669: error:   initializing argument 1 of ‘void (* glXGetProcAddressARB(const GLubyte*))()’

I analogicznie przy:
glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress( "glWindowPos2iARB" );
Taki jest blad:
13d.cpp:676: error: invalid conversion from ‘const char*’ to ‘const GLubyte*’
13d.cpp:676: error:   initializing argument 1 of ‘void (* glXGetProcAddressARB(const GLubyte*))()’


Nie wiem co z tym zrobic, gdzie problem. Caly kod skopiowalem dokladnie stad: http://cpp0x.pl/kursy​/Kurs-OpenGL-C++​/Swiatla-i-materialy/226 plik "swiatlo_kierunkowe.cpp"
P-105065
DejaVu
» 2014-02-21 17:03:39
To są zupełnie inne błędy i wystarczy poprawić rzutowanie typu.

/edit:
W poniższym kodzie nie ma glXGetProcAddressARB, więc albo wglGetProcAddress albo glutExtensionSupported jest makrem 'dziwnie' zdefiniowanym.

C/C++
void ExtensionSetup()
{
    // pobranie numeru wersji biblioteki OpenGL
    const char * version =( char * ) glGetString( GL_VERSION );
   
    // odczyt wersji OpenGL
    int major = 0, minor = 0;
    if( sscanf( version, "%d.%d", & major, & minor ) != 2 )
    {
        #ifndef WIN32
        printf( "Błędny format wersji OpenGL\n" );
        #else
       
        printf( "Bledny format wersji OpenGL\n" );
        #endif
       
        exit( 0 );
    }
   
    // sprawdzenie czy jest co najmniej wersja 1.4
    if( major > 1 || minor >= 4 )
    {
        // pobranie wskaźnika wybranej funkcji OpenGL 1.4
        glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress( "glWindowPos2i" );
    }
    else
    // sprawdzenie czy jest obsługiwane rozszerzenie ARB_window_pos
    if( glutExtensionSupported( "GL_ARB_window_pos" ) )
    {
        // pobranie wskaźnika wybranej funkcji rozszerzenia ARB_window_pos
        glWindowPos2i =( PFNGLWINDOWPOS2IPROC ) wglGetProcAddress
        ( "glWindowPos2iARB" );
    }
    else
    {
        printf( "Brak rozszerzenia ARB_window_pos!\n" );
        exit( 0 );
    }
}

Sprawdź sobie:
C/C++
wglGetProcAddress(( const GLubyte * ) "glWindowPos2iARB" );
P-105068
xyc1993
Temat założony przez niniejszego użytkownika
» 2014-02-21 17:26:24
Dzięki za odpowiedź. Teraz już wszystko działa bezproblemowo.
P-105070
« 1 »
  Strona 1 z 1