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

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

1

02.10.2004, 21:14

Access Violation.. Initialisierungsfehler?

Hoi
Ich habe son kleines problem. ich arbeite mit der tbengine und will eine kleine klasse die ich gemacht habe (eine art tbmodell) rendern.
Compiliert wird alles, allerdings eine Fehlermeldung ausgegeben:

Unhandled exception in Testumgebung.exe: 0xC0000005: Access Violation.

Das ist der Code der Klasse (an der Stelle):

C-/C++-Quelltext

1
2
3
4
5
6
    // Effekt laden

    dwNumEffects = 1;
    pEffects = (MapEffectChunk*)(tbMemAlloc(dwNumEffects * sizeof(MapEffectChunk)));
    if(pEffects = NULL) TB_ERROR_OUT_OF_MEMORY(TB_ERROR);
    
    pEffects[0].dwNumTextures = 1;


der Pfeil geht an die Stelle:

C-/C++-Quelltext

1
pEffects[0].dwNumTextures = 1;


Im Debugfenster steht: [list] pEffects Value: 0x00000000[/list]Das ist ja schonmal komisch, weil es scheint als wäre kein speicherbereich freigegeben.
Noch komischer ist: Wenn ich testweise die Initialisierung überspringe, kommt der Fehler an anderer Stelle:
Hier der Code wie ich die Initialisierung der Klasse überspringe

C-/C++-Quelltext

1
2
3
4
    //BspPart mit der Funktion TestInit intialisieren.

    TestPart = new CBSPPart;
    if(TestPart == NULL) TB_ERROR_OUT_OF_MEMORY(TB_ERROR);
    //TestPart->TestInit("culling.fx");


Dann kommt der Fehler in der Renderfunktion:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tbResult Render(float fNumSecsPassed)
{
    HRESULT     hResult;
    float       fAspect;
    tbMatrix    mCamera;
    tbMatrix    mProjection;

    // Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 0, 0),
                                            1.0f,
                        =>                  0)))
    {
        // Fehler beim Leeren!

        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

    // Szene beginnen

    g_pD3DDevice->BeginScene();


Hab den Pfeil angezeichnet an der Stelle wo ihn der Debugger setzt. Dann kommt wieder im Debugfenster:
[list]g_pD3DDevice Value: 0x00000000[/list]
hab ich was wichtiges vergessen? wundert mich weil der Fehler an beiden Stellen kommt.
D3D wird so initialisiert:

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
    tbResult Result;
    tbConfig g_Config;
    int r;

    // TriBase-Engine initialisieren

    tbInit();
    
    // Konfiguration abfragen

    if(r = tbDoConfigDialog(&g_Config))
    {
        if(r == TB_CANCELED) return TB_OK;
        else
        {
            // Fehler!

            MessageBox(NULL, "Fehler im Konfigurationsdialog!", "Fehler",
                       MB_OK | MB_ICONEXCLAMATION);
            return TB_ERROR;
        }
    }

    // Direct3D initialisieren

    if(tbDirect3D::Init(&g_Config,
                        "Beispielprogramm Nr. 1: tbDirect3D",
                        NULL,
                        LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler!

        MessageBox(NULL, "Fehler bei der Direct3D-Initialisierung!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        ExitApplication();
        return TB_ERROR;
    }

    // Den Texturmanager initialisieren

    if(tbTextureManager::Init())
    {
        MessageBox(tbDirect3D::GetWindow(), "Fehler beim Initialisieren des Texturmanagers!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        ExitApplication();
        return TB_ERROR;
    }

Sollte doch reichen oder?

Hoffe mir kann jmd helfen, und das der Beitrag nich zu lang wird ,p

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

2

02.10.2004, 21:25

also der erste fehler hat sich erledigt (dank unserm guten irc hat =) es muss heißen

C-/C++-Quelltext

1
2
    pEffects = (MapEffectChunk*)(tbMemAlloc(dwNumEffects * sizeof(MapEffectChunk)));
    if(pEffects == NULL) TB_ERROR_OUT_OF_MEMORY(TB_ERROR);


mein fehler, gleichheitszeichen zu wenig xD. Der Fehler beim Rendern kommt aber immer noch...

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

3

02.10.2004, 22:16

Zitat


g_pD3DDevice Value: 0x00000000


Das heißt dass D3D nicht initialisiert ist. Die beiden Möglichkeiten sind, Du versuchst gar nicht, es zu initialisieren oder aber, du versuchst es, aber es geht schief. Debug mal durch die Initialisierung.
"Games are algorithmic entertainment."

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

02.10.2004, 22:20

Wie ist denn g_pD3DDevice definiert?
Scheinbar benutzt Du ja die tbDirect3D-Klasse! Vielleicht hast Du einfach nur vergessen, dem Zeiger einen Wert zuzuweisen...

rewb0rn

Supermoderator

  • »rewb0rn« ist der Autor dieses Themas

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

5

02.10.2004, 22:27

hrhr
jo ich nub, das kommt davon wenn man von überall schnipsel kopiert =)
vielen dank, jetzt gehts

Werbeanzeige