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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

29.07.2009, 18:17

Laufzeitfehler wie kann ich ihn beheben?

Hallo

Ich habe begonnen mit dem programmieren eines 3D Games. Doch nun habe ich einen Laufzeitfehler in meinem Programm. Die Frage, wie kann ich ihn beheben?

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
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
// Square.h

//

#include <d3d9.h>

#pragma comment (lib, "d3d9.lib")

static LPDIRECT3D9 d3d;
static LPDIRECT3DDEVICE9 d3ddev; 

struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

// Klasse erzeugen

//

class CSquare
{
public:

    void InitSquare();
    void RenderSquare();
    void ClearSquare();

private:

};


#include "Square.h"

LPDIRECT3DVERTEXBUFFER9 v_buffer;

void CSquare::InitSquare()
{
    // create the vertices using the CUSTOMVERTEX struct

    CUSTOMVERTEX vertices[] =
    {
        { 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), },
    };

    MessageBox(NULL, "Bis hier funktioniert es!", "Test",
               MB_OK | MB_ICONEXCLAMATION);

    // create a vertex buffer interface called v_buffer

    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_DEFAULT,
                               &v_buffer,
                               NULL);

    MessageBox(NULL, "Bis hier funktionert es auch!", "Test",
               MB_OK | MB_ICONEXCLAMATION);

    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();
}

void CSquare::RenderSquare()
{
    // select which vertex format we are using

    d3ddev->SetFVF(CUSTOMFVF);

    // select the vertex buffer to display

    d3ddev->SetStreamSource(0, v_buffer, 0, sizeof(CUSTOMVERTEX));

    // copy the vertex buffer to the back buffer

    d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
}

void CSquare::ClearSquare()
{
    v_buffer->Release();
}



Ich habe bereits den Debugger gestartet und ich fand wo sich der Fehlerort befindet.

Hier der Code des Fehlerortes:

C-/C++-Quelltext

1
2
3
4
5
6
d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               0,
                               CUSTOMFVF,
                               D3DPOOL_DEFAULT,
                               &v_buffer,
                               NULL); // Hier ist der Fehlerort



Kann mir jemand helfen, und sagen was ich falsch gemacht habe?


Gruss Patrick

2

29.07.2009, 18:27

Yo Patrick!

Sieht ganz Ok aus...
Ist d3ddev zu diesem Zeitpunkt (CreateVertexBuffer) gültig?
fka tm

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

29.07.2009, 18:34

Ja ich denke schon, warum sollte d3ddev nicht gültig sein?

Wie kann ich die Gültigkeit überprüfen von d3ddev?

Das ist die Ausgabe vom Debugger:

"3DGame2.exe": "C:\Dokumente und Einstellungen\Patrick\Eigene Dateien\Visual Studio 2008\Projects\3DGame2\Debug\3DGame2.exe" geladen, Symbole wurden geladen.
"3DGame2.exe": "C:\WINDOWS\system32\ntdll.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\kernel32.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\user32.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\gdi32.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\d3d9.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\d3d8thk.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\msvcrt.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\advapi32.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\rpcrt4.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\secur32.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\version.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\winmm.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e\msvcr90.dll" wurde geladen
"3DGame2.exe": "C:\WINDOWS\system32\uxtheme.dll" wurde geladen
Eine Ausnahme (erste Chance) bei 0x00411b9b in 3DGame2.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.
Unbehandelte Ausnahme bei 0x00411b9b in 3DGame2.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

4

29.07.2009, 18:47

Wäre es möglich, dass d3ddev ein Null-Pointer ist?
<< an dieser Stelle ist eine Signatur verstorben >>

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

5

29.07.2009, 18:55

Nein d3ddev ist nicht ein Null-Pointer.

6

29.07.2009, 18:58

Sicher, dass du CreateDevice vor'm Erstellen des Vertexbuffers ausführst?
fka tm

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

7

29.07.2009, 19:01

Also im Debugger-Modus, wenn ich mit dem Mauszeiger auf den Pointer d3ddev gehe, kommt d3ddev = 0x00000000. Das bedeutet das er ein NULL-Pointer ist. Warum ist er das?

8

29.07.2009, 19:05

Dann ist bei CreateDevice möglicherweise was schiefgegangen, oder CreateDevice wurde, wie schon angedeutet, noch garnicht ausgeführt.

Das würde ich mal prüfen.

C-/C++-Quelltext

1
2
if( FAILED(CreateDevice...) )
MessageBox(...); 
fka tm

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

9

29.07.2009, 19:16

Ich habe nun geprüft, doch es gibt keine Meldung, also es ist kein Fehler bei CreateDevice.

Hier der Code von der Initialisierung von Direct3D:

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
82
83
84
85
86
87
#include <windows.h>
#include <windowsx.h>
#include "Square.h"

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

// Klasse erzeugen

//

class CD3D
{
public:

    void initD3D(HWND hWnd);    // sets up and initializes Direct3D

    void render_frame(void);    // renders a single frame

    void cleanD3D(void);    // closes Direct3D and releases memory

    void init_graphics(void);    // 3D declarations


private:

};


#include "D3D.h"

CSquare * pSquare = new CSquare();

void CD3D::initD3D(HWND hWnd)
{
    HRESULT hResult;
    d3d = Direct3DCreate9(D3D_SDK_VERSION);

    D3DPRESENT_PARAMETERS d3dpp;

    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow = hWnd;
    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferWidth = SCREEN_WIDTH;
    d3dpp.BackBufferHeight = SCREEN_HEIGHT;

    // create a device class using this information and the info from the d3dpp stuct

    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);
    }

    init_graphics();    // call the function to initialize the triangle

}


// this is the function used to render a single frame

void CD3D::render_frame(void)
{
    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);

    d3ddev->BeginScene();

    pSquare->RenderSquare();

    d3ddev->EndScene();

    d3ddev->Present(NULL, NULL, NULL, NULL);
}


// this is the function that cleans up Direct3D and COM

void CD3D::cleanD3D(void)
{
    d3d->Release();
    d3ddev->Release();
    pSquare->ClearSquare();
}


// this is the function that puts the 3D models into video RAM

void CD3D::init_graphics(void)
{
    pSquare->InitSquare();
}

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

10

29.07.2009, 23:42

Ich habe festgestellt, dass d3d den Wert 0x00154b40 hat. Ist das richtig?

Werbeanzeige