Problem beim casten in C++

Hallo,

ich brauche Hilfe bei einem C++ Projekt.
Ich muss dazu eine int Variable erst in eine char* Variable einfügen und das ganze dann zu einer LPCTSTR Variable casten.

Das ganze soll danach so aussehen: „FPS: 31“.

Code:
*.h
LPCTSTR fps;

*.cpp
int f = timer->getFPS();
char s[10];
sprintf(s, „FPS: %d“,f);
// Bis hierher funktioniert das ganze!
fps = (LPCTSTR)(s);

Nun stehen in der Variable fps nur noch chinesische Zeichen.

Ich habe schon bei google gesucht aber es funktioniert bei mir nicht. Am besten wäre ein Lösung die in C, also ohne C++ Funktionen, auskommt!

Danke!

Hallo,

fps = (LPCTSTR)(s);

Nun stehen in der Variable fps nur noch chinesische Zeichen.

Was fuer ein Typ ist denn LPCTSTR genau? Und was erwartest du, dass die Zeichenkodierung des Strings in fps sein soll?

Gruesse,
Moritz

Hallo,
das ist ein Datentyp, den ich benötige wenn ich den Unicode-Zeichensatz verwende.
Beispielsweise möchte ich eine Textur laden oder eben Texte ausgeben.
Was fps für eine Zeichenkodierung haben soll? Eigentlich würde ASCII ausreichen, falls du das meinst?!

Beispielsweise:
D3DXCreateTextureFromFile(directX.device, mat[i].pTextureFilename, &texturen[i]
----->
error C2664: ‚D3DXCreateTextureFromFileW‘: Konvertierung des Parameters 2 von ‚LPSTR‘ in ‚LPCWSTR‘ nicht möglich.

Oder:
LPCWSTR str = reinterpret_cast(mat[i].pTextureFilename);
str = „畫敧⹬灪gꮫꮫꮫꮫﻮﻮﻮ“
(Keine Fehlermeldung beim Compilieren.)

Ob LPCWSTR oder LPCTSTR ist an dieser Stelle egal, das Ergebnis bleibt das selbe. (Diese Funktion benötigt LPCWSTR - wobei sich diese beiden Typen „gegenseitig“ casten lassen.)

Ich hoffe das holft weiter?

Gruß, Michael

V

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

sprintf und LPCTSTR (Windows)
Hi,

etwas salopp:
Wenn LPCWSTR und LPCTSTR sich gleich verhalten, dann ist der ‚UNICODE-Modus‘ eingeschaltet, und Strings werden immer als UNICODE erwartet.
LPCSTR -> 1-Byte-Kodierung
LPCWSTR -> Mehrbyte-Kodierung
LPCTSTR -> je nachdem, ob #define _UNICODE da ist oder nicht (wird in Visual Studio als Kommandozeilenparameter übergeben! -> Projekteinstellungen)

Mit _UNICODE haut aber sprintf nicht hin, denn sprintf verwendet 1-Byte-Kodierung.
Ersetz mal sprintf() durch _stprintf() (oder andersrum LPCTSTR durch LPCSTR).

Es gibt viele Funktionen und Typen in drei Ausführungen:

"ANSI" UNICODE 'hängt von \_UNICODE ab'
LPSTR LPWSTR LPTSTR
LPCSTR LPCWSTR LPCTSTR
printf \_wprintf \_tprintf
scanf \_wscanf \_tscanf
fopen \_wfopen \_tfopen
... \_w... \_t...

Weiterlesen bitte in der Dokumentation.

Gruß, Ralf

Hallo Michael,

In der „winnt.h“ findest du folgendes:

typedef CONST CHAR \*LPCSTR, \*PCSTR;

// Bis hierher funktioniert das ganze!
fps = (LPCTSTR)(s);

Das klappt nicht, weil hier nur die 4 Bytes der Speicher-Adresse kopiert werden, nicht der Text.
Ich würde daher sowas probieren:

strcpy(ziel, quelle);

Danke!

Bitte!

mfG
Martin B

Auch Hallo,

(sinngemäß:smile:

LPCTSTR fps;
char s[10];
fps = (LPCTSTR)(s);

Das klappt nicht, weil hier nur die 4 Bytes der
Speicher-Adresse kopiert werden, nicht der Text.

Da sowohl fps als auch s Zeiger sind, ist fps=(LPCTSTR)s hier durchaus richtig.

Ich würde daher sowas probieren:

strcpy(ziel, quelle);

Das geht nicht, da fps nur als Zeiger vereinbart ist und nicht auf einen gültigen Speicherbereich zeigt. Dann kopiert strcpy() die Daten in den Wald (bzw. versucht es) und die Programmausführung endet recht abrupt.

Gruß,
Ralf

Nachtrag: char vs CHAR / WCHAR / TCHAR
Noch ein Hinweis:

wenn Du mit UNICODE-Strings arbeiten willst/musst, wirst Du mit ‚char‘ auch nicht wirklich glücklich.

In dem Dunstkreis, in dem auch LPTSTR et al. verwendet werden, empfiehlt sich die Verwendung der Typen CHAR oder WCHAR oder TCHAR.

Auch hierzu sei angeraten, sich in die Dokumentation zu vertiefen.

ruß,
Ralf

Hallo,

Was fps für eine Zeichenkodierung haben soll? Eigentlich würde
ASCII ausreichen, falls du das meinst?!

ASCII enthält keine chinesischen Schriftzeichen, also wird fps auch nicht als ASCII interpretiert.
In welcher Zeichenkodierung wird es denn interpretiert?

Grüße,
Moritz

Hallo Fragewurm,

Du hast das grundsätzlich etwas missverstanden !

Wenn man unterschiedliche Datentypen einander zuweist, versucht zuerst der Compiler eine entsprechende Konvertierung vorzunehmen:

also bei:
long a;
char b;

a = b;

fügt der Compiler die zusätzlichen Bits automatisch an. Je nachdem wie char definiert ist mit Signextension.

Kennt der Compiler keine Konversionsvorschrift, bekommst du eine Fehlermeldung betreffend unverträglicher Typen.

Das Casten ist etwas anderes !
Hierbei wird die Typenprüfung des Compilers AUSGESCHALTET und da kannst so auch Unverträgliche Typen einander zuweisen !
Casten darf man nur, wenn man genau WEISS was man tut, und NIE um einfach die Fehlermeldung des Compilers zu unterdrücken !

MfG Peter(TOO)

Auch Ralf,

(sinngemäß:smile:

LPCTSTR fps;
char s[10];
fps = (LPCTSTR)(s);

Das klappt nicht, weil hier nur die 4 Bytes der
Speicher-Adresse kopiert werden, nicht der Text.

Da sowohl fps als auch s Zeiger sind, ist fps=(LPCTSTR)s hier
durchaus richtig.

Ja, wenn die Adresse kopiert werden soll, dann bitte. Aber das hatte er wohl nicht vor.
Ich habe stark den Eindruck, der Kollege wollte den Text kopieren, nicht die Adresse, die der Zeiger speichert.
Ein Zeiger ist eine Variable mir der Groesse von 4 Bytes.

strcpy(ziel, quelle);

Das geht nicht, da fps nur als Zeiger vereinbart ist und nicht

Na, das man Zeiger checkt, ob die was dran haben, das setzte ich mal voraus.

mfG
Martin B

Hallo Martin,

Ein Zeiger ist eine Variable mir der Groesse von 4 Bytes.

Umdenken Kollege !

Windows und Linux gibt es mittlerweile auch als 64-Bit Versionen. Da sind Zeiger dann 8 Byte lang.
Und auf manchen Micro Controllern ist ein Zeiger immer noch 2 Byte lang.

MfG Peter(TOO)

Sachen gibt’s! (leer)