Laufzeitfehler finde ihn nicht



  • Hallo

    Ich bin daran ein 3D Game zu programmieren. Doch nun habe ich einen Fehler im Code, finde ihn aber nicht, könnt ihr mir helfen?

    Hier ist der Code:

    // D3D.h
    //
    #include <windows.h>
    #include "Square.h"
    
    #define WINDOW_WIDTH 800
    #define WINDOW_HEIGHT 600
    
    // Klasse erzeugen
    //
    class CD3D
    {
    public:
    
    	bool InitD3D(HWND hwnd);
    	void Render();
    	void ClearD3D();
    
    private:
    
    };
    
    // D3D.cpp
    //
    #include "D3D.h"
    
    CSquare * pSquare = new CSquare();
    
    bool CD3D::InitD3D(HWND hwnd)
    {
    	HRESULT hResult;
    
    	d3d = Direct3DCreate9(D3D_SDK_VERSION);
    
    	D3DPRESENT_PARAMETERS d3dpp;
    
    	ZeroMemory(&d3dpp, sizeof(d3dpp));
    
    	d3dpp.Windowed = false;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	d3dpp.hDeviceWindow = hwnd;
    	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    	d3dpp.BackBufferWidth = WINDOW_WIDTH;
    	d3dpp.BackBufferHeight = WINDOW_HEIGHT;
    
    	if(FAILED(hResult = d3d->CreateDevice(D3DADAPTER_DEFAULT,
    										  D3DDEVTYPE_HAL,
    										  hwnd,
    										  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    										  &d3dpp,
    										  &d3ddev)))
    	{
    		MessageBox(NULL, "Fehler beim erzeugen des Gerätes!", "Fehler aufgetreten",
    				   MB_OK | MB_ICONEXCLAMATION);
    
    		return(false);
    	}
    
    	// RenderStates festlegen
    	//
    	d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);
    
    	// Init-Funktionen aufrufen
    	//
    	if(!pSquare->InitSquare())
    	{
    		MessageBox(NULL, "Fehler beim aufrufen von InitSquare!", "Fehler aufgetreten",
    				   MB_OK | MB_ICONEXCLAMATION);
    
    		return(false);
    	}
    
    	return(true);
    }
    
    void CD3D::Render()
    {
    	d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
    	d3ddev->BeginScene();
    
    	d3ddev->EndScene();
    	d3ddev->Present(NULL, NULL, NULL, NULL);
    }
    
    void CD3D::ClearD3D()
    {
    	d3d->Release();
    	d3ddev->Release();
    	pSquare->ClearSquare();
    	delete(pSquare);
    }
    
    // Square.h
    //
    #include "D3DVariables.h"
    
    struct SVertex
    {
    	FLOAT x, y, z, rhw;
    	DWORD Color;
    };
    
    #define FVF ( D3DFVF_XYZ | D3DFVF_DIFFUSE )
    
    // Klasse erzeugen
    //
    class CSquare
    {
    public:
    
    	bool InitSquare();
    	void RenderSquare();
    	void ClearSquare();
    
    private:
    
    	LPDIRECT3DVERTEXBUFFER9 SquareBuffer;
    
    };
    
    // Square.cpp
    //
    #include "Square.h"
    
    bool CSquare::InitSquare()
    {
    	HRESULT hResult;
    
    	SVertex verts[] =
    	{
    		{ 320.0f, 50.0f, 0.5f, 1.0f,D3DCOLOR_XRGB(0, 0, 255), },
            { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
            { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
        };
    
    	if(FAILED(hResult = d3ddev->CreateVertexBuffer(3*sizeof(SVertex),
    												   0,
    												   FVF,
    												   D3DPOOL_MANAGED,
    												   &SquareBuffer,
    												   NULL)))
    	{
    		MessageBox(NULL, "Fehler beim erzeugen des VertexBuffers!", "Fehler aufgetreten",
    				   MB_OK | MB_ICONEXCLAMATION);
    
    		return(false);
    	}
    
    	VOID * pVoid;
    
    	SquareBuffer->Lock(0, 0, (void**)&pVoid, 0);
    	memcpy(pVoid, verts, sizeof(verts));
    	SquareBuffer->Unlock();
    
    	MessageBox(NULL, "Initialisieren des Dreiecks erfolgreich!", "Fehler aufgetreten",
    			   MB_OK | MB_ICONEXCLAMATION);
    
    	return(true);
    }
    
    void CSquare::RenderSquare()
    {
    	d3ddev->SetFVF(FVF);
    	d3ddev->SetStreamSource(0, SquareBuffer, 0, sizeof(SVertex));
    	d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
    }
    
    void CSquare::ClearSquare()
    {
    	SquareBuffer->Release();
    }
    
    // D3DVariables.h
    //
    #include <d3d9.h>
    #include <d3dx9.h>
    
    #pragma comment(lib, "d3d9.lib")
    #pragma comment(lib, "d3dx9.lib")
    
    static LPDIRECT3D9			d3d = NULL;
    static LPDIRECT3DDEVICE9	d3ddev = NULL;
    

    Weiss jemand wo der Fehler liegt?

    Gruss Patrick



  • nö debug deinen code selbst



  • Programm im Debugger starten (mit F5), bei einem Laufzeitfehler zeigt er Dir dann die entsprechende Zeile an.



  • Mein Debugger funktioniert leider nicht, auf Visual C++ Express 2008. Wenn ich den Debugger starte, kommt immer eine Fehlermeldung und dann kann ich unterbrechen drücken.

    Kennt jemand dieses Problem?

    Und wenn ja, wie kann man es beheben?

    Gruss Patrick



  • Wenn du verraten würdest was für eine Fehlermeldung kommt könnte man dir eventuell sogar weiter helfen.



  • Visual C++ 2008 Express Edition

    Unbehandelte Ausnahme bei 0x00411cee in 3DGame.exe: 0xC0000005:
    Zugriffsverletzung beim Lesen an Position 0x00000000.



  • lol, das ist ja debuggen.
    Da klickt man "break" (deutsch "Abbrechen"?) und guckt sich die Werte an.
    Man sieht doch, in welcher Zeile das Problem auftritt.

    Kannst ja auch einen sinnigen breakpoint setzen und durch das Programm steppen.



  • Ich sehe nicht, wo der Fehler auftritt. Kannst du mir helfen? Wie kannst du das sehen?



  • Du hast doch einen debug-build?

    lol0r schrieb:

    Man sieht doch, in welcher Zeile das Problem auftritt.



  • Ja, ich habe nun gefunden, wo der Fehler auftretet, hier:

    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                                   0,
                                   CUSTOMFVF,
                                   D3DPOOL_MANAGED,
                                   &SquareBuffer,
                                   NULL); // Hier
    

    Aber was ist hier falsch?

    Kannst du mir das sagen?



  • Keine Ahnung, sorry.
    Vielleicht mal ins Spiele/Grafikprogrammierung-Forum verschieben.
    Und vielleicht mal verschiedenste Dinge auskommentieren, und immer wieder testen. So wirst du auch draufkommen.



  • Du übergibst da wohl einen NULL-Pointer (daher gibts Probleme beim Lesen an Adresse 0x0 ⚠ ). Während eine Debug-Session läuft und der Fehler auftritt (in dem Moment steht die Ausführung ja an der fehlerhaften Stelle), solltest du mal alle Argumente überprüfen (einfach mit der Maus auf die Variable, dann siehst du den Inhalt als Tooltip).



  • Ich bin nun bei dieser Funktion mit dem Mauszeiger über die Wörter gefahren. Doch ich weiss nicht was falsch ist. Was meinst du denn mit einem Null-Pointer?



  • Eglifisch1 schrieb:

    Ich bin nun bei dieser Funktion mit dem Mauszeiger über die Wörter gefahren. Doch ich weiss nicht was falsch ist. Was meinst du denn mit einem Null-Pointer?

    Eine Pointer-Variable, die den Wert 0 hat.

    Ernst- und gutgemeinter Rat: wenn du in Sachen Programmierung noch so am Anfang stehst, solltest du wirklich nicht mit einem 3D-DX-Spiel anfangen. Das dürfte dich noch ziemlich überfordern. Fang erstmal mit kleinen Programmen (können ja auch kleine Spielchen sein) auf der Konsole an, mach dich mit den Grundlagen vertraut, lerne die IDE und die Debugging-Möglichkeiten kennen usw. Das ist die einzig sinnvolle Vorgehensweise, um später bei solch großen Ambitionen auch zu wissen, was man tut. 🙂


Anmelden zum Antworten