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

1

01.08.2009, 11:05

PDIRECT3DDEVICE9 extern

Hallo, ich erstelle über

C-/C++-Quelltext

1
2
3
4
5
6
7
//A.cpp

g_pD3D->CreateDevice(pParameters->iAdapter,
                                             pParameters->DeviceType,
                                             hWindow,
                                             pParameters->dwFlags,
                                             &PresentParams,
                                             &g_pD3DDevice


meine Direct3D9 Schnittstelle.

Diese Schnittstelle brauche ich nun in einer anderen Datei. Ich habe das so versucht zu lösen:

In A.cpp erstell ich mir eine neue Variable und belege sie mit g_pD3DDevice:

C-/C++-Quelltext

1
2
PDIRECT3DDEVICE9    device;
device = g_pD3DDevice;


In einer anderen Datei will ich nun auf device zugreifen, dazu:

C-/C++-Quelltext

1
2
//B.cpp

extern PDIRECT3DDEVICE9 device;


Das gibt immerhin keine Fehlermeldung.
Nun will ich mit device D3DXLoadMeshHierarchyFromX aufrufen, also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
D3DXLoadMeshHierarchyFromX(
    "Data\\Models\\menschen_basis.x",
    D3DXMESH_MANAGED,
    device,
    memoryAllocator,
    NULL,
    &m_frameRoot,
    &m_animController );

    if(device == NULL)
        sprintf(acText3,"device == NULL");


Nun wird mir in meiner Anwendung aber eben device == NULL ausgegeben. Also scheint da irgendwas nicht richtig geklappt zu haben. Habe ich das mit dem extern falsch gemacht oder fange ich den Fehler nur falsch ab?

Danke für Hilfe.

2

01.08.2009, 11:14

Da du ja sowieso ein globale Variable verwendest, könntest du das so lösen:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
// A.h

extern PDIRECT3DDEVICE9 g_pD3DDevice;

// A.cpp

PDIRECT3DDEVICE9  g_pD3DDevice = 0;


// B.cpp, C.cpp, D.cpp...

#include "A.h"


Include-Guards nicht vergessen. ;)
fka tm

3

01.08.2009, 11:16

hm also dieses ganze Prinzip von extern ist mir scheinbar noch nicht ganz klar. Ich dachte da wo ich die Variable verwenden will muss ich extern schreiben, also in b.cpp. Damit ich dem compiler sage: die variable ist an anderer stelle definiert.

4

01.08.2009, 11:21

Geht wohl auch ohne "extern".

Deklaration im Header, Definition in der cpp.

Bekanntmachen der Variable durch Inkludieren des Headers in den anderen cpp's.
fka tm

5

01.08.2009, 11:29

Also irgendwie krieg ichs nicht hin, hier nochmal der code etwas konkreter:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//InitDirect3D.h

#ifdef _INITDIRECT3D_CPP
#undef VAR
#define VAR
#else
#undef VAR
#define VAR extern
#endif


VAR PDIRECT3D9          g_pD3D;
VAR PDIRECT3DDEVICE9    g_pD3DDevice; //Da will ich ran


C-/C++-Quelltext

1
2
3
//game.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"
PDIRECT3DDEVICE9 g_pD3DDevice;


So hab ichs jetzt also versucht. Gibt mir aber:
1>InitDirect3D.obj : error LNK2005: "struct IDirect3DDevice9 * g_pD3DDevice" (?g_pD3DDevice@@3PAUIDirect3DDevice9@@A) ist bereits in game.obj definiert.
1>H:\Dokumente\Programmierung\DirectX\DirectX_Clean\Release\DirectX_Testing.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.

Also habe jetzt einfach mal das PDIRECT3DDEVICE9 g_pD3DDevice; weg gelassen in game.cpp. Dachte das gibt mir nen Fehler weil er die Variable nicht kennt. Aber erstaunlicher Weise kennt er die Variable wohl tatsächlich aus der header Datei. Im Programm selbst krieg ich aber immernoch device == NULL.

6

01.08.2009, 11:39

Probiers mal so:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
//InitDirect3D.h

#ifndef INITDIRECT3D_H
#define INITDIRECT3D_H

extern PDIRECT3D9 g_pD3D; // Deklarationen

extern PDIRECT3DDEVICE9 g_pD3DDevice;

#endif // INITDIRECT3D_H



C-/C++-Quelltext

1
2
3
4
5
6
7
//InitDirect3D.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"

PDIRECT3D9 g_pD3D = 0; // Definitionen

PDIRECT3DDEVICE9 g_pD3DDevice  = 0;

// CreateDevice etc.



C-/C++-Quelltext

1
2
3
4
//game.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"

g_pD3DDevice->MachWas(...);
fka tm

7

01.08.2009, 11:59

Zitat

... im Programm selbst krieg ich aber immernoch device == NULL ...


Wofür brauchst du "device" denn noch?
Verwende g_pD3DDevice!


Bitte schreib jeweils einen neuen Post, anstatt zu editieren.
Sonst geht das evtl. unter...
fka tm

8

01.08.2009, 12:46

ja mach ich ja, aber g_pD3DDevice scheint leer zu sein.

9

01.08.2009, 12:59

Dann würde ich mal die Reihenfolge checken, wo/wann CreateDevice ausgeführt wird, bzw. den Gültigkeitsbereich von g_pD3DDevice prüfen.

Ansonsten zeig mal ein paar relevante Codeschnipsel.
fka tm

10

01.08.2009, 17:19

Ok also nochmal zusammenfassend was ich jetzt habe.

In InitDirect3D.h/cpp wird unter Anderem das Direct3D-device erstellt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//InitDirect3D.h


#ifdef _INITDIRECT3D_CPP
#undef VAR
#define VAR
#else
#undef VAR
#define VAR extern
#endif

VAR PDIRECT3D9          g_pD3D;
VAR PDIRECT3DDEVICE9    g_pD3DDevice;

tbResult InitDirect3D(SDirect3DParameters* pParameters, HWND hWindow);
tbResult ExitDirect3D();


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//InitDirect3D.cpp


g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

g_pD3D->CreateDevice(pParameters->iAdapter,
                                             pParameters->DeviceType,
                                             hWindow,
                                             pParameters->dwFlags,
                                             &PresentParams,
                                             &g_pD3DDevice)


In game.cpp will ich nun mit D3DXLoadMeshHierarchyFromX ein .x file laden. Wozu ich das vorher erstellte device brauche.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//game.cpp

#include "H:\\Dokumente\\Programmierung\\DirectX\\DirectX_TriBase\\Allgemeines\\InitDirect3D.h"

    HRESULT hr = D3DXLoadMeshHierarchyFromX(
    "Data\\Models\\bones_all.x",
    D3DXMESH_MANAGED,
    g_pD3DDevice,
    memoryAllocator,
    NULL,
    &m_frameRoot,
    &m_animController );

    if(hr == E_OUTOFMEMORY)
        sprintf(acText3,"E_OUTOFMEMORY");
    if(hr == D3DERR_INVALIDCALL)
        sprintf(acText3,"D3DERR_INVALIDCALL");


Im Spiel lasse ich mir acText3 ausgeben, da kriege ich dann D3DERR_INVALIDCALL. Ich denke halt, dass mit g_pD3DDevice etwas nicht stimmt.
Nen Fehler vom compiler kriege ich nicht. Das Spiel stürzt auch nicht ab. Aber eigentlich sollte die geladene .x file gerendert werden. Möglicherweise stimmt auch was mit den Render Funktionen nicht. Aber da ich beim Laden schon D3DERR_INVALIDCALL kriege, sollte man wohl hier mit der Fehlersuche anfangen.

Werbeanzeige