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

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

21

02.06.2007, 17:35

Zitat von »"Das Gurke"«

Du musst dir nur vorstellen das du damit auch sämtlich Daten der "Mutterklassen" mit ausradierst. Stell dir vor du erbst von einer Klasse namens "Shape", welches, wieso auch immer, eine feste Farbe definiert.

Nun erbst du von Shape und nennst die Klasse "Circle". Wenn du im Konstruktor von Circle nun dieses ZeroMemory aufrufst, was wird dann wohl mit der Farbinformation, die ja ein Member von Shape ist, geschehen?

Edit:
Hab ich doch?


Sie wird auch genullt^^ falls das ne frage war^^

Danke! hast es warscheinlich abgeschikt kurz nachdem ich auf edit gedrückt hab!

Socke

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

22

02.06.2007, 17:48

Ich teste des so:

C-/C++-Quelltext

1
LPDIRECT3DDEVICE9 test1 = g_pDirect3D.GetDevice();


Ich schau mir dann beim Debuggen den Wert von test1 an und der ist an diesen Stellen manchmal (!) NULL.

Es ist jetzt nämlich so:

Ich habe die Singletonklasse jetzt aus CDirect3D rausgeschmissen und nutze nun DragonFlames Variante, d.h. ich greife auf die Instance von CDirect3D weiterhin mit der globalen Varbiale g_pDirect3D drauf zu, welche nun aber anders definiert ist:

C-/C++-Quelltext

1
2
3
4
5
6
7
#define g_pDirect3D   CDirect3D::Instance()

static CDirect3D& Instance(void) 
    { 
        static CDirect3D Instance; 
        return Instance; 
    } 


Nun habe ich folgendes ausprobiert:

Ich erstelle mir mehrere Testvariablen vom Typ LPDIRECT3DDEVICE9.

Nun mache ich folgendes:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LPDIRECT3DDEVICE9 test1 = g_pDirect3D.GetDevice();

g_pDirect3D.Init(bWindowed, pcAppName);

LPDIRECT3DDEVICE9 test2 = g_pDirect3D.GetDevice();

g_pDirectInput->Init(hInstance);

LPDIRECT3DDEVICE9 test3 = g_pDirect3D.GetDevice();

D3DXCreateFontA(g_pDirect3D.GetDevice(),    
                    40, 0,    
                    FW_NORMAL,    
                    1,    
                    FALSE,    
                    DEFAULT_CHARSET,    
                    OUT_DEFAULT_PRECIS,    
                    DEFAULT_QUALITY,    
                    DEFAULT_PITCH || FF_DONTCARE,    
                    "Arial",    
                    &m_pFontBig


Das führe ich nun zeilenweise aus.

Ergebnis:

1. Nach der ersten Zeile werden alle drei Testvariablen als 0xcccccccc angegeben (also != NULL), OBWOHL das Device noch gar nicht intialisiert wurde und der Konstruktor von CDirect3D dieses NULLt !!!!

2. Beim Ausführen der nächsten Zeile ( g_pDirect3D.Init(bWindowed, pcAppName); ) wird die erste Testvariable auf einmal NULL !!!

3. Nächste Zeile passiert nichts; die beiden anderen Testvariablen sind immer noch 0xccccccccc, OBWOHL das Device nun initialisert ist !!!

4. Jetzt führe ich die nächste Zeile aus (DirectInput einschalten) und test2 wird plötzlich auch NULL. Dabei wird von der DirectInput-Startfunktion das Device gar nicht gebraucht, sondern nur über g_pDirect3D.GetWindow() das Fensterhandle geholt !!!

5. Nun führe ich die fünfte Zeile aus -> Nix passiert.

6. Zeile -> test3 wird auch zu NULL !!!

Ist das logisch? Warum ist das Device vor dem Initialiseren nicht NULL, trotz Konstruktor (dieser müsste mit DragonFlames-Codestück doch beim ersten Benutzen von g_pDirect3D ausgeführt werden, oder?)?

Bin echt verzweifelt. Mir von Anfang an klar bei diesem Projekt, dass ich an ein paar Stellen hängen werde (da es mein erstes 3D-Projekt ist), mir war aber nicht klar, dass ich an sowas scheitern würde. Hoffe, dass ihr mir helfen könnt. Würde das Projekt gerne durchziehen.

Grüße - spacegaier

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

23

02.06.2007, 17:51

Nein, das Problem liegt woanders. Wenn du in einer Basisklasse virtuelle Methoden hast um diese bei der Spezialisierten Klasse zu überschreiben so besitzt dein Objekt ein Zeiger auf eine Tabelle mit Verweisen auf die entsprechenden Methoden. Wenn du deine Klasse einfach groß mit 0 Bytes überschreibst dann überschreibst du auch den Zeiger auf die vtbl und hast somit eine extremst dumme Situation beim aufrufen von Methoden.

Zitat


Woher weisst du, dass die Funktion g_pDirect3D->GetDevice() NULL zurückgibt? und net irgendeine andere? Und woher weisst du, dass sie überhaupt NULL zurückgibt? es könnte doch auch sein, das versucht wurde eine Methode auf einen NULL-Zeiger anzuwenden. und wie kann man solche fehlermeldungen überhaupt "interpretieren"?


Du hast doch selbst gesagt das der Fehler beim setzten der Renderstates kommt. Und da die Fehlermeldnung recht eindeutig ist (lesen an Position 0x00000000 => Nullpointer) kann vermutet werden das g_pDirect3D evtl dieser Nullzeiger ist, oder der Rückgabewert von GetDevice(), ...
Drum solltest du ja mal den Debugger bemühen.
@D13_Dreinig

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

24

02.06.2007, 17:56

Habe keine virtuellen Funktionen und CDirect3D hat ja jetzt auch keine Basisklasse mehr.

Den Debugger habe ich ja bemüht mit obigem Ergebnis, oder was soll ich mit ihm jetzt machen?

EDIT: DragonFlames-Code liefert doch gar keine Referenz, sondern direkt die Instanz zurück, oder? Könnte das Probleme geben (weil ja David_pb was in diese Richtung geschrieben hat)?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

25

02.06.2007, 18:04

Is egal, ZeroMemory( this, ... ) sollte vermieden werden. Das is ganz fieder Codestil! :)
Und klar, DragonFlames Code liefert eine Referenz auf die Instanz zurück. Und das Verhalten deines Programms sieht für mich relativ normal aus, beim überfliegen. ;-)
@D13_Dreinig

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

26

02.06.2007, 18:05

Liefert CDirect3D::Instance() nicht schon das device? warum also sozusagen Device.GetDevice()? das ist doch dann doppelt gemoppelt^^ oder sehe ich das falsch?


Socke

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

27

02.06.2007, 18:11

Nein. CDirect3D::Instance() liefert nur die Referenz auf die Instanz der Klasse und das Device ist ein Member dieser Klasse, welches ich mir dann über GetDevice() hole.

@Davib_pc: Es läuft aber immer noch nicht normal. Ich habe jetzt festgestellt, dass sogar das Ersellen des Logfiles fehl schlägt.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

28

02.06.2007, 21:27

:evil: :x ENDLICH......ICH TROTTEL.....SO WAS DUMMES !!! :x :evil:

Ich habe meinen Fehler jetzt gefunden und zwar dort, wo ich ihn am wenigsten vermutet habe. Habe nun jede Funktion von Anfang ananlysiert und debuggt und eine schlug schlicht und ergreifend fehl -> falsche Initialisierungen, welche dann zur fehlerhaften Erstellung des Devices führten. Da mein Logfile aus einem mir noch nicht ersichtlichen Grund auch nicht erstellt wurd, habe ich das nicht gemerkt.

Tut mir leid, dass ich euch mit so was (mal wieder Blödem) belästigt habe, aber ich habe auch was dabei gelernt.

Schön wäre es jetzt noch, wenn mir jemand etwas zum Stichwort Constcorrectnes sagen könnte, was David_pb hier im Thread bereits angesprochen hatte.

:) DANKE für eure Hilfe !!! :)

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

29

02.06.2007, 21:49

http://www.possibility.com/Cpp/const.html

Das hier weist eigtl sehr gut ein. Hab da nachgeschlagen als mir das hier irgendwann mal über den Weg gekommen ist.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

30

03.06.2007, 06:08

Danke, da werd ich mich mal durchkämpfen.

Werbeanzeige