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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

01.12.2007, 23:06

Was mache ich falsch?

hallo zusammen

Ich habe ein Problem bei den Adapterinformationen. Ich habe es endlich geschafft mit der Windows-Anwendung. Jetzt gibt es aber drei Fehler beim folgendem Text:


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
#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 Dierct3D-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, "Adapterinformationen konnten nicht abgefragt werden!",
                        "Fehler", MB_OK | MB_ICONEXCLAMATION);

            // Aufräumen

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

        // Adapterinformationen anzeigen

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

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

    // Aufräumen

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

    return 0;
}[/size]


Und so sehen die Fehler aus:


[size=18]1>------ Erstellen gestartet: Projekt: 3D Programme, Konfiguration: Debug Win32 ------
1>Kompilieren...
1>main.cpp
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(17) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [49]' in 'LPCWSTR' nicht möglich
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(34) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char [53]' in 'LPCWSTR' nicht möglich
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(54) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'char [1024]' in 'LPCWSTR' nicht möglich
1>        Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
1>Das Buildprotokoll wurde unter "file://c:\2005 Express Projekte\3D Programme\3D Programme\Debug\BuildLog.htm" gespeichert.
1>3D Programme - 3 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

[Codetags von rewb0rn]

Ich arbeite auf Visual C++ 2005 Express Edition.

Ich habe danach das ganz auf Visual C++ 6.0 geschrieben, da ging es dann auch. Doch bei Visual C++ 2005 Express Edition nicht.

Was mache ich Falsch?


Kann man eigentlich auch auf Visual C++ 2008 Express Edition arbeiten?


Danke

Gruss Patrick Egli

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

01.12.2007, 23:35

Re: Was mache ich falsch?

Versuchs doch nächstes mal wenn du Code im Forum postest folgendermaßen:

Quellcode

1
2
3
(Schrift hier)
[cpp](Code hier)[/cpp]
(nochma Schrift hier)
;)


Zu deinem Problem: wenn UNICODE (oder war es _UNICODE?) definiert ist wird MessageBox im Code durch MessageBoxW ersetzt und MessageBoxW erwartet UNICODE-Strings - also

C-/C++-Quelltext

1
MessageBox(0, L"Text", L"Titel", 0);

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

3

02.12.2007, 11:20

Re: Was mache ich falsch?

Zitat von »"grek40"«

Zu deinem Problem: wenn UNICODE (oder war es _UNICODE?) definiert ist wird MessageBox im Code durch MessageBoxW ersetzt und MessageBoxW erwartet UNICODE-Strings - also

C-/C++-Quelltext

1
MessageBox(0, L"Text", L"Titel", 0);
Damit du dieses Problem direkt umgehen kannst solltest du eins der folgenden Makros benutzen, die alle das gleiche machen, nämlich wenn UNICODE definiert ist ein L vor den Strig setzen und andernfalls nicht.

C-/C++-Quelltext

1
2
_T("Dein Text")
TEXT("Dein Text")

Welches du benutzt ist egal. Warum es mehrere gibt weiß nur Microsoft... ;)
Wenn du keine Lust hast den Code abzuändern, kannst du in den Projekteigenschaften unter Projekt/Eigenschaften/Konfigurationseigenschaften für Zeichensatz Multi-Byte-Zeichensatz verwenden angeben.
Auf jedem Fall solltest du die oben gezeigten Makros bei neuen Projekten immer benutzen, sonst hast du noch sehr oft solche Probleme.

EDIT: anstelle des Variablentyps char musst du den Typ TCHAR benutzen und für sprintf wsprintf.

EDIT: Erst ab Visual C++ 2005 ist Unicode der Standard. Deshalb läuft das Programm unter Visual C++ 6.0
Signaturen werden überbewertet

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

4

02.12.2007, 11:56

Hallo

Danke für die gute Antwort.

Es geht jetzt!!!

Ich habe es jetzt allerdings auf "Visual C++ 2008 Express Edition" geschrieben.


Gruss Patrick Egli

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

02.12.2007, 13:27

Re: Was mache ich falsch?

Zitat von »"GR-PA"«


EDIT: anstelle des Variablentyps char musst du den Typ TCHAR benutzen und für sprintf wsprintf.

du meinst sicher _tsprintf oder sowas ähnliches? ;)

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

6

02.12.2007, 13:35

Und jetzt?

Hallo zusammen

Jetzt bin ein Stück weiter, doch jetzt habe ich "4 Fehler" und "1 Wahrnung".


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
#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 (0, L"Fehler beim Erzeugen der Dierct3D-Schnittstelle!",
                    L"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 (0, L"Adapterinformationen konnten nicht abgefragt werden!",
                        L"Fehler", MB_OK | MB_ICONEXCLAMATION);

            // Aufräumen

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

        // Adapterinformationen anzeigen

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

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

    // Die Variable iAdapter enthält die ID des gerade aufgelisteten Adapters


    // Ermitteln, wie viele 16-Bit-Videomodi verfügbar sind

    int iNumModes = pD3D->GetAdapterModeCount(iAdapter, D3DFMT_R5G6B5);
    if(iNumModes > 0)
    {
        // Speicherplatz reservieren und String zurücksetzen

        D3DDISPLAYMODE* pModes = new D3DDISPLAYMODE[iNumModes];
        char acModes[16384] = "";

        // Jeden Videomodus durchgehen

        for(int iMode; 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(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(0, acModes, L"Verfügbare 16-Bit-Videomodi",
                   MB_OK | MB_ICONINFORMATION);

        // Speicher wieder freigeben

       delete[] pModes;
    }
    }


    // Aufräumen

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

    return 0;
}



Und hier die Fehler und Wahrnungen:


[list]------ Build started: Project: 3D Programme, Configuration: Debug Win32 ------
1>Compiling...
1>cl : Command line warning D9035 : option 'Wp64' has been deprecated and will be removed in a future release
1>main.cpp
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(17) : error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const wchar_t [49]' to 'LPCSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(34) : error C2664: 'MessageBoxA' : cannot convert parameter 2 from 'const wchar_t [53]' to 'LPCSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(54) : error C2664: 'MessageBoxA' : cannot convert parameter 3 from 'const wchar_t [17]' to 'LPCSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>c:\2005 express projekte\3d programme\3d programme\main.cpp(85) : error C2664: 'MessageBoxA' : cannot convert parameter 3 from 'const wchar_t [28]' to 'LPCSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>Build log was saved at "file://c:\2005 Express Projekte\3D Programme\3D Programme\Debug\BuildLog.htm"
1>3D Programme - 4 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
[/list]

Was mache ich jetzt wieder Falsch?


Gruss Patrick Egli

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

7

02.12.2007, 13:58

Re: Was mache ich falsch?

Zitat von »"grek40"«

Zitat von »"GR-PA"«


EDIT: anstelle des Variablentyps char musst du den Typ TCHAR benutzen und für sprintf wsprintf.

du meinst sicher _tsprintf oder sowas ähnliches? ;)

Zitat von »"Windows Programmierung 5.Auflage von Charles Petzold"«

generischer Typ für breite Zeichen (= Unicode): wsprintf

:D
@Patrick Egli: Du hast Unicode deaktiviert und übergibst MessageBox trotzdem einen Unicode String ;) entweder du entferntst das L vor dem String in der MessageBox oder Du machst es so wie ich es dir vorgeschlagen habe (Makro _T oder TEXT). Ich hab dich ja "gewarnt:"

Zitat von »"GR-PA"«

Auf jedem Fall solltest du die oben gezeigten Makros bei neuen Projekten immer benutzen, sonst hast du sehr oft solche Probleme
Signaturen werden überbewertet

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

02.12.2007, 16:47

Was ist eine "Wahrnung"?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

02.12.2007, 18:15

Zitat von »"David Scherfgen"«

Was ist eine "Wahrnung"?

Ein Fall für die Wortzensur :D

Ne, war nur nen Scherz, Zensur lohnt sich ja eher bei Worten, die alle paar Themen jemand falsch schreibt, was ja hier nicht der Fall ist.

//

Zitat von »"GR-PA"«

Zitat von »"grek40"«

Zitat von »"GR-PA"«


EDIT: anstelle des Variablentyps char musst du den Typ TCHAR benutzen und für sprintf wsprintf.

du meinst sicher _tsprintf oder sowas ähnliches? ;)

Zitat von »"Windows Programmierung 5.Auflage von Charles Petzold"«

generischer Typ für breite Zeichen (= Unicode): wsprintf

:D

Erst erklärst du groß und breit was von kompatibel zu ANSI und UNICODE und dann kommst du her und willst lieber ne reine UNICODE Routine als ne kompatible :roll:

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

10

02.12.2007, 19:50

Zitat von »"grek40"«

Zitat von »"GR-PA"«

Zitat von »"grek40"«

Zitat von »"GR-PA"«


EDIT: anstelle des Variablentyps char musst du den Typ TCHAR benutzen und für sprintf wsprintf.

du meinst sicher _tsprintf oder sowas ähnliches? ;)

Zitat von »"Windows Programmierung 5.Auflage von Charles Petzold"«

generischer Typ für breite Zeichen (= Unicode): wsprintf

:D

Erst erklärst du groß und breit was von kompatibel zu ANSI und UNICODE und dann kommst du her und willst lieber ne reine UNICODE Routine als ne kompatible :roll:

Ich habe das wichtige Wort bereits unterstrichen!
Generisch bedeutet, dass es Je nachdem, ob UNICODE definiert ist die entsprechende Art Strig erzeugt!
Der ersatz für sprintf, der nur UNICODE-Strigs erzeugt hört auf den Namen wsprintfW

EDIT: wsprintf ist übrigens die Windows-Variante, die Standardversion lautet _stprintf und die längenbegrenzte _sntprintf
Signaturen werden überbewertet

Werbeanzeige