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

25.09.2003, 21:02

Kapitel 2.4 - Initialisierung von Direct 3D

also ich habe das Beispielprogramm mla abgetippt und wenn ich es nun ausführen will kommt ein Speicherüberlauf zu stande.

Wie kommt das?

Quellcode

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
56
57
58
59
60
61
62
63
64
65
66
67
// Datei: WinMain.cpp

// I N C L U D E S /////////////////////////////////////////////////

#include <windows.h>          // Windows Bibliothek
#include <StdIO.h>         // für sprintf
#include <d3d9.h>

// G L O B A L E S /////////////////////////////////////////////////

HWND hwnd;
HDC     hdc;
int                     iNumAdapters;
D3DADAPTER_IDENTIFIER9* pAdapters;
PDIRECT3D9              pD3D = NULL;



// F U N K T I O N E N /////////////////////////////////////////////

// Startfunktion
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprevinst,
                        LPSTR lpcmdline, int ncmdshow)
   {
    char acAdapterInfo[1024];

    // Schnittstelle erzeugen
    if (FAILED(Direct3DCreate9(D3D_SDK_VERSION)))
    {
        MessageBox (hwnd, "Fehler beim Erstellen der Schnitstelle", "Fehler:", MB_OK | MB_ICONEXCLAMATION);
        return FALSE;
    }

    // Anzahl der Adapter ermitteln
    iNumAdapters = pD3D->GetAdapterCount();

    // Speicher reservieren und Informationen über jeden Adapter sammeln
    pAdapters = new D3DADAPTER_IDENTIFIER9[iNumAdapters];

    for (int iAdapter = 0; iAdapter < iNumAdapters; iAdapter++)
    {
        if (FAILED(pD3D->GetAdapterIdentifier (iAdapter, 0,
                                               &pAdapters[iAdapter])))
        {
            MessageBox(hwnd, "Fehler", "Fehler", MB_OK);

            pD3D->Release();
            delete[] pAdapters;
            return 1;
        }

        sprintf(acAdapterInfo, "Adapter-ID: %d\n Name: %s\n Treiber: %s\n Treiberversion: %d",
                    iAdapter,
                    pAdapters[iAdapter].Description,
                    pAdapters[iAdapter].Driver,
                    pAdapters[iAdapter].DriverVersion);

        MessageBox(hwnd, acAdapterInfo, "Adapter gefunden",
                   MB_OK | MB_ICONINFORMATION);
    }

    pD3D->Release();
    delete[] pAdapters;

    return 0;
        
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

25.09.2003, 21:16

Re: Kapitel 2.4 - Initialisierung von Direct 3D

Zitat von »"Leax"«

// Schnittstelle erzeugen
if (FAILED(Direct3DCreate9(D3D_SDK_VERSION)))

Da liegt der Fehler. Du weist der Variablen "pD3D" nirgendwo einen Wert zu. Es sollte heißen: pD3D = Direct3DCreate9(D3D_SDK_VERSION);, und zum Prüfen, ob es einen Fehler gab: if(pD3D == NULL).

3

25.09.2003, 21:22

oder man kombiniert einfach:

Quellcode

1
if (FAILED(pD3D=Direct3DCreate9(D3D_SDK_VERSION)))

Fraktal

Frischling

Beiträge: 15

Wohnort: Zülpich

Beruf: Student

  • Private Nachricht senden

4

26.09.2003, 10:59

Lieber nicht, da FAILED und SUCCEEDED nur für HRESULT gedacht sind und eventuell hier genau falschherum agieren. Folgendes reicht:

if(!(pD3D = Direct3DCreate9(D3D_SDK_VERSION)))

5

26.09.2003, 15:35

Also sollte man das doch nicht durch FAILED überprüfen?


Das verstehe ich jetzt aber nicht, scheiße!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

26.09.2003, 17:47

FAILED und SUCCEEDED sind für HRESULT gedacht.
Direct3DCreate9 liefert aber nicht HRESULT, sondern einen Zeiger.
Wenn der Zeiger NULL ist, ist ein Fehler aufgetreten.

7

26.09.2003, 19:36

und wann sollte man ihn dann nicht verwenden?

DarthB

Treue Seele

Beiträge: 265

Beruf: Schüler

  • Private Nachricht senden

8

26.09.2003, 20:14

Man sollte sie nur verwenden wenn eine Funktion einen HRESULT zurückliefert. ;)

Ciao DarthB :huhu:

9

27.09.2003, 09:50

Achso, und da ich bei meiner Komposition eine Zuweisung inn der If-Anweisung habe, gibt es da keinen Rückgabewert....

Werbeanzeige