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

18.05.2008, 15:08

TEXT-Makro auf Variablen anwenden

Ich habe versucht folgendes Listing zu kompilieren, funktioniert auch wunderbar. Allerdings macht Unicode einige Probleme im Bezug auf der Textausgabe in der Messagebox. Folgendes Listing:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main(void)
{
        PDIRECT3D9 pd3d;
    D3DADAPTER_IDENTIFIER9 *pd3d_adapter;

    pd3d = Direct3DCreate9(D3D_SDK_VERSION);

    int iNumAdapters = pd3d->GetAdapterCount();
    pd3d_adapter = new D3DADAPTER_IDENTIFIER9[iNumAdapters];

    TCHAR ca_adapter[1024];

    for(int i = 0; i < iNumAdapters; i++)
    {
        swprintf(ca_adapter, 1024, L"%s", pd3d_adapter[i].Description);
        MessageBoxW(NULL, ca_adapter, L"", 0);
    }
}


Es werden mir nur kryptische Zeichen bzw. Vierecke angezeigt. Versuche ich die Variable 'ca_adapter' mit dem TEXT-Makro auszugeben, erscheint folgender Fehler:

error C2065: 'Lca_adapter' : undeclared identifier ...

Der Zeichensatz ist übrigens auf Unicode eingestellt.

Verwendet wird Visual C++ 2008 Express Edition (Englisch) unter Windows XP. Den entsprechenden FAQ-Beitrag mit Unicode habe ich mir auch durchgelesen. Evtl. mache ich hier nur etwas falsch?

2

18.05.2008, 15:16

Wenn du das TEXT Makro meinst, dass ich kenne, benutzt man das nur für statische Strings.

C-/C++-Quelltext

1
2
3
4
5
6
7
TEXT("String")

//wird bei UNICDOE zu:

L"String"

//und sonst su

"String"

Also benutzt man das nicht für Variablen.
Dafür gibt es spezielle Funktionen um einen String in Unicdoe und zurück umzuwandeln.
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

18.05.2008, 15:35

nimm _t(), das is das funktions-äquivalent^^

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

4

18.05.2008, 16:10

Warum willst du das überhaupt tun? TCHAR wir doch sowieso jenachdem ob Unicode definiert ist oder nicht in wchar_t bzw. char umgewandelt, also wäre die Verwendung des Makros TEXT an dieser Stelle 1. nicht möglich und 2. total unnötig.
wenn du MessageBoxW aufrufst dann solltest du sowieso nicht TCHAR verwenden, denn wenn Unicode dann später doch aus ist hast du viel Arbeit das wieder richtig zu stellen. An dieser Stelle solltest du also wchar_t verwenden.
cu
Signaturen werden überbewertet

5

18.05.2008, 16:41

@Jonathan_Klein:
Hätte gedacht diese Makro könnte auch für Variablen verwendet werden

@TrommlBomml:
Nach VC++08 EE sei _t() nicht deklariert (identifier not found)

@GR-PA
TCHAR hab ich aus folgendem Grund verwendet:

Zitat von »"FAQ zu Unicode"«


Diesen Datentyp gibt es nur für einzelne Schriftzeichen aber nicht für Strings er lautet:

C-/C++-Quelltext

1
TCHAR // steht bei eingestelltem Multi-Byte für char und bei eingestelltem Unicode für das Pendant wchar_t



Sollte ich also Multi-Byte verwenden, wird automatisch char verwendet wie du bereits sagtest.

Dennoch möchte ich TCHAR (hier wchar_t) verwenden. Wie gesagt, das Problem liegt an der Darstellung des Textes. Ich möchte also versuchen ca_adapter korrekt auszugeben.

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

6

18.05.2008, 20:32

1. Um _t verwenden zu können musst du tchar.h einbinden
2. ich habe gemeint, dass du wchar_t verwenden solltest weil du MessageBoxW verwendest und wenn du auf MultiByte umschaltest einen Fehler bekommst da TCHAR dann char ist MessageBoxW aber wchar_t erwartet. Das ändert nichts an deinem Problem ist aber gut wenn du später evtl. den Code in andere Projekte kopierst.
3. Was sind denn die "Probleme im Bezug auf der Textausgabe"?

PS: Anstatt FAQ zu Unicode hättest du ruhig GR-PA schreiben können
cu
Signaturen werden überbewertet

7

18.05.2008, 21:19

Also Zeichensatz unabhängig?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>
#include <tchar.h>

int _tmain()
{
    D3DADAPTER_IDENTIFIER9 *pd3d_adapter;

    PDIRECT3D9 pd3d(::Direct3DCreate9(D3D_SDK_VERSION));

    const unsigned long num_adapters(pd3d->GetAdapterCount());
    D3DADAPTER_IDENTIFIER9*pd3d_adapter(new D3DADAPTER_IDENTIFIER9[num_adapters]);

    TCHAR adapter_name[1024];

    for (unsigned long i(0); i < num_adapters; ++i)
    {
        ::sntprintf(adapter_name, 1024, TEXT("%s"), pd3d_adapter[i].Description);
        ::MessageBox(NULL, adapter_name, TEXT(""), 0);
    }
} 
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

8

18.05.2008, 21:22

1. Erledigt
2. Hast recht, wurde geändert
3. Eigentlich nur ein Problem: Die MessageBox bringt nur Hieroglyphen zum Vorschein, in Form von Vierecken. Der Inhalt von Pd3d_adapter.Description wird nur mit seltsamen Zeichen dargestellt (Eben diese "Vierecke").

Irgendwie ein besch****ner Satzbau...

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

9

18.05.2008, 21:43

Das liegt daran, dass Description vom Typ char ist und du die Zeichen einfach über swprintf in eine Unicode-Variable kopierst.
Entweder du gibst Description mit diesem Code aus:

C-/C++-Quelltext

1
MessageBoxA(NULL, pd3d_adapter[i].Description, "", 0);

Was die einfachere Variante ist, oder du wandelst Description in Unicode um. Das ist ein wenig umständlicher und geschieht über die Funktion MultiByteToWideChar.
In der MSDN (http://msdn.microsoft.com/de-de/library/…-us,VS.85).aspx)(EDIT:Der Link wird wegen den Klammern nicht als Link angezeigt ... zumindest bei mir ... du musst ihn wohl oder übel kopieren) werden die Parameter der Funktion näher erläutert.

Übrigens gibt es auch die Funktion WideCharToMultiByte die denn umgekerhten Vorgang bewirkt.
cu
Signaturen werden überbewertet

Werbeanzeige