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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

10.08.2015, 10:28

Problem bei der Übungsaufgabe 2.4.9

Hallo Leute,

ich lerne gerade DirectX kennen und bin davon begeistert. Nun bin ich auf Seite 131 angekommen, auf der eine Übungsaufgabe steht ("Schreiben Sie ein Konsolenprogramm, das alle Direct3D-Adapter auflistet. Es sollen Name, Treiber und Treiberversion angezeigt werden"). "Das klinkt nicht so schwer", dachte ich mir. Bis jetzt bin ich so weit gekommen:

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

int main()
{
    // Schnittstelle für Direct3D erzeugen
    PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (!pD3D)
    {
        std::cout << "Direct3D konnte keine Schnittstelle erstellen!" << std::endl;

        return 1;
    }

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

    // Speicher reservieren
    D3DADAPTER_IDENTIFIER9* pAdapters = new D3DADAPTER_IDENTIFIER9[iNumAdapters];

    for (int iAdapter = 0; iAdapter < iNumAdapters; iAdapter++)
    {
        if (FAILED(pD3D->GetAdapterIdentifier(iAdapter, 0,
            &pAdapters[iAdapter])))
        {
            // Fehler!
            std::cout << "Adapterinformationen konnten nicht abgefragt werden!" << std::endl;

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

        }

        // Adapterinformationen anzeigen
        char acAdapterinfo[1024];

        std::cout << "Adapter-ID: " << iAdapter << std::endl;
        std::cout << "Name: " << pAdapters[iAdapter].Description << std::endl;
        std::cout << "Treiber: " << pAdapters[iAdapter].Driver << std::endl;
        std::cout << "Treiberversion: " << pAdapters[iAdapter].DriverVersion << std::endl;

        std::cout << "\n\n";
        system("pause");

    }

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

    
    return 0;
}


Nun bekomme ich diese Fehlermeldung:
error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'LARGE_INTEGER' akzeptiert (oder keine geeignete Konvertierung möglich)

Wenn ich die Stelle in Zeile 42 auskommentiere, bekomme ich keine Fehlermeldung. Was ist der Fehler?

Vielen Dank im Voraus :)

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

2

10.08.2015, 11:23

Offenbar gibt es keinen left shift Operator für den Typen LARGE_INTEGER.
Kenne mich in der Ms Welt nicht aus, aber der erste Eintrag bei Google sieht so aus als müsstest du dafür eine Funktion verwenden.

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

3

10.08.2015, 11:35

Bei pAdapters[iAdapter].DriverVersion handelt es sich um einen LARGE_INTEGER. Für diesen Typ ist << scheinbar nicht überladen, d.h. du musst pAdapters[iAdapter].DriverVersion selbst umwandeln, damit du es mit cout ausgeben kannst.

Bei der Umwandlung könnte diese Seite helfen: LARGE_INTEGER union.

Offenbar gibt es keinen left shift Operator für den Typen LARGE_INTEGER.
Kenne mich in der Ms Welt nicht aus, aber der erste Eintrag bei Google sieht so aus als müsstest du dafür eine Funktion verwenden.


Ich glaube er wollte eher die DriverVersion mit cout ausgeben, statt zu shiften.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Superwayne« (10.08.2015, 11:46)


cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

4

10.08.2015, 12:19

Danke für die Antworten. Jetzt weiß ich schon einmal, dass ich es in einen LARGE INTEGER umwandeln muss, aber der Link von Superwayne hilft mir auch nicht weiter :dash: . Ich weiß nicht, wie ich es umwandeln kann (Google kann mir auch nicht helfen :(). Gibt es einen bestimmten Befehl?

buggypixels

Treue Seele

Beiträge: 125

Wohnort: Meerbusch

Beruf: Programmierer

  • Private Nachricht senden

5

10.08.2015, 12:27

Es ist ein LARGE_INTEGER. Du mußt es nicht zu einem solchen konvertieren.
Ich würde mich eventuell mal etwas mit dem Thema Streams vertraut machen.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

6

10.08.2015, 12:31

Es ist ein LARGE_INTEGER. Du mußt es nicht zu einem solchen konvertieren.
Ich würde mich eventuell mal etwas mit dem Thema Streams vertraut machen.


Also mit dem String-Stream (#include <sstream>)?

7

10.08.2015, 12:45

Large_Integer hat einen member quadpart, welches ein integer ist. Probier mal, diesen auszugeben.

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

8

10.08.2015, 12:52

Also so:

C-/C++-Quelltext

1
2
3
4
5
6
7
...
LARGE_INTEGER li;
...

std::cout << "Treiberversion: " << li.QuadPart << std::endl;

...

Oder habe ich es jetzt komplett falsch verstanden ?(

9

10.08.2015, 13:19

Genau :)

10

10.08.2015, 14:46

Hätte mal eine etwas andere Frage. Warum schreiben so viele Leute immer std:: vor bestimmten Funktionen
und legen keinen "Namespace std" an? Damit erspart man sich ja das lästige std::

Ich seh das ziemlich oft, finde das aber ziemlich umständlich. Oder hat das einen tieferen
Sinn, wenn man den Namespace weglässt? ?(

Werbeanzeige