Fehler bei GetAdapterModeCount();



  • Hallo zusammen.
    Listing 2.16 führt bei mir leider nicht zu dem im Buch beschriebenen Ergebniss. Hier mal das Listing (obwohl ich dreist behaupte, dass es frei von Fehlern ist)...

    #include <Windows.h> 
    #include <StdIO.h> 
    #include <D3D9.h> 
    
    int                     g_iNumAdapters; 
    D3DADAPTER_IDENTIFIER9*      g_pAdapters; 
    PDIRECT3D9               g_pD3D = NULL; 
    
    int WINAPI WinMain(HINSTANCE hInstance, 
                   HINSTANCE hPrevInstance, 
                   char* pcCmdLine, 
                   int iShowCmd) 
    { 
       char acAdapterInfo[1024]; 
    
       //Schnittstelle für Direct 3D erzeugen 
    
       g_pD3D = Direct3DCreate9(D3D_SDK_VERSION); 
       if(g_pD3D == NULL) 
       { 
          //Fehler aufgetreten 
          MessageBox(NULL, "Fehler beim erzeugen der Direct 3D Schnittstelle !", 
                   "Fehler", MB_OK | MB_ICONEXCLAMATION); 
          return 1; 
       } 
    
       // Anzahl der Adapter ermitteln 
       g_iNumAdapters = g_pD3D->GetAdapterCount(); 
    
       // Speicher reservieren und Informationen über jeden Adapter sammeln 
       g_pAdapters = new D3DADAPTER_IDENTIFIER9[g_iNumAdapters]; 
    
       for (int iAdapter = 0; iAdapter < g_iNumAdapters; iAdapter++) 
       { 
          if(FAILED(g_pD3D->GetAdapterIdentifier(iAdapter, 0, 
                                       &g_pAdapters[iAdapter]))) 
          { 
             MessageBox(NULL, "Adapterinformationen konnten nicht abgefragt werden!", 
                      "Fehler", MB_OK | MB_ICONEXCLAMATION); 
             g_pD3D->Release(); 
             delete[] g_pAdapters; 
             return 1; 
          } 
    
          // Adapterinformationen anzeigen 
          sprintf(acAdapterInfo, "Adapter-ID: %d\n Name: %s\n Treiber: %s\n Treiberversion: %d", 
                iAdapter, 
                g_pAdapters[iAdapter].Description, 
                g_pAdapters[iAdapter].Driver, 
                g_pAdapters[iAdapter].DriverVersion); 
    
          MessageBox(NULL, acAdapterInfo, "Adapter gefunden", 
                   MB_OK | MB_ICONINFORMATION); 
       } 
    
       // die Variable iAdapter enthält die id des momentanen Adapters 
    
       int            iNumModes; 
       D3DDISPLAYMODE* pModes; 
       char         acModes[16384]; 
    
       // ermitteln wieviele 16-bit Videomodi verfügbar sind 
       iNumModes = g_pD3D->GetAdapterModeCount(iAdapter, D3DFMT_R5G6B5); 
       if(iNumModes >0) 
       { 
          // Speicherplatz reservieren und den Stirng zurücksetzen 
          pModes = new D3DDISPLAYMODE[iNumModes]; 
          strcpy(acModes, ""); 
    
          // jeden Videomodi durchgehen 
          for (int iMode = 0;iMode <iNumModes;iMode++) 
          { 
             g_pD3D->EnumAdapterModes(iAdapter, D3DFMT_R5G6B5, iMode, &pModes[iMode]); 
             sprintf(acModes, "%s\nModes %d: %dx%d bei %d Hz (0: Standard)", 
                   acModes, 
                   iMode, 
                   pModes[iMode].Width, 
                   pModes[iMode].Height, 
                   pModes[iMode].RefreshRate); 
          } 
    
          MessageBox (NULL, acModes, "Verfügbare 16-Bit-VideoModi", MB_OK | MB_ICONINFORMATION); 
    
          //Speicher wieder freigeben 
          delete[] pModes; 
       } 
    
       g_pD3D->Release(); 
       delete[] g_pAdapters; 
    
       return 0; 
    }
    

    iNumModes ist bei mir leider = 0 was wohl soviel bedeutet, dass meine Grafikkarte GForce TI 4200 keinerlei Videomodi unterstützt obwohl ich hier eindeutig was sehen kann

    Über Hilfe würde ich mich freuen..





  • TomasRiker schrieb:

    ➡ http://www.scherfgen-software.net/forum/viewtopic.php?p=11668#11668

    @Jetyt: Soll heißen: Dies ist nicht das offizielle Forum von diesem Buch!!

    @TomasRiker: Muahaha... die Rechtschreibprüfung in Deinem Forum ist ja geil...!! 😃 👍



  • Hehe, ja, spricht aber nur auf die allerschlimmsten Fehler an:
    - Ergebniss, Verzeichniss
    - Objeckt, Projeckt
    - ich währe gerne...
    - Vorraus
    - Standart
    und solche Dinge halt.



  • Sgt. Nukem schrieb:

    TomasRiker schrieb:

    ➡ http://www.scherfgen-software.net/forum/viewtopic.php?p=11668#11668

    @Jetyt: Soll heißen: Dies ist nicht das offizielle Forum von diesem Buch!!

    Stimmt schon, ich denke nur dieses Forum wird von mehr Leuten gelesen

    Gruß Jetyt



  • Also der Code ist IMHO schon richtig. Weiß allerdings auch nicht was du für ein "Ergebnis" meinst.

    Das einzigste was "falsch" ist, ist dass du nach deiner for-Schleife annimmst, dass iAdapter die ID des "aktuellen" Adapters enthält. iAdapter enthält aber halt nur die ID des zuletzt gefundenen Adapters, da du aber ja wahrscheinlich sowieso nur eine Grafikkarte hast, dürfte das ja kein Problem sein...



  • Jetyt schrieb:

    Sgt. Nukem schrieb:

    TomasRiker schrieb:

    ➡ http://www.scherfgen-software.net/forum/viewtopic.php?p=11668#11668

    @Jetyt: Soll heißen: Dies ist nicht das offizielle Forum von diesem Buch!!

    Stimmt schon, ich denke nur dieses Forum wird von mehr Leuten gelesen

    Gruß Jetyt

    ...aber dann solltest Du wenigsten angeben, um welches Buch es sich handelt...!!! ➡ 💡



  • @nep

    Das hätte ich auch gedacht... Schreibe ich allerdings die for-schleife (in der ich die Videomodi holen will) direkt nachdem ich den aktuellen Adapter habe funktioniert es. Obwohl ich nur eine Graka habe scheint das wohl doch noch ein Problem zu sein...

    Also thx

    Gruß Jetyt



  • Jetyt schrieb:

    Obwohl ich nur eine Graka habe scheint das wohl doch noch ein Problem zu sein...

    Klar: weil die Laufvariable nach der for-Schleife auf jeden Fall genausogroß ist wie GetAdapterCount, und das ist schon eins zu viel. Wenn GetAdapterCount z.B. 5 liefern würde, dann wäre 4 der höchste gültige Wert.



  • Ne das stimmt schon so, er hat ja als Bedingung in seiner for-schleife dass iAdapter < die Zahl von GetAdapterCount sein muss. Also wenn GetAdapterCount die Zahl 5 liefert, dann ist iAdapter auch 4.
    Trotzdem ist es halt "falsch" so wie du es machst. Du kannst ja die Schleife mit den VideoModi in deine Schleife mit den Adaptern einbinden. So hab ich das bei mir z.B. immer gemacht, und das hat auch gefunzt.



  • nep schrieb:

    Ne das stimmt schon so, er hat ja als Bedingung in seiner for-schleife dass iAdapter < die Zahl von GetAdapterCount sein muss. Also wenn GetAdapterCount die Zahl 5 liefert, dann ist iAdapter auch 4.

    Falsch!
    Wenn ich z.B. folgendes mache:

    for(int i = 0; i < 10; i++) {}
    

    Dann hat i anschließend den Wert 10, nicht 9.


Anmelden zum Antworten