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

Rozbijanie kodu na parę plików.

Ostatnio zmodyfikowano 2016-06-11 03:24
Autor Wiadomość
Rashmistrz
Temat założony przez niniejszego użytkownika
Rozbijanie kodu na parę plików.
» 2016-06-10 22:51:32
Ostatnio bawię się z OpenGL'em.
Jako, że kod coraz bardziej rośnie,
a nie chcę szukać czegoś w całym gąszczu funkcji,
więc postanowiłem, że przeniosę większość funkcji
do osobnych plików *.cpp, jednakże po zrobieniu
tego wywalane są błędy do tych jakbym nie załączył
odpowiednich nagłówków do projektu...

(Pliki zostały dodane do projektu po utworzeniu.)

Tu przykładowy kod:
C/C++
#include <windows.h>    // nagłówek dla windowsa
#include <gl\gl.h>      // nagłówek dla opengl32
#include <gl\glu.h>     // nagłowek dla glu32
// #include <gl\glaux.h>   // nagłówek dla glaux

HGLRC hRC = NULL; // kontekst renderownia
HDC hDC = NULL; // kontekst graficzny
HWND hWnd = NULL; // uchwyt okna
HINSTANCE hInstance; // instancja aplikacji

bool keys[ 256 ]; // Stan klawiszy
bool active = TRUE; // flaga zminimalizowania, domyœlnie na true
bool fullscreen = FALSE; // tryb pełnoekranowy. domyślnie na false

GLfloat rtri = 0.0f; // Kąt obrotu trójkąta
GLfloat rquad = 0.0f; // Kąt obroty czworokąta

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); // deklaracja funkcji

GLvoid ReSizeGLScene( GLsizei width, GLsizei height )
{
    if( height == 0 ) // zapobiegnij dzieleniu przez zero...
         height = 1; // ...ustawiając liczbę 1
   
    glViewport( 0, 0, width, height ); // zresetuj pole widzenia
    glMatrixMode( GL_PROJECTION ); // wybierz macierz projekcji
    glLoadIdentity(); // zresetuj ją
   
    // oblicz perspektywę dla okna
    gluPerspective( 45.0f,( GLfloat ) width /( GLfloat ) height, 0.1f, 100.0f );
    glMatrixMode( GL_MODELVIEW ); // wybierz macier modeli
    glLoadIdentity(); // zresetuj ją
}

GLint InitGL( void )
{
    glShadeModel( GL_SMOOTH );
    glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
    glClearDepth( 1.0f ); // ustawienie bufora głebi
    glEnable( GL_DEPTH_TEST ); // włączenie testowania głębi
    glDepthFunc( GL_LEQUAL ); // ustawienie typu testowania
    glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
    return TRUE;
}

GLint DrawGLScene( void ) // Tu wszystko rysujemy
{
    glClear( GL_COLOR_BUFFER_BIT |
    GL_DEPTH_BUFFER_BIT ); // Wyczyść ekran i bufor głębi
    glLoadIdentity(); // Zresetuj widoczek
    glTranslatef( - 1.5f, 0.0f, - 6.0f ); // Przesuń w lewo i w ekran (oddal)
    glRotatef( rtri, 0.0f, 1.0f, 0.0f ); // Obróć piramidę wokół osi Y
   
    glBegin( GL_TRIANGLES ); // Zacznij rysowanie piramidy
    glColor3f( 1.0f, 0.0f, 0.0f ); // Czerwony
    glVertex3f( 0.0f, 1.0f, 0.0f ); // Góra trójkąta (Przednia)
    glColor3f( 0.0f, 1.0f, 0.0f ); // Zielony
    glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Lewy punkt trójkąta (Przednia)
    glColor3f( 0.0f, 0.0f, 1.0f ); // Niebieski
    glVertex3f( 1.0f, - 1.0f, 1.0f ); // Prawy punkt trójkąta (Przednia)
   
    glColor3f( 1.0f, 0.0f, 0.0f ); // Czerwony
    glVertex3f( 0.0f, 1.0f, 0.0f ); // Góra trójkąta (Prawa)
    glColor3f( 0.0f, 0.0f, 1.0f ); // Niebieski
    glVertex3f( 1.0f, - 1.0f, 1.0f ); // Lewy punkt trójkąta (Prawa)
    glColor3f( 0.0f, 1.0f, 0.0f ); // Zielony
    glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Prawy punkt trójkąta (Prawa)
   
    glColor3f( 1.0f, 0.0f, 0.0f ); // Czerwony
    glVertex3f( 0.0f, 1.0f, 0.0f ); // Góra trójkąta (Tylna)
    glColor3f( 0.0f, 1.0f, 0.0f ); // Zielony
    glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Lewy punkt trójkąta (Tylna)
    glColor3f( 0.0f, 0.0f, 1.0f ); // Niebieski
    glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Prawy punkt trójkąta (Tylna)
   
    glColor3f( 1.0f, 0.0f, 0.0f ); // Czerwony
    glVertex3f( 0.0f, 1.0f, 0.0f ); // Góra trójkąta (Lewa)
    glColor3f( 0.0f, 0.0f, 1.0f ); // Niebieski
    glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Lewy punkt trójkąta (Lewa)
    glColor3f( 0.0f, 1.0f, 0.0f ); // Zielony
    glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Prawy punkt trójkąta (Lewa)
    glEnd(); // Zakończ rysowanie piramidy :)
   
    glLoadIdentity();
    glTranslatef( 1.5f, 0.0f, - 7.0f ); // Przesuń w prawo i oddal
    glRotatef( rquad, 1.0f, 1.0f, 1.0f ); // Obróć sześcian wokół osi X, Y i Z
   
    glBegin( GL_QUADS ); // Zacznij rysowanie sześcianu
    glColor3f( 0.0f, 1.0f, 0.0f ); // Zielony
    glVertex3f( 1.0f, 1.0f, - 1.0f ); // Prawy górny punkt (Góra)
    glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Lewy górny punkt (Góra)
    glVertex3f( - 1.0f, 1.0f, 1.0f ); // Lewy dolny punkt (Góra)
    glVertex3f( 1.0f, 1.0f, 1.0f ); // Prawy dolny (Góra)
   
    glColor3f( 1.0f, 0.5f, 0.0f ); // Pomarańczowy
    glVertex3f( 1.0f, - 1.0f, 1.0f ); // Prawy górny (Dół)
    glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Lewy górny (Dół)
    glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Lewy dolny (Dół)
    glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Prawy dolny (Dół)
   
    glColor3f( 1.0f, 0.0f, 0.0f ); // Czerwony
    glVertex3f( 1.0f, 1.0f, 1.0f ); // Prawy górny (Przód)
    glVertex3f( - 1.0f, 1.0f, 1.0f ); // Lewy górny (Przód)
    glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Lewy dolny (Przód)
    glVertex3f( 1.0f, - 1.0f, 1.0f ); // Prawy dolny (Przód)
   
    glColor3f( 1.0f, 1.0f, 0.0f ); // Żółty
    glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Lewy dolny (Tył)
    glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Prawy dolny (Tył)
    glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Prawy górny (Tył)
    glVertex3f( 1.0f, 1.0f, - 1.0f ); // Lewy górny (Tył)
   
    glColor3f( 0.0f, 0.0f, 1.0f ); // Niebieski
    glVertex3f( - 1.0f, 1.0f, 1.0f ); // Prawy górny (Lewa)
    glVertex3f( - 1.0f, 1.0f, - 1.0f ); // Lewy górny (Lewa)
    glVertex3f( - 1.0f, - 1.0f, - 1.0f ); // Lewy dolny (Lewa)
    glVertex3f( - 1.0f, - 1.0f, 1.0f ); // Prawy dolny (Lewa)
   
    glColor3f( 1.0f, 0.0f, 1.0f ); // Fioletowy
    glVertex3f( 1.0f, 1.0f, - 1.0f ); // Prawy górny (Prawa)
    glVertex3f( 1.0f, 1.0f, 1.0f ); // Lewy górny (Prawa)
    glVertex3f( 1.0f, - 1.0f, 1.0f ); // Lewy dolny (Prawa)
    glVertex3f( 1.0f, - 1.0f, - 1.0f ); // Prawy dolny (Prawa)
    glEnd(); // Zakończ rysowanie czworokąta
   
    rtri += 0.125f; // Zwiększ licznik obrotu trójkąta
    rquad -= 0.0625f; // Zmniejsz licznik obrotu czworokąta
    return TRUE; // Wszystko ok
}

GLvoid KillGLWindow( void )
{ // zamknij okno
    if( fullscreen )
    { // przywróc rozdzielczość
        ChangeDisplaySettings( NULL, 0 );
        ShowCursor( TRUE ); // pokaż kursor
    }
   
    if( hRC )
    { // mamy kontekst renderu
        if( !wglMakeCurrent( NULL, NULL ) ) // Czy jesteśmy w stanie zwolnić go
        MessageBox( NULL, "Nie można zwolnić hDC lub hRC!",
             "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION );
       
        if( !wglDeleteContext( hRC ) ) // Czy możemy usunąć kontekst renderu?
        MessageBox( NULL, "Nie można usunąć kontekstu renderowania",
             "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION );
       
        hRC = NULL;
    }
   
    if( hDC && !ReleaseDC( hWnd, hDC ) )
    {
        // Czy możemy zwolnić hDC?
        MessageBox( NULL, "Nie można zwolnić kontekstu urządzenia (DC)",
        "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION );
        hDC = NULL; // Ustawiamy DC na NULL
    }
   
    if( hWnd && !DestroyWindow( hWnd ) )
    {
        // Czy możemy zwolnić uchwyt okna?
        MessageBox( NULL, "Nie można zwolnić hWnd",
        "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION );
        hWnd = NULL; // Ustaw hWnd na Null
    }
   
    if( !UnregisterClass( "OpenGL", hInstance ) )
    {
        // Czy możemy wyrejstrować klasę okna?
        MessageBox( NULL, "Nie można wyrejstrować klasy okna",
        "BŁĄD ZAMYKANIA", MB_OK | MB_ICONINFORMATION );
        hInstance = NULL; // Ustawiamy instancję na NULL
    }
}

GLboolean CreateGLWindow( char * title, int width, int height, int bits, bool fullscreenflag )
{
    GLuint PixelFormat; // Będzie przechowywać znaleziony format piksela
    WNDCLASS wc; // Struktura klasy okna
    DWORD dwExStyle; // Rozszerzony styl okna
    DWORD dwStyle; // Normalny styl okna
    RECT WindowRect; // Tu będą rozmiary okna ;)
    WindowRect.left =( long ) 0; // Początek szerokości (od lewej) ma 0
    WindowRect.right =( long ) width; // Szerokośc bierzemy z parametru naszej funkcji
    WindowRect.top =( long ) 0; // Wysokość też zaczynamy od 0 (od góry)
    WindowRect.bottom =( long ) height; // Ustawiamy wysokość z parametru naszej funkcji
    fullscreen = fullscreenflag; // Ustawiamy globalną zmienną
    hInstance = GetModuleHandle( NULL ); // Pobieramy instancję dla okna
    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Ustawiamy odmalowywanie
    wc.lpfnWndProc =( WNDPROC ) WndProc; // WndProc będzie obsługiwać komunikaty
    wc.cbClsExtra = 0; // nie ważne        // ^- możliwy udr, przy braku definicji
    wc.cbWndExtra = 0; // nie ważne
    wc.hInstance = hInstance; // Ustawiamy instancję
    wc.hIcon = LoadIcon( NULL, IDI_WINLOGO ); // Ikona domyślna
    wc.hCursor = LoadCursor( NULL, IDC_ARROW ); // Kursor - strzałka
    wc.hbrBackground = NULL; // Tło nie jest ważne w OpenGL
    wc.lpszMenuName = NULL; // Nie chcemy menu
    wc.lpszClassName = "OpenGL"; // Nazwa klasy okna
   
    if( !RegisterClass( & wc ) )
    {
        // Spróbuj zarejstrować klasę okna
        MessageBox( NULL, "Nie udało się zarejstrować klasy okna",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zakończ i zwróć fałsz.
    }
   
    if( fullscreen )
    {
        // Czy ma być pełny ekran ?
        DEVMODE dmScreenSettings; // Tryb karty graficznej
        memset( & dmScreenSettings, 0, sizeof( dmScreenSettings ) ); // Wyczyść pamięć
        dmScreenSettings.dmSize = sizeof( dmScreenSettings ); // Ustaw rozmiar tej struktury
        dmScreenSettings.dmPelsWidth = width; // Wybież żądaną szerokość
        dmScreenSettings.dmPelsHeight = height; // Wybierz żądaną wysokość
        dmScreenSettings.dmBitsPerPel = bits; // Wybierz głębie kolorów
        dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
       
        // Spróbuj ustawić pełny ekran. CDS_FULLSCREEN usuwa pasek start.
        if( ChangeDisplaySettings( & dmScreenSettings, CDS_FULLSCREEN ) != DISP_CHANGE_SUCCESSFUL )
        {
            // Jeśli się nie uda, przejdź do okna lub zakończ program
            if( MessageBox( NULL, "Tryb graficzny nie jest obsługiwany przez twoją"
            " kartę graf. Czy użyć zamiast niego okna?",
            "NeHe PL", MB_YESNO | MB_ICONEXCLAMATION ) == IDYES )
                 fullscreen = FALSE; // Tryb okienkowy. fullscreen na false.
            else
            {
                // Uwaga o zamykaniu
                MessageBox( NULL, "Program teraz się zamknie.",
                "BŁĄD", MB_OK | MB_ICONSTOP );
                return FALSE; // Zakończ i zwróć false
            }
        }
    }
   
    if( fullscreen )
    {
        // Wciąż jesteśmy w trybie pełno ekranowym
        dwExStyle = WS_EX_APPWINDOW; // Rozszerzony styl okna
        dwStyle = WS_POPUP; // Styl okna
        ShowCursor( FALSE ); // Ukryj kursor myszy
    }
    else
    {
        dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Rozszerzony styl okna
        dwStyle = WS_OVERLAPPEDWINDOW; // Styl okna
    }
   
    AdjustWindowRectEx( & WindowRect, dwStyle, FALSE, dwExStyle );
    if( !( hWnd = CreateWindowEx( dwExStyle, // Rozszerzony styl dla okna
    "OpenGL", // Nazwa klasy
    title, // Tytuł okna
    WS_CLIPSIBLINGS | // Wymagane style okna
    WS_CLIPCHILDREN | // Wymagane style okna
    dwStyle, // Wybrane style okna
    0, 0, // Pozycja okna
    WindowRect.right - WindowRect.left, // Szerokość
    WindowRect.bottom - WindowRect.top, // Wysokość
    NULL, // Nie używamy okna potomnego
    NULL, // Żadnego menu
    hInstance, // Instancja
    NULL ) ) ) // Nie dawaj nic do WM_CREATE
    {
        KillGLWindow(); // Zresetuj tryb ekranu
        MessageBox( NULL, "Nie można stworzyć okna.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwróć false
    }
    static PIXELFORMATDESCRIPTOR pfd = // pfd mówi oknu co chcemy
    {
        sizeof( PIXELFORMATDESCRIPTOR ), // Rozmiar opisu piksela
        1, // Numer wersji
        PFD_DRAW_TO_WINDOW | // Format musi obsługiwać okno
        PFD_SUPPORT_OPENGL | // Format musi obsługiwać OpenGL
        PFD_DOUBLEBUFFER, // Musi obsługiwać Podwójne buforowanie
        PFD_TYPE_RGBA, // i format RGBA
        bits, // Wybieramy głębie kolorów
        0, 0, 0, 0, 0, 0, // ignorujemy
        0, // Bez bufora alpha
        0, // Bit ignorujemy
        0, // ignorujemy
        0, 0, 0, 0, // ignorujemy
        16, // 16 bitowy bufor Z
        0, // ignorujemy
        0, // ignorujemy
        PFD_MAIN_PLANE, // Główna warstwa rysowania
        0, // zarezerwowane
        0, 0, 0 // ignorujemy maski warstw
    };
   
    if( !( hDC = GetDC( hWnd ) ) ) // Mamy kontekst urządzenia?
    {
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Nie można stworzyć kontekstu urządzenia.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
   
    if( !( PixelFormat = ChoosePixelFormat( hDC, & pfd ) ) )
    {
        // Czy windows znajdzie taki format pixela?
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Nie można znaleźć żądanego formatu piksela.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
   
    if( !SetPixelFormat( hDC, PixelFormat, & pfd ) )
    {
        // Czy możemy ustawić taki format
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Nie można ustawić żądanego formatu piksela.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
    if( !( hRC = wglCreateContext( hDC ) ) )
    {
        // Czy możemy pobrać hRC
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Nie można stworzyć kontekstu renderowania.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
    if( !wglMakeCurrent( hDC, hRC ) )
    {
        // Czy możemy aktywować kontekst renderowania?
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Nie można aktywować kontekstu renderowania.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
    ShowWindow( hWnd, SW_SHOW ); // Pokazujemy okno
    SetForegroundWindow( hWnd ); // Ustawiamy wyższy priorytet
    SetFocus( hWnd ); // Działanie klawiatury skierowujemy na okno
    ReSizeGLScene( width, height ); // Ustawiamy perspektywę
    if( !InitGL() )
    {
        // Czy GL zanicjował się ?
        KillGLWindow(); // Resetujemy ekran
        MessageBox( NULL, "Inicjacja niepomyślna.",
        "BŁĄD", MB_OK | MB_ICONEXCLAMATION );
        return FALSE; // zwracamy false
    }
    return TRUE;
}

LRESULT CALLBACK WndProc(
HWND hWnd, // uchwyt do okna
UINT uMsg, // Wiadomość dla okna
WPARAM wParam, // Dodatkowe informajce wiadomości
LPARAM lParam ) // Dodatkowe informajce wiadomości
{
    switch( uMsg ) // Sprawdź komunikaty okna
    {
    case WM_ACTIVATE: // Czy to wiadomość aktywowania?
        if( !HIWORD( wParam ) ) // Czy program jest aktywowany
             active = TRUE; // Program jest aktywny
        else
             active = FALSE; // Program nie jest aktywny
       
        return 0; // Powróć do pętli wiadomości
       
    case WM_SYSCOMMAND: // Czy to komenda systemowa?
        switch( wParam ) // Sprawdzimy typ
        {
        case SC_SCREENSAVE: // Zgaszacz ekranu chce się włączyć
        case SC_MONITORPOWER: // Monitor chce się wyłączyć
            return 0; // Anulujemy wygaszacze itp.
        }
        break; // koniec, gdy inne wartości wParam
       
    case WM_CLOSE: // Czy to rozkaz zamknięcia?
        PostQuitMessage( 0 ); // Wyślij wiadomość zamknięcia
        return 0; // skocz dalej
       
    case WM_KEYDOWN: // Czy klawisz został wciśnięty
        keys[ wParam ] = TRUE; // Odpowiednie pole zostaje ustawione
        return 0; // skocz dalej
       
    case WM_KEYUP: // Czy klawisz został wciśnięty
        keys[ wParam ] = FALSE; // Odpowiednie pole zostaje ustawione na false
        return 0; // skocz dalej
       
    case WM_SIZE: // Czy okno się zmieniło ?
        ReSizeGLScene( LOWORD( lParam ), HIWORD( lParam ) ); // Zmieniamy scene OpenGL
        return 0; // skocz dalej
    }
   
    // Reszta wiadomości idzie do windy
    return DefWindowProc( hWnd, uMsg, wParam, lParam );
}

int WINAPI WinMain(
HINSTANCE hInstance, // Instancja
HINSTANCE hPrevInstance, // Poprzednia instancja
LPSTR lpCmdLine, // Parametry z linii komend
int nCmdShow ) // Stan okna
{
    MSG msg; // Struktura przechowująca komunikaty okna
    BOOL done = FALSE; // Stan działania programu
   
   
    /* // Zapytaj o tryb ekranu
        if (MessageBox(NULL,"Czy chcesz być w pełnym ekranie?",
                       "Start?",MB_YESNO|MB_ICONQUESTION)==IDNO)
            fullscreen = FALSE; // tryb okienkowy */
   
    // Stwórz okno OpenGL
    if( !CreateGLWindow( "OpynGeeL", 640, 480, 16, fullscreen ) )
         return 0; // zakończ program
   
    while( !done )
    {
        if( PeekMessage( & msg, NULL, 0, 0, PM_REMOVE ) )
        {
            // są jakieś wiadomości
            if( msg.message == WM_QUIT ) // czy otrzymano wiadomość zamknięcia ?
                 done = TRUE; // skoro tak, to done=TRUE
            else // nie otrzymano wiadomości zamknięcia ?
            {
                TranslateMessage( & msg ); // wytłumacz wiadomość
                DispatchMessage( & msg ); // wyślij ją
            }
        }
        else // nie ma żadnych komunikatów
        {
            // Rysuj scenę OpenGL
            if( active )
            {
                // program jest aktywny
                if( keys[ VK_ESCAPE ] ) // czy wciśnięty jest ESC ?
                     done = TRUE; // przerwanie warunku pętli
                else // nie ma czasu na zamknięcie, rysujemy scene
                {
                    DrawGLScene(); // Rysuj scenę
                    SwapBuffers( hDC ); // Zamień bufory (ekrany)
                }
            }
           
            if( keys[ VK_F1 ] )
            {
                // F1 jest wciśnięte
                keys[ VK_F1 ] = FALSE; // ustaw go na false, bo został użyty
                KillGLWindow(); // Zamknij okno
                fullscreen = !fullscreen; // Zamień pełny ekran)
               
                // Stwórz nowe okno
                if( !CreateGLWindow( "OpynGeeL", 640, 480, 16, fullscreen ) )
                     return 0; // Wystąpił błąd
               
            }
        }
    }
    KillGLWindow(); // Zamknij OpenGL
    return( msg.wParam ); // Koniec programu
}

Po rozdzieleniu funkcji np. ReSizeGLScene do nowego pliku:
C/C++
GLvoid ReSizeGLScene( GLsizei width, GLsizei height )
{
    if( height == 0 ) // zapobiegnij dzieleniu przez zero...
         height = 1; // ...ustawiając liczbę 1
   
    glViewport( 0, 0, width, height ); // zresetuj pole widzenia
    glMatrixMode( GL_PROJECTION ); // wybierz macierz projekcji
    glLoadIdentity(); // zresetuj ją
   
    // oblicz perspektywę dla okna
    gluPerspective( 45.0f,( GLfloat ) width /( GLfloat ) height, 0.1f, 100.0f );
    glMatrixMode( GL_MODELVIEW ); // wybierz macier modeli
    glLoadIdentity(); // zresetuj ją
}

Wywala takie błędy:
E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLvoid' does not name a type|
E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLsizei' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|1|error: 'GLsizei' was not declared in this scope|

(po zmianie deklaracji funkcji na:
void ReSizeGLScene( int width, int height )
)
||=== Build: Release in lesson (compiler: GNU GCC Compiler) ===|
E:\CACHE\014\lessons\lesson06\asdf.cpp||In function 'void ReSizeGLScene(int, int)':|
E:\CACHE\014\lessons\lesson06\asdf.cpp|6|error: 'glViewport' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|7|error: 'GL_PROJECTION' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|7|error: 'glMatrixMode' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|8|error: 'glLoadIdentity' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|11|error: 'GLfloat' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|11|error: 'gluPerspective' was not declared in this scope|
E:\CACHE\014\lessons\lesson06\asdf.cpp|12|error: 'GL_MODELVIEW' was not declared in this scope|
||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
P-149019
carlosmay
» 2016-06-10 22:59:49
Jakiś plik nagłówkowy z deklaracjami funkcji jest?
Komunikaty mówią, że używane nazwy nie są znane, więc podejrzewam brak komunikacji między plikami cpp.
P-149020
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-06-10 23:03:20
brak komunikacji między plikami cpp.
Nie wiem jak to poprawnie powinno przebiegać,
według mnie dodanie przez
#include "asdf.cpp"
 
wyodrębnionego pliku powinno wystarczyć.
P-149021
1aam2am1
» 2016-06-10 23:06:46
Plików cpp się nie inkluduje. Includuje się tylko pliki h gdzie są zapisane deklaracje funkcji.
P-149022
carlosmay
» 2016-06-10 23:10:17
C/C++
// plik abcd.hpp
#pragma once
void print( int a );

// plik abcd.cpp
#include "abcd.hpp"
#include <iostream>
void print( int a )
{
    std::cout << a << '\n';
}

// plik main
#include "abcd.hpp"

auto main()->int
{
    int value { 6 };
    print( value );
}

Dzielenie kodu na kilka plików

PS. Jeśli to jest bardziej złożony kod, będzie ciężko go podzielić. Taki podział planuje się przed napisaniem aplikacji,
a w trakcie dodaje pliki jeśli trzeba. Na etapie projektowanie dzieli się kod na funkcjonalności, które trafiają do osobnych
modułów. Kod jest wtedy przejrzysty, prosty w utrzymaniu i odporniejszy na zmiany.

P-149023
Rashmistrz
Temat założony przez niniejszego użytkownika
» 2016-06-10 23:12:30
@1aam2am1
Nie mam zamiaru tego sprawdzać, ale tym bardziej nie powinno
zadziałać skoro inkludując inny plik nie działa to,
jeśli w tym pliku będzie kolejny include to też nie zadziała.

Może czegoś nie wiem o mechanizmie inkludowania, czy jak?
P-149024
pekfos
» 2016-06-10 23:17:57
Każdy plik .cpp jest kompilowany osobno i musi mieć dołączone wszystkie wymagane nagłówki.
P-149025
carlosmay
» 2016-06-10 23:24:40
GLvoid ReSizeGLScene( GLsizei width, GLsizei height )
To powinno znaleźć się w pliku nagłówkowym.

C/C++
//np: resize_scene.hpp
#pragma once // plus pliki z potrzebnymi strukturami
GLvoid ReSizeGLScene( GLsizei width, GLsizei height );

i teraz ten plik nagłówkowy dodajesz do wydzielonego i plików, w których dana funkcja jest używana.
C/C++
//np. w main()
#include "rezize_scene.hpp" // i już jest znana

oraz wydzielonego pliku z funkcją:
C/C++
#include "resize_scene.hpp" // plus pliki z potrzebnymi strukturami
GLvoid ReSizeGLScene( GLsizei width, GLsizei height )
{
    if( height == 0 ) // zapobiegnij dzieleniu przez zero...
         height = 1; // ...ustawiając liczbę 1
   
    glViewport( 0, 0, width, height ); // zresetuj pole widzenia
    glMatrixMode( GL_PROJECTION ); // wybierz macierz projekcji
    glLoadIdentity(); // zresetuj ją
   
    // oblicz perspektywę dla okna
    gluPerspective( 45.0f,( GLfloat ) width /( GLfloat ) height, 0.1f, 100.0f );
    glMatrixMode( GL_MODELVIEW ); // wybierz macier modeli
    glLoadIdentity(); // zresetuj ją
}
P-149026
« 1 » 2
  Strona 1 z 2 Następna strona