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

21

02.06.2009, 22:00

wie was meinst du mit dem Rest?
also der Nullpointer ist scheinbar da hDeviceWindow nach dem springen aus der Funktion InitD3D keine wert mehr enhält somit .
d3d ist mit keinem wert mehr gefüllt.

also ist die zuweißung der Werte nur lokal, aber dabei ist d3ddev doch eine Globale Variable.

LG dna

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

22

03.06.2009, 11:02

Schonmal versucht die Variable als Pointer oder Referenz zu übergeben?
Ansonsten, wenn die Variable Global ist aber in einer anderen Datei steht muss sie mit extern gekennzeichnet sein.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

23

03.06.2009, 15:21

das problem ist definitiv dass dein d3ddev 0 ist, was vermutlich der fall ist weil das erstellen des device fehlgeschlagen ist...

24

03.06.2009, 16:11

weißt du warum dies der fall sein könnte, also wo mein fehler liegt? bevor ich das ganze in klassen gepackt hat der code ja funktioniert und ist lediglich ein wenig verändert worden damit es in einer eigenen klasse abgelegt werden kann.

@MCP wie meinst du das?
bzw wie geht das, das ist mir neu das globale Variablen bei unterschiedlichen Datein extra gekennzeichnet werden müssen, könntest du das genauer erläutern?

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

25

03.06.2009, 23:21

Zum Beispiel in einer Headerdatei:

C-/C++-Quelltext

1
extern D3DDEVICE9* D3DDev;


und dann in der dazugehörigen Codedatei:

C-/C++-Quelltext

1
D3DDEVICE9* D3DDev = NULL;


Dann kann man diese globale Variable in allen Codedateien einbinden in denen die Headerdatei eingebunden ist. Die initialierung in der Code Datei ist einmalig. Im Programm kann man dann Ein Device erstellen, der Variable zuweisen und schon hat man einen globalen Zeiger auf das Device.
Die Initialisierung mit NULL muss nicht sein.

Ich bevorzuge es jedoch mit Pointern oder Referenzen zu arbeiten.

26

04.06.2009, 18:24

So endlich habe ich mein Problem gelöst,
Ich habe einfach sämtliche Variablen in der Klasse deklariert, ich hoffe das ich keinerleih Problem mehr bei der weiteren Codeentwicklung bekomme, weil ich auf diese zugreifen muss.
Aber das müsste doch mit Singletons machbar sein oder?

Naja vielendank an alle die mir geholfen haben, hilfreiche tipps gegeben habe oder auch nur Interesse für mein Problem gezeigt haben.
LG Oxy

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

27

04.06.2009, 23:08

Mit Singletons ist das möglich.
Ich habe in meiner 3D Engine eine Singletonklasse die es mir ermöglicht Tastatureingaben in der ganzen Datei zu verarbeiten. Und das funktioniert wunderbar.

28

06.06.2009, 18:34

Hallo nochmal, ich weiß ich fange an zu nerven, aber ich würde ungern mein projekt aufgeben und hoffe das ihr mir noch einmal, hoffentlich zum letzen mal helfen könnt.Ich versuche meine Probleme immer selber zu lösen bevor ich sie hier herreinstelle, aber gerade bei Laufzeitfehlern, habe ich oftmals ein Problem.
Mein Problem ist das ich jetz versuche, über eine Singelton-Klasse, in einer andern klasse und somit auch in einer andern cpp datei,auf d3ddev zu zu greifen.Jedoch funktioniert das nicht wie ich das gerne möchte, da d3ddev scheinbar sobald ich aus der cpp datei springe nichtmehr deklariert ist und mein neuer Pointer den wert 0xcdcdcdcd erhält.

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
//Framework.cpp

//andere includes

#include "Singleton.hpp"

#define g_pFramework CFramework::Get()

class CFramework : public TSingleton<CFramework>
{
    public:
                        //Ander funktion in der d3ddev ein wert zugewiesen wird

            LPDIRECT3DDEVICE9 GetDev() {return d3ddev;} //Return Directx Device

    private:
            LPDIRECT3DDEVICE9 d3ddev;   //the pointer to the device class

            //Weiter Variablen

};

//Andere Headerdatei um auf d3ddev zuzugreifen.

class CSprite 
{
    public:
        CSprite();
                    //Weiter funktionen in der d3dev benötigt wird

    private:
            LPDIRECT3DDEVICE9 *m_pDev; //Copie of d3ddev

  };

//CPP datei

CSprite::CSprite() //Construktor

{
    m_pDev=g_pFramework->GetDev();
};

//Andere Funktionen


Die Singleton.HPP ist die selbe wie aus dem buch von Heiko Kalista der vollständigkeithalber hier nochmal der Inhalt:#ifndef SINGLETON_HPP
#define SINGLETON_HPP

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
template <class T>
class TSingleton
{
  protected:

  // Membervariablen

  static T *m_pSingleton;   // Statisches Objekt


  public:

  // Memberfunktionen


  // Destruktor

  //

  virtual ~TSingleton ()
  {
  }

  // Get

  //

  // Aufgabe: Wenn nötig, statisches Objekt erzeugen und

  // Zeiger darauf zurückgeben

  //

  inline static T* Get ()
  {
    // Existiert schon eine Instanz?

    if (!m_pSingleton)
    m_pSingleton = new T;   // Nein, dann neue Instanz erzeugen


    // Zeiger auf die Instanz zurückgeben

    return (m_pSingleton);

  } // Get


  // Statisches Objekt freigeben

  //

  static void Del ()
  {
    // Gab es eine Instanz?

    if (m_pSingleton)
    {
      delete (m_pSingleton);  // Ja, dann freigeben

      m_pSingleton = NULL;    // und Zeiger auf NULL setzen

    }

  } // Del


};

// Die statische Variable erzeugen

//

template <class T>
T* TSingleton<T>::m_pSingleton = 0;

#endif


die Fehlermeldung die ich erhalte ist :

Zitat


Eine Ausnahme (erste Chance) bei 0x00a81e04 in Direct3dinit.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.
Unbehandelte Ausnahme bei 0x00a81e04 in Direct3dinit.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0xcdcdcdcd.


Wenn noch fragen zum restlichem Code, debugger angaben oder anderes bitte Fragen.

Lg dna

PS: Ich hoffe es ist in ordnung wenn ich das hier her poste, ohne ein neues thema aufzumachen.

Werbeanzeige