WideString Ärger
-
kann mir jemand erklären, warum nach dem Ausführen dieses Codes l gleich 0 ist;
int l = 10; WideString w = WideString(""); if (w == NULL) l = w.Length();
-
Ich vermute dass WideString::operator wchar_t *() aufgerufen wird der dann Null zurückgibt wenn der String leer ist.
Gruß
-
Hallo
Gegenfrage : Was sollte deiner Meinung nach denn sonst rauskommen? In w ist nun mal kein Zeichen, also ist die Länge des Strings gleich 0.
/Edit : Achso, es geht dir um die Bedingung. NULL wird dazu impliziet in einen WideString konvertiert, indem der Konstruktor für char* aufgerufen wird. Und damit wird ein leerer WideString mit einem leerem WideString verglichen.
bis bald
akaei
-
Warum nicht meine Methode? - Warum konvertiert der Compiler NULL in einen WideString und nicht den WideString in einen Pointer?
ps: du hast dich bei deinem Namen vertippt

edit:
struct Foo { Foo() { std::cout << "Foo::Foo();\n"; } Foo(const char* p) { std::cout << "Foo::Foo(const char*);\n"; } operator const char*() { std::cout << "Foo:: operator const char*();\n"; return NULL;} }; int main(int argc, char* argv[]) { Foo bar; if(bar == NULL) { std::cout << "bar == NULL"; } }Gibt mir das Recht? :p
Gruß
-
es wird wohl so sein, aber ist das nicht totaller Schwachsinn?
noch mehr dazu:
WideString w1 = WideString("");
WIdeString w2 = L"";und jetzt kommt: w1 ungleich(!) w2.
aber w1.Length() == w2.Length();

-
keine ahnung was du so verzapfst, aber bei mir sind w1 und w2 gleich!
-
FireFlow schrieb:
Warum nicht meine Methode? - Warum konvertiert der Compiler NULL in einen WideString und nicht den WideString in einen Pointer?
weil der WideString keinen Funktionsoperator hat der nen Zeiger zurückliefert (wozu auch), ausserdem hat WideString nen Vergleichsoperator == ueber den der Vergleich erfolgt und dieser erwartet (völlig unerwartet) nen WideString als Argument!
-
keine ahnung was du so verzapfst, aber bei mir sind w1 und w2 gleich!
es kommt rauf an, wie du deine anweisung im quellcode hast!
hier ein kleiner test:
WideString w1; // Data:NULL w1 = L""; // Data:"" int l1 = w1.Length(); // l1 = 0 WideString w2 = L""; // Data:NULL int l2 = w2.Length(); // l2 = 0 WideString w3 = L"TEST"; // Data:TEST w3 = L""; // Data:"" int l3 = w3.Length(); // l3 = 42 WideString w4 = WideString(""); // Data: NULL int l4 = w4.Length(); // l4 = 0 WideString w5; // Data:NULL w5 = WideString(""); // Data:NULL int l5 = w5.Length(); // l5 = 0 WideString w6 = WideString("TEST"); // Data:TEST w6 = WideString(""); // Data:NULL int l6 = w6.Length(); // l6 = 0je nach dem, wie mann das im quellcode eingibt, kommen vollig unterschiedliche ergebnisse.
bei test 3 ist der aller schlimster
ich vermutte mal, dass wenn ich im editor die Schriftart ändere, bekomme ich wieder mal andere Ergebnisse
-
Sunday schrieb:
FireFlow schrieb:
Warum nicht meine Methode? - Warum konvertiert der Compiler NULL in einen WideString und nicht den WideString in einen Pointer?
weil der WideString keinen Funktionsoperator hat der nen Zeiger zurückliefert (wozu auch), ausserdem hat WideString nen Vergleichsoperator == ueber den der Vergleich erfolgt und dieser erwartet (völlig unerwartet) nen WideString als Argument!
Achja?
// wstring.h namespace System { class RTL_DELPHIRETURN WideString { /* [...] */ public: operator BSTR() const { return Data; } /* [...] */ }; } // in irgendwelchen anderen Headern typedef /* [wire_marshal] */ OLECHAR *BSTR; typedef WCHAR OLECHAR; typedef wchar_t WCHAR;Deinen Vergleichsoperator finde ich jedoch gerade nirgends

Gruß
-
// in wstring.h bool __fastcall operator ==(const WideString& rhs) const; bool __fastcall operator !=(const WideString& rhs) const;