CString macht komisches Zeugs!
-
Hi Leute,
Ich hab hier eine Klasse, die nen Member vom Typ CString hat.
Dieser Member ist public.
Ich hab von dieser Klasse eine Variable angelegt. Diese Klasse hat ein paar Funktionen und eine davon bringt mich um den Verstand:CClass var; int n1 = (int)&var.String; var.Func();
und in Func:
void CClass::Func() { int n2 = (int)&String; }
soooooo: n2 ist um 4 grösser als n1 !!!! Obwohl die eigentlich beide auf den selben Speicherbereich zeigen sollten!! Jemand ne Idee? Wäre sehr sehr dankbar.
-
Dein Problem ist nicht gerade klar geschildert. Könntest du es bitte nochmal ein bisschen verständlicher versuchen?
-
Wenn ichs verstanden hätte, dann könnte ich es auch lösen! Ich weiss eben nur, dass sich beim eintritt in diese eine funktion die adresse dieses CStrings geändert hat! VOn mir aus kann er das ja machen, aber m_pchData des CStrings ist dann NULL! und das gibt nen ASSERT.
Sorry, aber ich bin voll geladen, mach da jetzt schon ewig rum.
-
Dummer Tipp in dieser Situation, aber schlaf mal ne Runde, morgen löst sich das Problem 100%ig. Du bist einfach überarbeitet.
-
Das ist es garantiert nicht.
-
Update:
headerdatei:class CClass { public: CString m_str; void Func1(); void Func2() { m_str="Test"; //<- Klappt } };
cpp-datei:
void CClass::Func1() { m_str="Test"; //<- Klappt nicht, adresse von m_str hat sich geändert, // deswegen ist m_pchData == NULL -> Absturz. }
Also sobald die Funktion inline ist, klappt es. Jemand ne Idee, warum?
[ Dieser Beitrag wurde am 11.10.2002 um 21:44 Uhr von dEUs editiert. ]
-
ich untersuchs mal.
-
Kannst du das vielleicht in einem kleinen Projekt mal austesten (zum Download), ob der Fehler dann auch auftritt und wir mal daran rumbasteln können. Wahrscheinlich fällt dir der Fehler auf, wenn du es nochmal in einem Basisprogramm ohne irgendwelchen Schickschack ausprobierst. Oder Visual C++ macht bei größeren Programmen einen Compilierfehler.
-
Hallo, also nach der Beschreibung bekomme ich dein Problem nicht reproduziert. würde also Vorschlag von <hoo> empfehlen und das Ganze in einem neuen Project testen, vielleicht übersiehst du da was.
Gruß mathi
-
also ich kann es zu meinen bedauern auch nicht reproduzieren
-
Initialisier den CString mal im Konstruktor mit "".
-
Ich denke mal das wird im Konstruktor von CString selber gemacht.
-
Original erstellt von <Dichter & Denker>:
Ich denke mal das wird im Konstruktor von CString selber gemacht.Dieser Vorschlag ist durchaus ernst gemeint. So ein ähnliches Problem hatte ich nämlich auch schon mal mit dem CString.
-
Probier das ganze auch mal testweise mit std::string. Müsste ja bei so einfachen Sachen fast kompatibel in der Bedienung sein.
-
So habs gelöst. Wollte es für euch reproduzieren. Am Ende hatte ich sowas:
class CClass { public: bool b; CString str; }
Das obige stürzte ab.
class CClass { public: CString str; }
das net.
Das kam mir doch sehr spanisch vor und weils in nem anderen prog so funktioniert und es ja auch keinen grund für nen absturz gibt, hab ich mal den include dieser headerdatei als allererste gesetzt. Und es hat funktioniert. Also lag der Fehler irgendwo in den anderen inkludierten Dateien. Es war dann ein vergessenes #pragma pack(8) nach einem #pragma pack(2)
-
uh, ganz böser fehler
-
Hm, deshalb sollte man auch immer
#pragma pack( push, 2)
#pragm pack( pop) verwenden
-
Naja, dann hätte ich halt das pop vergessen
Aber danke für den Tip.
-
So, jetzt müsst ihr mir nur noch erklären für was
#pragma pack(..) ist....Devil