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

Iljaronaldo

Treue Seele

  • »Iljaronaldo« ist der Autor dieses Themas

Beiträge: 99

Wohnort: Hadamar

Beruf: Schüler[9.Klasse Realschule]

  • Private Nachricht senden

1

27.01.2010, 16:17

VideoModi Infos Ausgabe funktioniert nicht richtig

Hey,

ich habe das Kapitel über Direct3D durchgearbeitet und komme garnicht weiter bei einer Aufgabe.
Zusammenfassung d. Aufgabe:
Alle verfügbaren Adapter anzeigen
Der Benutzer soll einen der Adapter auswählen und dann sollen alle verfügbaren Videomodi aufgelistet werden mit dem Parameter D3DFMT_X8R8G8B8 und das alles über eien Funktion, die als Parameter den D3DFormat enthält.

Ich habe auch soweit alles hinbekommen, nur bei der Eingabe scheitere ich.
Die Methode EnumAdapterModes erwartet den Adapter über den es die Beschreibung liefern soll.Ich dachte mir hier wäre es doch ein guter Ansatzpunkt wo man die Eingabe des benutzers ins Spiel bringt.Alles scheint auch logisch(für mich zumindest) und es gibt aucvh keine Fehler aber nachdem man seinen Adapter auswählt beendet sich das programm.Das heißt bei der if(iNumModes < 0) Anweisung läuft es nicht mehr weiter sondern beendet sich.

Durch diese vielen Schleifen bin ich jetzt so durcheinander, dass ich nicht erkenne woran es liegen könnte.Der Ansatz ist denke ich richtig.

Hoffe auf Hilfe.

Und hier der Code:



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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <tribase.h>
#include <D3D9.h>

using namespace std;

int Ausgabe(D3DFORMAT Format)
{
    tbInit();
//Schnittestelle 

PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);

if(!pD3D)
{
    TB_INFO("Direct3D9 Schnittstelle wurde nicht erzeugt!");
    return 1;
}
else TB_INFO("Direct3D9 Schnittstelle wurde erfolgreich erstellt!");

//Anzahl der Adapter

int iNumAdapters = pD3D->GetAdapterCount();


//Füllen der Infostruktur

D3DADAPTER_IDENTIFIER9 * pAdapters = new D3DADAPTER_IDENTIFIER9[iNumAdapters];  

//Struktur füllen

for(int i = 0;i < iNumAdapters; i++)
{
    if(pD3D->GetAdapterIdentifier(i, 0, &pAdapters[i]))
    {
            TB_INFO("Fehler beim Füllen der Struktur!");
            //Wenn es fehler gab die Schnittstelle auf räumen

            pD3D->Release();
            delete[] pAdapters;
            return 1;
    }
    else TB_INFO("Struktur wurde erfolgreich gefüllt!");
    char acInfos[1024];
    sprintf(acInfos, "Adapter-ID: %d\n"
                     "Name:  %s\n"
                     "TreiberVersion: %d",
                     i, 
                     pAdapters[i++].Description,
                     pAdapters[i].DeviceName,
                     pAdapters[i].DriverVersion);
    cout<<acInfos<<endl;



//VideoModi-----------------------------------------------------------------------------

int iNumModes = pD3D->GetAdapterModeCount(i, Format);

cout<<"Wählen Sie den gewünschten Adapter aus: "<<endl;
UINT Auswahl;
cin>>Auswahl;

if(iNumModes > 0)
{
        D3DDISPLAYMODE *pMode = new D3DDISPLAYMODE[iNumModes];
        char acMode[16000] = "";
    for(int iModes = 0;iModes < iNumModes;iModes++)
        if(pD3D->EnumAdapterModes(i, Format, Auswahl , &pMode[iModes]))
        {           
            sprintf(acMode, "%s\nModus %d: %dx%d bei %d Hz(0: Standard)",
                    acMode,
                    pMode[iModes].Width,
                    pMode[iModes].Height,
                    pMode[iModes].RefreshRate);

        }   
        TB_INFO("VideoModi Anzeigen!");
        cout<<acMode<<endl;
delete[] pMode;
        
        
    }
}




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


return 0;


};

int main()
{
Ausgabe(D3DFMT_X8R8G8B8);

tbExit();
cin.ignore();
cin.get();
return 0;

}


Ich kann nur sagen:"Das kapitel hats in sich, ich wäre fast verrückt geworden bei den vielen Strukturen und Flags :o"!

EDIT:
Habs doch hinbekommen.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <iostream>
#include <tribase.h>
#include <D3D9.h>

using namespace std;

int Ausgabe(D3DFORMAT Format)
{
    tbInit();
//Schnittestelle 

PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);

if(!pD3D)
{
    TB_INFO("Direct3D9 Schnittstelle wurde nicht erzeugt!");
    return 1;
}
else TB_INFO("Direct3D9 Schnittstelle wurde erfolgreich erstellt!");

//Anzahl der Adapter

int iNumAdapters = pD3D->GetAdapterCount();


//Füllen der Infostruktur

D3DADAPTER_IDENTIFIER9 * pAdapters = new D3DADAPTER_IDENTIFIER9[iNumAdapters];  

//Struktur füllen

for(int i = 0;i < iNumAdapters; i++)
{
    if(pD3D->GetAdapterIdentifier(i, 0, &pAdapters[i]))
    {
            TB_INFO("Fehler beim Füllen der Struktur!");
            //Wenn es fehler gab die Schnittstelle auf räumen

            pD3D->Release();
            delete[] pAdapters;
            return 1;
    }
    else TB_INFO("Struktur wurde erfolgreich gefüllt!");
    char acInfos[1024];
    sprintf(acInfos, "Adapter-ID: %d\n"
                     "Name:  %s\n"
                     "TreiberVersion: %d",
                     i, 
                     pAdapters[i].Description,
                     pAdapters[i].DeviceName,
                     pAdapters[i].DriverVersion);
    cout<<acInfos<<endl;



//VideoModi-----------------------------------------------------------------------------

int iNumModes = pD3D->GetAdapterModeCount(i, Format);

cout<<"Wählen Sie den gewünschten Adapter aus: "<<endl;
UINT Auswahl;
cin>>Auswahl;

if(iNumModes > 0)
{
        TB_INFO("pMode speicher reservieren");
        D3DDISPLAYMODE *pMode = new D3DDISPLAYMODE[iNumModes];
        char acMode[16000] = "";
        TB_INFO("For Schleife Anfang");
        for(int iModes = 0;iModes < iNumModes;iModes++)
        {
            pD3D->EnumAdapterModes(i, Format, Auswahl , &pMode[iModes]);
                        
                sprintf(acMode, "%s\nModus %d: %dx%d bei %d Hz(0: Standard)",
                    acMode,
                    pMode[iModes].Width,
                    pMode[iModes].Height,
                    pMode[iModes].RefreshRate);

                
            TB_INFO("VideoModi Anzeigen!/For schleife ende");
            cout<<acMode<<endl;
            delete[] pMode;
        }
        
    }
}




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


return 0;


};

int main()
{
Ausgabe(D3DFMT_X8R8G8B8);

tbExit();
cin.ignore();
cin.get();
return 0;

}

Aber jetzt kommt folgender fehler:

(Link)


Sowas habe ich noch nie gesehen :/
Woran kann es liegen?

Und ich merke gerade, dass die Ausgabe der VideoModi nicht so ganz meiner Vorstellung entspricht.Kann es sein, dass da auch was falsch ist?
tutti colpevole, nessuno colpevole. - Wenn einer Schuld ist, sind Alle Schuld.
Die Mafia ist wie ein Staat. Sie mordet nicht, Sie richtet hin.

Wenn man zwei Stunden lang mit einem Mädchen zusammensitzt, meint man, es wäre eine Minute. Sitzt man jedoch eine Minute auf einem heißen Ofen, meint man, es wären zwei Stunden. Das ist Relativität. (Albert Einstein)

Mein System

2

27.01.2010, 16:38

Wahrscheinlich gefallen dem Debugger deine Deklarationen nicht:

C-/C++-Quelltext

1
2
3
UINT Auswahl;  // Nix gut


UINT Auswahl = 0;  // Besser


Jo, die Ausgaben sehen seltsam aus.

Das hier innerhalb der Schleife zu machen,
halte ich für keine gute Idee:

C-/C++-Quelltext

1
2
3
TB_INFO("VideoModi Anzeigen!/For schleife ende");
cout<<acMode<<endl;
delete[] pMode;

3

28.01.2010, 18:00

Du hast in dem sprintf ein iModes vor pMode[iModes].Width vergessen ;)
Und das Delete sollte wirklich ausserhalb der Schleife sein.

Werbeanzeige