Okay, nach näherer Analyse lag es gar nicht am 32 Bit wchar sondern an einer C++ Problematik (die seltsamerweise bei 16 Bit wchars nicht auftrat).
Ich habe eine Klasse Control, die enthält:
void SetText(const String*);
virtual void SetText(const String&) {};
Abgeleitet davon:
Klasse Button:
void SetText(const String& string);
Nun habe ich im Python->C++ Interface (schon auf C++ Seite) den Code:
control->SetText(string);
Hierbei ist string ein lokaler Pointer.
Effekt:
VOR control->SetText(string); ist string ein korrekter wstring mit 32 Bit wchars
IN SetText in der Button-Klasse (direkt erste Zeiile der Methode) ist der string broken.
NACH SetText in der aufrufenden Methode ist der String wieder korrekt.
Wenn ich nun die Zeile durch
control->Settext(*string);
ersetze, dann geht der String nicht kaputt. Das Display ist zwar immer noch kaputt (SINGL statt SINGLEPLAYER bei manchen Strings auch falsche Zeichen nach 5-6 Zeichen etc.). Aber vermute es gibt weiter hinten in der Aufrufreihenfolge weitere analoge Probleme.
Hat jemand eine Idee ?
Falls nicht bleibt
a) Alles auf 16 Bit Wchars umschreiben (sehr aufwendig)
b) Alle pointer-Übergaben der Strings durch Referenzen ersetzen (wie oben angedeutet).
Seltsam immer noch dass es nur bei 32 Bit wchars passiert... und nur beim 68k-Compile...
Okay, was auch schief geht ist hier
void Button::SetText(const String& string)
{
outputRawWString2(string);
outputStringAddress2(string,"After SetText");
Text = string;
fprintf(stdout,"Now!aaaa!!\n");
outputRawWString2(Text); // A
outputRawWString2(string); // B
...
Der mit A gekennzeichnete Text ist kaputt, der mit B gekenntzeichnete Text ist in Ordnung. Irgendwie wird hier nicht richtig kopiert.
Text ist in der Klasse als
String Text;
definiert, wobei String ein typedef auf wcstring ist.
Wenn ich in dem letzten Beispiel statt "Text = string;"
ein
"
Text.clear();
Text.reserve(string.size());
for (size_t i = 0; i < string.size(); ++i) {
Text.push_back(string); // Manually copy each character
}"
mache, dann wird der String korrekt kopiert (display ist immer noch falsch, aber ich vermute bis zum Display gibt es weitere Assignments, und es scheint dass das Assignment die Probleme auslöst).
Also doch Compilerbug ? ^^
Danke schonmal!
Gruß,
Steffen
Ich habe eine Klasse Control, die enthält:
void SetText(const String*);
virtual void SetText(const String&) {};
Abgeleitet davon:
Klasse Button:
void SetText(const String& string);
Nun habe ich im Python->C++ Interface (schon auf C++ Seite) den Code:
control->SetText(string);
Hierbei ist string ein lokaler Pointer.
Effekt:
VOR control->SetText(string); ist string ein korrekter wstring mit 32 Bit wchars
IN SetText in der Button-Klasse (direkt erste Zeiile der Methode) ist der string broken.
NACH SetText in der aufrufenden Methode ist der String wieder korrekt.
Wenn ich nun die Zeile durch
control->Settext(*string);
ersetze, dann geht der String nicht kaputt. Das Display ist zwar immer noch kaputt (SINGL statt SINGLEPLAYER bei manchen Strings auch falsche Zeichen nach 5-6 Zeichen etc.). Aber vermute es gibt weiter hinten in der Aufrufreihenfolge weitere analoge Probleme.
Hat jemand eine Idee ?
Falls nicht bleibt
a) Alles auf 16 Bit Wchars umschreiben (sehr aufwendig)
b) Alle pointer-Übergaben der Strings durch Referenzen ersetzen (wie oben angedeutet).
Seltsam immer noch dass es nur bei 32 Bit wchars passiert... und nur beim 68k-Compile...
Okay, was auch schief geht ist hier
void Button::SetText(const String& string)
{
outputRawWString2(string);
outputStringAddress2(string,"After SetText");
Text = string;
fprintf(stdout,"Now!aaaa!!\n");
outputRawWString2(Text); // A
outputRawWString2(string); // B
...
Der mit A gekennzeichnete Text ist kaputt, der mit B gekenntzeichnete Text ist in Ordnung. Irgendwie wird hier nicht richtig kopiert.
Text ist in der Klasse als
String Text;
definiert, wobei String ein typedef auf wcstring ist.
Wenn ich in dem letzten Beispiel statt "Text = string;"
ein
"
Text.clear();
Text.reserve(string.size());
for (size_t i = 0; i < string.size(); ++i) {
Text.push_back(string); // Manually copy each character
}"
mache, dann wird der String korrekt kopiert (display ist immer noch falsch, aber ich vermute bis zum Display gibt es weitere Assignments, und es scheint dass das Assignment die Probleme auslöst).
Also doch Compilerbug ? ^^
Danke schonmal!
Gruß,
Steffen
Zuletzt bearbeitet: