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

11

12.12.2015, 18:53

Achso. Sich mit Unicode in C++ zu beschäftigen ist aber auch ein muss. ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

12.12.2015, 19:30

Hier erstelle und lade ich den ofstream

C-/C++-Quelltext

1
2
3
std::ofstream textFile("Commands.txt");
            textFile.write((char*)&szTitle, sizeof(G_Command_List.size()));
            textFile.close();

Wenn du schon mit TCHAR arbeiten musst (wieso auch immer das der Fall sein mag), dann verwend auch einen basic_ofstream<TCHAR> und spar dir das gecaste; sobald du den Cast losgeworden bist, wird der Compiler dich darauf hinweisen, dass das &szTitle da oben falsch ist, womit der Compiler absolut recht hat. Rein prinzipiell solltest du in C++ nur extrem selten Casts brauchen und vor allem wenn es sich um einen Cast in einen Pointertypen handelt, sollten bei dir alle Alarmglocken läuten, denn das heißt sehr wahrscheinlich, dass du gerade etwas falsch machst... ;)

Das .close() sollte nicht notwendig sein, denn der Destruktor des Stream macht das automatisch.

Es wurde schon drauf hingewiesen, aber da du das offenbar übersehen hast: Wie genau kommst du auf das sizeof(G_Command_List.size()) hier?

PS: Wieso genau besteht dein Command struct aus zwei einzelnen Zeichen. Die Namen dieser Member suggerieren mir, dass dort auch was nicht ganz in Ordnung sein kann...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (12.12.2015, 19:38)


13

12.12.2015, 20:23

Wenn du schon mit TCHAR arbeiten musst (wieso auch immer das der Fall sein mag)

Ich muss leider...
Ich hole nämlich einen Text aus einem Fenster mit GetWindowText und dort erwartet er ein TCHAR. Du hast ja auch geschrieben, dass man nur sehr selten Casts brauchen sollte.



Das .close() sollte nicht notwendig sein, denn der Destruktor des Stream macht das automatisch.

Mal wieder etwas dazugelernt :thumbsup:

Es wurde schon drauf hingewiesen, aber da du das offenbar übersehen hast: Wie genau kommst du auf das sizeof(G_Command_List.size()) hier?

Ich habe es zuerst nur mit einem G_Command_List.size() probiert, bekam dann aber nur 1 Buchstabe angezeigt. Danach habe ich das sizeof hinzugefügt und bekam plötzlich 4.
Und solange ich nicht genau weiss was der Fehler ist, dachte ich mir, ich lass es mal dort.

Ich habe das ganze geändert und zwar so

C-/C++-Quelltext

1
G_Command_Vector.size() + 29

So wird mir aus irgendeinem Grund alles angezeigt aber es ist nur eine vorübergehende schlechte Lösung, bis ich das Problem gefunden habe.

PS: Wieso genau besteht dein Command struct aus zwei einzelnen Zeichen. Die Namen dieser Member suggerieren mir, dass dort auch was nicht ganz in Ordnung sein kann...

Wie meinst du, das es nur aus zwei einzelnen Zeichen besteht?

So sieht mein struct aus:

C-/C++-Quelltext

1
2
3
4
5
struct Command
{
    TCHAR Name;
    TCHAR Description;
};


PS:Danke für die bisher vielen tollen Antworten :thumbsup:

EDIT: @dot

Was ist den der Unterschied von einem normalen ofstream zu einem basic ofstream und wann sollte man welchen verwenden?
Und danke viel mals für den Tipp mit dem basic_ofstream :thumbsup:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

14

12.12.2015, 20:24

Ein TCHAR ist ein einzelnes Zeichen. Also hat dot schon Recht, da sind nur zwei Zeichen im Struct.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

15

12.12.2015, 20:28


Ein TCHAR ist ein einzelnes Zeichen. Also hat dot schon Recht, da sind nur zwei Zeichen im Struct.

Wie sollte ich es den anders machen?
Denn wenn ich einen Array versuche zu erstellen gibt es mir einen Fehler:

Error C3863 array type 'TCHAR [256]' is not assignable
expression must be a modifiable Ivalue

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

12.12.2015, 20:45

Wenn du schon mit TCHAR arbeiten musst (wieso auch immer das der Fall sein mag)

Ich muss leider...
Ich hole nämlich einen Text aus einem Fenster mit GetWindowText und dort erwartet er ein TCHAR. Du hast ja auch geschrieben, dass man nur sehr selten Casts brauchen sollte.

Ich bild mir ein, dass wir diese Diskussion vor kurzem schonmal hatten, anyways: verwend GetWindowTextA()


Es wurde schon drauf hingewiesen, aber da du das offenbar übersehen hast: Wie genau kommst du auf das sizeof(G_Command_List.size()) hier?

Ich habe es zuerst nur mit einem G_Command_List.size() probiert, bekam dann aber nur 1 Buchstabe angezeigt. Danach habe ich das sizeof hinzugefügt und bekam plötzlich 4.
Und solange ich nicht genau weiss was der Fehler ist, dachte ich mir, ich lass es mal dort.

Fangen wir mal so an: Was genau liefert G_Command_List.size()?


EDIT: @dot

Was ist den der Unterschied von einem normalen ofstream zu einem basic ofstream und wann sollte man welchen verwenden?
Und danke viel mals für den Tipp mit dem basic_ofstream :thumbsup:

gar keiner, ofstream ist folgendermaßen definiert:

C-/C++-Quelltext

1
typedef basic_ofstream<char> ofstream;

;)

17

12.12.2015, 20:49

Wenn du schon mit TCHAR arbeiten musst (wieso auch immer das der Fall sein mag)

Ich muss leider...
Ich hole nämlich einen Text aus einem Fenster mit GetWindowText und dort erwartet er ein TCHAR. Du hast ja auch geschrieben, dass man nur sehr selten Casts brauchen sollte.


Am einfachsten ist es, wenn du direct die 'Unicode'-Varianten der WIN-API-Funktionen verwendest anstelle von den Macros.

Z.B. ist GetWindowText ein Macro, welches zu GetWindowTextW (Unicode), bzw GetWindowTextA (ANSI) aufgelöst wird.
Dann kannst du direkt mit WCHAR oder wchar_t arbeiten und musst nicht so viel auf den richtigen Zeichensatz achten.

Hope it helps ^-^

18

12.12.2015, 21:27

Ein TCHAR ist ein einzelnes Zeichen. Also hat dot schon Recht, da sind nur zwei Zeichen im Struct.

Ich bild mir ein, dass wir diese Diskussion vor kurzem schonmal hatten, anyways: verwend GetWindowTextA()

Danke viel mals :)
Was sollte ich hier deiner Meinung nach verwenden?
Ein LPSTR? (Sagt das Programm zu mir)


Fangen wir mal so an: Was genau liefert G_Command_List.size()?

Hab gerade nachgeschaut.
Es liefert die aktuelle Anzahl der Elemente zurück :rolleyes:

gar keiner, ofstream ist folgendermaßen definiert:

Gut zu wissen :)

Am einfachsten ist es, wenn du direct die 'Unicode'-Varianten der WIN-API-Funktionen verwendest anstelle von den Macros.

Z.B. ist GetWindowText ein Macro, welches zu GetWindowTextW (Unicode), bzw GetWindowTextA (ANSI) aufgelöst wird.
Dann kannst du direkt mit WCHAR oder wchar_t arbeiten und musst nicht so viel auf den richtigen Zeichensatz achten.

Ich werde es Morgen mal probieren :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

12.12.2015, 21:29

Ich bild mir ein, dass wir diese Diskussion vor kurzem schonmal hatten, anyways: verwend GetWindowTextA()

Danke viel mals :)
Was sollte ich hier deiner Meinung nach verwenden?

char... ;)

Heutzutage würde man natürlich besser Unicode verwenden, aber wenn du schon mit dem Benutzen von Arrays an sich Probleme hast, verwend besser erstmal einfach die *A Varianten der Windows API und bleib bei char und fertig...



Fangen wir mal so an: Was genau liefert G_Command_List.size()?

Hab gerade nachgeschaut.
Es liefert die aktuelle Anzahl der Elemente zurück :rolleyes:

Und in was für einem Typ verpackt liefert es diese Anzahl?

20

12.12.2015, 21:33

Und in was für einem Typ verpackt liefert es diese Anzahl?

In einem integer

Werbeanzeige