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

09.06.2015, 19:45

Einen Text in einen TCHAR schreiben (win32-Anwendung)

Hallo Leute,
ich habe das Problem, dass ich in einen TCHAR einen Text hineinschreiben will und diesen anschließend ausgebe. Hier der Quellcodeausschnitt:

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
    // lokale Variablen
    HWND hFrageText;
    HWND hFrage;
    const TCHAR szFrage [256] = {' '};
    

    // Zufallszahl errechnen
    ErrechneZufallszahl ();

    // Verzweigen, je nach Zufalsszahl
    switch (iZufallszahl)
    {
        // Zufallszahl = 1?
        case (1):
            {
                szFrage = "Was ergibt 1+1?";
            } break;

        // Fasche Zahl?
        default:
            {
                // szFrage = TEXT("...");
            }
            

    } // switch

    // Alles ausgeben
    //

    // "Frage:" (Als Text)
    hFrageText = CreateWindow (TEXT("STATIC"),
        TEXT("Frage:"),
        WS_VISIBLE | WS_CHILD | WS_BORDER,
        10, 150,
        50, 20,
        hWnd,
        (HMENU)ID_STATICTEXT,
        hInst,
        NULL);

    // Die Frage selber ausgeben
    hFrage =  CreateWindow (TEXT("STATIC"),
        szFrage,
        WS_VISIBLE | WS_CHILD,
        75, 150,
        130, 20,
        hWnd,
        (HMENU)ID_STATICTEXT,
        hInst,
        NULL);


Darauf bekomme ich folgende Fehlermeldung: error C2440: '=': 'const char [16]' kann nicht in 'const TCHAR [256]' konvertiert werden. Was habe ich falsch gemacht?
Danke im Voraus!

2

09.06.2015, 20:03

Du kannst Konstanten nicht nachträglich ändern.
Warum nutzt du überhaupt "TCHAR" (ist auch nur ein typedef für char). Und warum initialisierst du es nicht gleich richtig, sondern mit " "?
Richtiger wäre "const char szFrage [] = "Was ergibt 1+1?";"
Solltest du die Zeichenkette trotzdem nachher noch verändern wollen, dann nutz std::string.

mfg

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

09.06.2015, 20:14

@anti-freak Danke für die Antwort. Es geht trotzdem noch nicht. Habe ich dich falsche verstanden?

C-/C++-Quelltext

1
2
3
4
5
// Zufallszahl = 1?
case (1):
{
    const char szFrage = "Was ergibt 1+1?";
} break;

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

09.06.2015, 20:39

Les' dir bitte den ersten Satz seiner Antwort noch einmal in Ruhe durch.
Dein String ist eine Konstante (s. const).
Das bedeutet auch, dass der Speicherbereich, der für diesen String vom Compiler auf dem Stack angelegt wurde, konstant ist.
Jeder einzelne weitere Buchstabe, der hinzugefügt wird, müsste seinen eigenen Speicherplatz bekommen. Das wiederum bedeutet für dich,
dass du dich um das Speichermanagement kümmern müsstest (s. new, delete bzw. in C malloc, free ect.).

An dieser Stelle bin ich nun mal so dreist dir zu unterstellen, dass du C++ verwendest, und sogleich einen Tipp ans Herz zu legen.
Der ganze Mist der oben beschrieben wird (also diese Buchstabensuppe über Speichermanagement und Stack) wird dir von einer Klasse abgenohmen.
Die Klasse heißt String. Du kannst sie wie folgt verwenden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
// Header für die Stringklasse inkludieren
#include <string>

std::string szFrage = "Das ist doch viel einfacher, na?";

// Diese Klasse hat eine Reihe von Methoden; einfach Googlen ;)

// Die WinAPI kennt leider keine Klassen und somit keine "String"-klasse;
// Sie erwartet stet's C-Strings (also Arrays), aber das Problem löst diese Klasse auch
hWnd = CreateWindowEx(szFrage.c_str(), // Die Methode c_str() gibt ein C-String zurück
 ... )
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

09.06.2015, 20:46

Danke für die Antwort, aber ich muss am Ende den string in einen TCHAR umwandeln, um ihn ausgeben zu können:

C-/C++-Quelltext

1
2
3
std::basic_stringstream<TCHAR> Stream;
Stream << sFrage;
Stream >> szFrage;


Jetzt kommt die Fehlermeldung:error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)
PS: Ich weiß schon, dass es strings gibt und kann damit auch umgehen :)

6

09.06.2015, 21:16

Danke für die Antwort, aber ich muss am Ende den string in einen TCHAR umwandeln, um ihn ausgeben zu können:

C-/C++-Quelltext

1
2
3
std::basic_stringstream<TCHAR> Stream;
Stream << sFrage;
Stream >> szFrage;


Jetzt kommt die Fehlermeldung:error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'std::string' akzeptiert (oder keine geeignete Konvertierung möglich)
PS: Ich weiß schon, dass es strings gibt und kann damit auch umgehen :)

Scheinbar nicht.

Wie gesagt, char ist nur 1 Zeichen. Um eine Zeichenkette zu erstellen benötigst du entweder einen Container oder einen Pointer. Dementsprechend musst du entweder "const char text[]" oder "const char* text" nutzen. Damit klappt das auch. Um einen std::string in einen c string umzuwandeln gibt es die methode c_str().

PS: Es ist nicht falsch für KONSTANTE Zeichenketten c strings zu verwenden. Mach ich auch so. Nur wenn die strings zur Laufzeit manipuliert werden müssen nehme ich std::string.
mfg

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

7

09.06.2015, 21:18

Und von welchem Datentypen muss dann "text" sein? (Ich weis. Das ist eingentlich nen dumme Frage...)

8

09.06.2015, 21:20

text ist der Name der Variabel. Der Typ den ich gezeigt habe, ist entweder char* oder char[].
Aber da du den string zur Laufzeit verändern möchtest, nimm std::string. Wie gesagt, den c string bekommst du mit c_str().

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

9

09.06.2015, 21:24

Tut mir leid, dass cih zu blöd bin, aber wie sähe das im Code aus?

10

09.06.2015, 21:29

meinst du nicht, dass dir irgendwie Grundlagen fehlen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
std::string frage;

// ....
frage = "Wie heißt du?";

// ....

char* cFrage = frage.c_str();

Werbeanzeige