Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.08.2009, 19:07

Eigenartiger Fehler

Hallo, das ist mein erster post ihr im forum und er wird glaube ich relativ lange, ich bedanke mich schonmal für jede antwort.
bisher habe ich eigentlich immer wenn ich probleme hatte in bücher nachgeschlagen oder nach dem fehler gegooglet und bin dann fündig geworden, diesesmal allerdings verstehe ich überhaupt nicht woher dieser fehler kommt.

Zuallererst einmal muss ich sagen das ich früher nur python und java programmiert habe(und das auch nur entwas über einsteigerniveau) und keine erfahrung in C++ und directX habe. desswegen kann es sein das ich einfach schon zu früh mit direct X angefangen habe.

Das was ich gecodet habe war der versuch OO ein Gerüst zu bauen von dem aus ich ein beliebiges spiel weiterschreiben kann. Inspirieren lassen habe ich mich von dem Spiel aus "C++ für Spieleprogrammierer", dem code von "3D-Spiele Programmierung mit directX und c++" und dem directXtutorial blog (auch hier würde ich mcih freuen ob mein ansatz brauchbar oder aber absolut unbrauchbar ist)

Gut also ersteinmal meine Fehlermeldung





Quellcode

1
2
3
1>c:\users\kalkas\documents\visual studio 2008\projects\myfirstx\myfirstx\game.hpp(17) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'tri1'
1>c:\users\kalkas\documents\visual studio 2008\projects\myfirstx\myfirstx\game.hpp(17) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\kalkas\documents\visual studio 2008\projects\myfirstx\myfirstx\game.hpp(17) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.


Vielleicht würde ich die Fehlermeldung verstehen, aber ich verstehe nicht wieso nur sporadisch und nicht immer auftritt.

das programm soll ein dreieck rendern, das war es quasi schon.

Da ich nicht weiß ob der code Triangle.hpp/cpp und Game.hpp/cpp ausreicht poste ich einmal den gesammten code

meine bisherige vorhergehensweise:
1. fehlermeldung erhalten:
daraufhin habe ich die deklaration von tri1 in game.hpp
auskommentiert, die instanzierung von tr1 in game.cpp
auskommentiert und das rendern von tri1 in Window3D.cpp
auskommentiert-->ein schwarzes fenster ohne fehler und ohne
dreieck erscheint wie erwartet
2. schwarzes bild wird angezeigt:
alle auskommentierten zeilen von (1.) wieder dem code
hinzugefügt und kompiliert-->das dreieck wird ohne fehler
gerendert(juhu)
3. dreieck erscheint:
daraufhin geglaubt das VC++ spinnt und meine Klasse Triangle
erwetert(wie spielt keine rolle passiert immer das gleiche)--> der
Fehler taucht wieder auf.
daraufhin habe ich die schritte 1-3 x mal wiederhohlt und es passsierte immer das gleiche, jetzt weiß ich nicht wie ich dieses verhalten deuten soll, weil es manhcmal funktioniert und manchmal eben nicht

Hier der Code

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#ifndef GAME_HPP
#define GAME_HPP

#include "Triangle.hpp"
#include "Window.hpp"
#include "Window3D.hpp"
#include "Singleton.hpp"


using namespace std;

#define g_pGame Game::Get()

class Game : public TSingleton<Game>
{
    public:
        Triangle tri1;
        Game();
        ~Game();
        void Init();
        void Run();
    
        

};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "Game.hpp"

Game::Game()
{
    
}
Game::~Game()
{
    
}
void Game::Init()
{
    Triangle tri1;
}
void Game::Run()
{
    while(true)
    {
        if (g_pWindow->IsRunning()==false)
        {
            
            return;
        }
        g_pWindow3D->Render();
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#ifndef TSINGLETON
#define TSINGLETON
#include <iostream>



template <class T>
class TSingleton
{
    protected:

        // Membervariablen

        static T *m_pSingleton;   // Statisches Objekt


    public:

        // Memberfunktionen


        // Destruktor

        //

        virtual ~TSingleton ()
        {
        }

        // Get

        //

        // Aufgabe: Wenn nötig, statisches Objekt erzeugen und

        // Zeiger darauf zurückgeben

        //

        inline static T* Get ()
        {
            // Existiert schon eine Instanz?

            if (!m_pSingleton)
                m_pSingleton = new T;   // Nein, dann neue Instanz erzeugen


            // Zeiger auf die Instanz zurückgeben

            return (m_pSingleton);

        } // Get


        // Statisches Objekt freigeben

        //

        static void Del ()
        {
            // Gab es eine Instanz?

            if (m_pSingleton)
            {
                delete (m_pSingleton);  // Ja, dann freigeben

                m_pSingleton = NULL;    // und Zeiger auf NULL setzen

            }

        } // Del


};

// Die statische Variable erzeugen

//

template <class T>
T* TSingleton<T>::m_pSingleton = 0;

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef TRIANGLE_HPP
#define TRIANGLE_HPP

#include <d3d9.h>
#include "Window3D.hpp"



class Triangle
{
    public:
        Triangle();
        ~Triangle();
        void Render();
    private:
        struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
        CUSTOMVERTEX vertices[3];
        LPDIRECT3DVERTEXBUFFER9 v_buffer;

};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "Triangle.hpp"


Triangle::Triangle()
{
    CUSTOMVERTEX tempVertices[] =
    {
        { 400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { 150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
    };

    vertices[0] = tempVertices[0];
    vertices[1] = tempVertices[1];
    vertices[2] = tempVertices[2];

    g_pWindow3D->g_pD3DDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               (D3DFVF_XYZRHW | D3DFVF_DIFFUSE),
                               D3DPOOL_MANAGED,
                               &v_buffer,
                               NULL);

    VOID* pVoid;    // a void pointer


    // lock v_buffer and load the vertices into it

    v_buffer->Lock(0, 0, (void**)&pVoid, 0);
    memcpy(pVoid, vertices, sizeof(vertices));
    v_buffer->Unlock();

}
Triangle::~Triangle()
{
    v_buffer->Release();
}
void Triangle::Render()
{
    g_pWindow3D->g_pD3DDevice->SetFVF(D3DFVF_XYZRHW | D3DFVF_DIFFUSE);
    g_pWindow3D->g_pD3DDevice->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));
    g_pWindow3D->g_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef WINDOW_HPP
#define WINDOW_HPP

#include "Singleton.hpp"
//#include <iostream>

#include <windows.h>

//using namespace std;


#define g_pWindow Window::Get()

class Window : public TSingleton<Window>
{
    public:
        HWND g_hWindow;
        bool Init   (HINSTANCE hInstance, int iShowCmd);
        bool IsRunning();
    private:
        static LRESULT WINAPI WindowProc(HWND hWindow,
                          unsigned int uiMessage,
                          WPARAM WParam,
                          LPARAM LParam);
};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "Window.hpp"

bool Window::Init (HINSTANCE hInstance, int iShowCmd)
{
    
    // Fensterklassenstruktur ausfüllen

    WNDCLASSEX WindowClass = {sizeof(WNDCLASSEX), CS_CLASSDC, WindowProc, 0, 0,
                              GetModuleHandle(NULL), NULL, LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)), NULL,
                              NULL, L"Direct3D window", NULL};
    

        // Klasse registrieren

    if(!RegisterClassEx(&WindowClass))
    {
        MessageBox(NULL,
               L"FEHLER BEI WindowClass REGISTRIEREN",
               NULL,
               MB_ICONEXCLAMATION | MB_OK);
        return (false);
    }

    g_hWindow = CreateWindow(L"Direct3D window",
                             L"WAYNE",
                             WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             NULL,
                             NULL,
                             GetModuleHandle(NULL),
                             NULL);
    if(g_hWindow == NULL)
    {
        MessageBox(NULL,
               L"Erstellung des Fensters ist fehlgeschlagen!\n",
               NULL,
               MB_ICONEXCLAMATION | MB_OK);
    }

    
    
    return (true);
}
bool Window::IsRunning()
{
    MSG msg;
    // Check to see if any messages are waiting in the queue

        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // translate keystroke messages into the right format

            TranslateMessage(&msg);

            // send the message to the WindowProc function

            DispatchMessage(&msg);
        }

        // If the message is WM_QUIT, exit the while loop

        if(msg.message == WM_QUIT)
        {
            return (false);
        }
        return(true);
    
}
LRESULT WINAPI Window::WindowProc(HWND hWindow,
                          unsigned int uiMessage,
                          WPARAM WParam,
                          LPARAM LParam)
{
    switch(uiMessage)
    {
        case WM_CLOSE:
            DestroyWindow(hWindow);
            PostQuitMessage(0);
            break;

        default:
            return DefWindowProc(hWindow, uiMessage, WParam, LParam);
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#ifndef WINDOW3D_HPP
#define WINDOW3D_HPP

#include "Singleton.hpp"
#include "Window.hpp"
//#include <iostream>

#include <D3D9.h>
#include "Game.hpp"


//using namespace std;


#define g_pWindow3D Window3D::Get()

class Window3D : public TSingleton<Window3D>
{
    public:
        bool Init();
        void Quit();
        void Render();
    
        PDIRECT3D9 g_pD3D;
        PDIRECT3DDEVICE9    g_pD3DDevice;
    private:
        //Vorrübergehend hier deklariert

        
};

#endif


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include "Window3D.hpp"


bool Window3D::Init()
{
    D3DPRESENT_PARAMETERS   PresentParams;
    
    g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

    ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));
    PresentParams.Windowed = TRUE;
    PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    PresentParams.hDeviceWindow = g_pWindow->g_hWindow;

    if(FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
                         D3DDEVTYPE_HAL,
                         g_pWindow->g_hWindow,
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                         &PresentParams,
                         &g_pD3DDevice)))
    {
        MessageBox(NULL,
               L"FEHLER BEI CreateDevice",
               NULL,
               MB_ICONEXCLAMATION | MB_OK);
        return (false);
    }



    return (true);
}
void Window3D::Render()
{
    // clear the window to a deep blue

    g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    g_pD3DDevice->BeginScene();    // begins the 3D scene


    g_pGame->tri1.Render();

    g_pD3DDevice->EndScene();    // ends the 3D scene


    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);   // displays the created frame on the screen

}
void Window3D::Quit()
{
    g_pD3D->Release();
    g_pD3DDevice->Release();
}


Ich muss auch zugeben das ich eine sache von einem buch hinzugefügt habe ohne zu wissen was es tut (vielleicht liegt es ja daran aber wenn ich es lösche kommen sehr viele fehler) und zwar die #ifndef, #define, #endif

Vielen Dank schoneinmal für eure Hilfe.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.08.2009, 20:10

Was mir spontan mal auffällt:

C-/C++-Quelltext

1
2
3
4
5
6
    CUSTOMVERTEX tempVertices[] = 
    { 
        { 400.0f, 62.5f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), }, 
        { 650.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), }, 
        { 150.0f, 500.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
    };


Der letzte , da is falsch. Hängt jetzt aber irgendwie nicht direkt mit deiner Fehlermeldung zusammen...

3

06.08.2009, 22:52

danke schoneinmal, komisch, darüber hat er nix ausgespuckt ich verbesser es mal, kann ja nicht schaden

EDIT:
den fehler hat es wie vermutet nicht behoben

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

4

06.08.2009, 22:59

Du hast da eine nette Includeschleife:

Game.hpp -> Triangle.hpp -> Window3D.hpp -> Game.hpp

Das kann so nicht funktionieren :) Du solltest die Struktur überdenken, oder mit Vorwärtsdeklarationen arbeiten.

5

06.08.2009, 23:21

Vielen dank, ich ahbe mir schon gedacht das es irgendwas mit den #-Befehlen zu tun hat, ich werde mal drüber schlafen und dann mal schauen =)

Werbeanzeige