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

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

1

01.06.2007, 22:29

[Gelöst] Problem mit wandernder (!) unbehandelter Ausnahme

Hallo zusammen,

ich habe ein mir nicht erklärbares Problem:

Ich bin dabei ein kleines Spiel in 3D zu schreiben, was soweit auch ganz gut klappt. Nun bekomme ich aber beim Laden einer LPD3DFONT eine unbehandelte Ausnahme, die so aussieht:

Zitat

Unbehandelte Ausnahme bei 0x00568f4b in BlockAttack Volume I.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.


Das "witzige" ist nur, dass wenn ich diese Schriftladefunktion und auch den Rest des Programms, wo diese Schrift eingesetzt wird, auskommentiere, dann rutscht der Fehler einfach woanders hin, z.B. zur Ladefunktion einer Textur oder dort hin, wo ich weitere Renderstates setzte. Dann kommt z.B. sowas dabei raus:

Zitat

Unbehandelte Ausnahme bei 0x0042a289 in BlockAttack Volume I.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.


Die Zugriffsverletzung bleibt an der gleichen Stelle, wird nun von einem anderen Punkt im Programm ausgelöst.

Wenn ich nun aber die Renderstates woanders hinpacke, dann passiert gar nichts mehr, d.h. er kompiliert und lädt alles, zeigt aber nichts an: weder ein Fenster, noch einen Fehler, geschweige denn eine Fehlermeldung.

Nachdem ich nun stundenlang Teile auskommentiert habe, um das Problem zu finden, bin ich nun stark bis total gefrustet.

Hoffe, dass jemand von euch mir zumindest mal Möglichkeiten nennen kann, woran es eventuell liegen könnte.

Wenn ihr Code zur Analyse braucht, dann meldet euch und sagt welche Teile nützlich sein könnten und ich stell ihn rein.

Grüße - spacegaier

PS: Logfile bringt nix, da dort nichts hineingeschrieben wird, obwohl vor dem Teil, wo der Fehler auftritt schon Anweisungen stehen, die etwas ins Logfile schreiben sollten (was vor diesem Fehler auch prima klappte).

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

01.06.2007, 22:49

Schon sämtliche Pointer auf 0 gecheckt? Wenn nicht solltest du das mal am anfang jeder Funktion für jeden dort verwendeten Pointer machen.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

3

01.06.2007, 23:02

Alle Klassen haben einen Konstruktor mit folgendem Aufbau:

C-/C++-Quelltext

1
CKlasse(){ZeroMemory(this, sizeof(CKlasse));}


Damit ist also alles genullt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

01.06.2007, 23:05

Zitat von »"spacegaier"«

C-/C++-Quelltext

1
CKlasse(){ZeroMemory(this, sizeof(CKlasse));}


mach sowas niiiemals. niiiiiemals!!!!
ZeroMemory + class = nogo

spätestens wenn vererbung und virtuelle methoden im spiel sind machst du dir so alles kaputt!!

außerdem ist aus der fehlermeldung ziemlich klar ersichtlich, dass das problem ein nicht initialisierter pointer (kein nullpointer) ist.
der debugger wird dir alles weitere verraten.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

5

01.06.2007, 23:06

Gut zu wissen. IDann hau ich jetzt mal alle ZeroMemory-Befehle raus und NULLe alles manuell.

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

6

01.06.2007, 23:07

man würde glaube ich, lieber alles per hand auf null setzen... ;)

EDIT: war zu langsam :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.06.2007, 23:12

richtig. für solche dinge gibts initialisierungslisten.
btw: es ist effizienter den debugger zu benutzen, als stundenlang code auszukommentieren ;)
du brauchst nur schauen welcher zeiger an der stelle verwendet wird wo der fehler auftritt und dann schauen wo er seinen wert her hat.

ansonsten poste einfach mal die zeile wo das problem auftritt.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

8

01.06.2007, 23:25

Also: Durch das manuelle NULLen hat sich folgendes ergeben.

Die Stellen, an denen ich die Schrift und die Textur geladen habe sind jetzt fehlerfrei. Jetzt kommt der Feheler nur noch dort, wo ich die Renderstates setze.

C-/C++-Quelltext

1
2
3
4
5
6
7
g_pDirect3D->GetDevice()->SetRenderState(D3DRS_LIGHTING, TRUE);
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_ZENABLE, TRUE);
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, TRUE); 
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(0, 0, 0));
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_COLORVERTEX, FALSE);
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
    g_pDirect3D->GetDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);


Aber es liegt wohl nicht an den RenderStats, sondern an dem Singleton. Ich poste mal Code (allerdings wird das Singleton schon vorher fehlerfrei verwendet!):

Meine Singletonklasse ist wohl fehlerfrei (ist die aus Heikos Buch).

Meine Direct3D-Klasse:

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
#define g_pDirect3D   CDirect3D::Get()

// __________________________________________________________________


class CDirect3D : public TSingleton<CDirect3D>
{
private:
    
    bool                    m_bInitialized;                                 // Gibt an, ob D3D initialisert wurde

    LPDIRECT3D9             m_pD3D;                                         // Pointer zum D3D-Interface

    LPDIRECT3DDEVICE9       m_pD3DDevice;                                   // Pointer zur Device-Klasse

    D3DPRESENT_PARAMETERS   m_PresentParams;                                // Darstellungs-Parameter

    D3DCAPS9                m_Caps;                                         // Fähigkeiten der Grafikkarte

    HWND                    m_hWindow;                                      // Handle zum Programmfenster

    fResult                 m_PresentResult;                                // Ergebnis der Present-Methode

    D3DXVECTOR2             m_vScreenSize;                                  // Bildschirmgrößen

    DWORD                   m_dwLightIndexCounter;                          // Speichert die Lichtindizes

    
public:

    CDirect3D();
    ~CDirect3D()            {if(IsInitialized()) Exit();}                   // Destruktor


    fResult                 Init(bool bWindowed, char* pcAppName);          // D3D9 initialisieren

    fResult                 Exit();                                         // D3D9 beenden

    fResult                 Present();                                      // Zeichnet den Backbuffer auf den Bildschirm


    PDIRECT3D9              GetD3D()            {return m_pD3D;}            // Liefert das D3D9-Interface

    PDIRECT3DDEVICE9        GetDevice()         {return m_pD3DDevice;}      // Liefert die Device-Klasse

    HWND                    GetWindow()         {return m_hWindow;}         // Liefert das Anwendungsfenster

    D3DXVECTOR2             GetScreenSize()     {return m_vScreenSize;}     // Liefert die Bildschirmgrößen

    void                    SetLightIndexCounter(DWORD newIndexCounter){m_dwLightIndexCounter = newIndexCounter;}
    int                     GetLightIndexCounter(){return m_dwLightIndexCounter;}

    bool IsInitialized(){return g_pDirect3D->m_bInitialized;}               // Teste, ob D3D initialisiert wurde

    
};

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

9

01.06.2007, 23:40

Der Fehler lautet jetzt übrigens so:

Zitat

Unbehandelte Ausnahme bei 0x0042b948 in BlockAttack Volume I.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000.


Heißt das, dass g_pDirect3D->GetDevice() NULL zurückliefert (wegen dem 0x00000000)?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

01.06.2007, 23:44

yep, das wäre eine möglichkeit.

Werbeanzeige