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

29.10.2014, 17:45

Listing 2.52 DirectX Videomodi werden nicht gefunden

Hallo zusammen,

ich weiß das die Frage schon mal gestellt wurde, ich meine aber das sie nicht zu einem Vernüpftigen ergebnis geführt hat.

Hier erstmal das Listening 2.52:

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
#include <Windows.h>
#include <stdio.h>
#include <d3d9.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd)
{
    //Schnittstelle für Direct3D erzeugen
    PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (!pD3D)
    {
        MessageBox(NULL, "Fehler beim Erzeugen der Direct3D-Schnittstelle!", "Fehler", MB_OK | MB_ICONEXCLAMATION); //Fehler!

        return 1;
    }

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

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

    for (int iAdapter = 0; iAdapter < iNumAdapters; iAdapter++)
    {
        if (FAILED(pD3D->GetAdapterIdentifier(iAdapter, 0, &pAdapters[iAdapter])))
        {
            //Fehler
            MessageBox(NULL, TEXT("Adapterinformationen konnten nicht abgefragt werden!"), TEXT("Fehler"), MB_OK | MB_ICONEXCLAMATION);

            //Aufräumen
            pD3D->Release();
            delete[] pAdapters;
            return 1;
        }

        //Adapterinformationen anzeigen
        char acAdapterInfo[1024];
        sprintf_s(acAdapterInfo, "Adapter.ID: %d\n" 
                                 "Name: %s\n" 
                                 "Treiber: %s\n" 
                                 "Treiberversion: %d",
            iAdapter,
            pAdapters[iAdapter].Description,
            pAdapters[iAdapter].Driver,
            pAdapters[iAdapter].DriverVersion);

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

        //Ermitteln wieviele 16-Bit-Videomodi verfügbar sind
        int iNumModes = pD3D->GetAdapterModeCount(iAdapter, D3DFMT_R5G6B5);
        if (iNumModes > 0)
        {
            //Speicherplatz ermitteln und den String zurücksetzen
            D3DDISPLAYMODE* pModes = new D3DDISPLAYMODE[iNumModes];
            char acModes[16384];

            //Jeden Videomodus durchgehen
            for (int iMode = 0; iMode < iNumAdapters; iMode++)
            {
                //Informationen über diesen Modus abfragen
                pD3D->EnumAdapterModes(iAdapter, D3DFMT_R5G6B5, iMode, &pModes[iMode]);

                //Nummer, Breite, Höhe und Bildwiederholfrequenz in den String schreiben
                sprintf_s(acModes, "%s\nModus %d: %dx%d bei %d Hz (0: Standard)",
                    acModes,
                    iMode,
                    pModes[iMode].Width,
                    pModes[iMode].Height,
                    pModes[iMode].RefreshRate);
            }

            //Videomodi anzeigen
            MessageBox(NULL, acModes, "Verfügbare 16-Bit-Videomodi", MB_OK | MB_ICONINFORMATION);

            //Speicher wieder freigeben
            delete[] pModes;
        }
    }

    //Aufräumen
    pD3D->Release();
    delete[] pAdapters;

    return 0;
}


Hierbei bekomme ich bei GetAdapterModeCount() 0 zurück. Ich habe den neusten Treiber installiert, mein Grafikkarte ist eine NIVIDA GeForce GTX 750, außerdem ist das Problem wie ich schon häufiger gelesen habe kein Schleifenfehler, denn iAdapter steht zu diesem Zeitpunkt wie gewünscht auf 0.

Im Voraus schon einmal danke für die Antworten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

29.10.2014, 20:18

Vielleicht wird einfach kein 16-Bit-Videomodus unterstützt.
Warum willst du denn unbedingt 16-Bit?

3

30.10.2014, 13:43

Sorry das ich gestern nicht mehr zurückschreiben konnte, habe aber einfach keine Zeit mehr dafür gefunden.

Bin grad am alten Laptop meines Dads, da funktioniert das mit den Videomodi einigermaßen. Ich schätze es lag tatsächlich am 16-Bit Modi auch wenn ich meine das ich das gestern eigentlich ausprobiert habe, werds morgen nochmal probieren.

Jetzt hab ich aber ein weiteres Problem ich weiß nich ob ich dafür jetzt extra n neuen Forumseintrag erstellen soll.
Ich glaub ich schreibs erstmal hier rein.

Wenn ich das jetzt ausführ und mit dem Debugger durchgeh bekomm ich beim zweiten mal beschreiben von acModes in zeile 63 einen Ausnahmenfehler, das er etwas an Position 0x00000001 nicht lesen konnte. Ich hab ein bisschen rumgegoogelt und bin darauf gestoßen das acModes auf ein Stringliteral zeigt und dieses aber nicht verändert werden darf. Werd daraus aber leider nicht schlau.

(Das ich bei sprintf_s in zeile 63 ausversehen noch acModes einfügen wollte hab ich schon rausgenommen.)

Danke schonmal für die Antworten.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

30.10.2014, 15:44

Ich verrate dir nur so viel, dass der Fehler in folgender Zeile liegt:
for (int iMode = 0; iMode < iNumAdapters; iMode++)

5

30.10.2014, 18:37

Sorry des hab ich vergessen zu schreiben.

Den Fehler hab ich schon ausgebessert, ich schick noch mal schnell die Schleife wie sie zum jetzigen Zeitpunkt aussieht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
for (int iMode = 0; iMode < iNumModes; iMode++)
{
    //Informationen über diesen Modus abfragen
    pD3D->EnumAdapterModes(iAdapter, D3DFMT_R5G6B5, iMode, &pModes[iMode]);

    //Nummer, Breite, Höhe und Bildwiederholfrequenz in den String schreiben
    sprintf_s(acModes, "%s\nModus %d: %dx%d bei %d Hz (0: Standard)\n",
        acModes,
        iMode,
        pModes[iMode].Width,
        pModes[iMode].Height,
        pModes[iMode].RefreshRate);
}



Mir tun sich dabei gerade immer mehr Fehler auf.
1. Kann ich acModes nicht nochmal in acModes einfügen, denn dies führt zu dem Fehler das der Speicher des Arrays überschritten wird.
2. Lass ich das einsetzen von acModes einfach weg bekomm ich beim zweitenmal wenn die Schleife durchlaufen wird einen Fehler bei sprintf_s wegen irgendeiner zugriffsverletzung.

Danke für die Antworten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

30.10.2014, 18:42

sprintf_s(acModes, "...", acModes, ... ?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

30.10.2014, 20:01

So danke für eure Hilfe,

hab das Problem jetzt gelöst indem ich einen string gemacht hab diesen dann gefüllt hab und ihn wieder in ein char verwandelt hab.

Ich schick euch hier noch einmal den code der Schleife, da meine Variante meiner Meinung nach sehr unschön ist wäre es nett wenn ihr mir bessere Möglichkeiten schickt.

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
string acModes;
ostringstream Str;

//Jeden Videomodus durchgehen
for (int iMode = 0; iMode < iNumModes; iMode++)
{
    //Informationen über diesen Modus abfragen
    pD3D->EnumAdapterModes(iAdapter, D3DFMT_R5G6B5, iMode, &pModes[iMode]);

    //Nummer, Breite, Höhe und Bildwiederholfrequenz in den String schreiben
    acModes.append("\nModus ");
    Str.str("");
    Str.clear();
    Str << iMode;
    acModes.append(Str.str());
    acModes.append(": ");
    Str.str("");
    Str.clear();
    Str << pModes[iMode].Width;
    acModes.append(Str.str());
    acModes.append("x");
    Str.str("");
    Str.clear();
    Str << pModes[iMode].Height;
    acModes.append(Str.str());
    acModes.append(" bei ");
    Str.str("");
    Str.clear();
    Str << pModes[iMode].RefreshRate;
    acModes.append(Str.str());
    acModes.append(" Hz(0: Standard)");


}

const char *umwandlung = acModes.c_str();

//Videomodi anzeigen
MessageBox(NULL, umwandlung, "Verfügbare 16-Bit-Videomodi", MB_OK | MB_ICONINFORMATION);



Nochmals vielen Dank für eure Hilfe.

8

30.10.2014, 20:06

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
acModes.append("\nModus ");
Str.str("");
Str.clear();
Str << iMode;
acModes.append(Str.str());
acModes.append(": ");
Str.str("");
Str.clear();
// ...


C-/C++-Quelltext

1
2
3
4
Str.clear();
Str << "\nModus" << iMode << ": " /* << ... */;

const char* result = Str.str().c_str()
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

9

30.10.2014, 20:15

Danke xD hätt ich auch selber drauf kommen können.

Werbeanzeige