Hi Leuts, folgendes Problem: In meiner Klasse xyz habe ich zwei Variablen vom Typ CString also: public: CString str1; CString str2; Im Programm nun muß ich beim Debuggen feststellen, dass beide Variablen den gleichen Inhalt haben weil auch beide auf der gleichen Adresse im Speicher liegen. Wie kann das sein ????? Greets Karlheinz
Und gleich noch was: m_pConfig->str1 = "12345"; i = m_pConfig->str1.GetLength(); Beim Debuggen kommt raus: m_pConfig->str1 = "12345", das ist ja OK aber i = 0 ??????? Irgendwie spinnen die Strings bei mir, bwz. CString. Woran kann das liegen ? Greets Karlheinz
Ich tippe mal ganz stark darauf, dass m_pConfig auf kein gültiges Objekt zeigt.
Danke für den Tip, kanns aber nicht sein, wie der Debuggerauszug auf dem beigefügten Bild zeigt. Oder täusche ich mich da ? Assert hat auch keinen Fehler gemeldet. Greets Karlheinz
Lässt sich daran nicht ablesen, da man die Adresse von m_Config nicht sieht. Aber: Was iritiert dich daran, dass 2 Strings auf den gleichen Speicher verweisen? Sowas kann schon sein, wenn beide String Variablen den gleichen Inhalt haben und die 2-te durch Zuweisung aus der 1-ten entstanden ist. Bei der Zuweisung wird dann einfach nur der Pointer umkopiert und das Erstellen des Duplikates des Inhalts solange verschoben, bis es unbedingt notwendig ist. Ist ein übliches Verfahren für Reference-Counted Strings.
Naja, was mich stört ist die Tatsache, dass ich keine Zuweisung mache! Ausserdem ist die Angabe 0x00680618 im Debuggerfenster meines Wissens nach die Adresse der Variablen, oder ?
AHHHH, und es ward Licht... Ich haben eine Funktion xyz (char *sss)... aufgerufen. Damit dies mit CString funzt, habe ich die beiden gecastet: xyz(LPSTR)(LPCSTR) str1... Und da werden die CStrings irgendwie versaubeutelt.... Anyway, der größte Fehler sitzt immer vorm (!) PC.... Greets Karlheinz
Du solltest anfangen, const-korrekt zu programmien. Wenn deine Funktion den übergebenen String nicht verändert, dann sollte die Signatur lauten: void xyz( const char* sss ) In so einem Fall kannst du den CString direkt an die Funktion übergeben. CString hat einen Konvertieroperator mit, der eine Konvertierung auf const char* ermöglicht. Es ist dann kein cast notwendig, so wie es sein sollte. Verändert aber die Funktion den übergebenen String, dann lautet die Signatur: void xyz( char* sss ) In diesem Fall solltest du den CString nicht zurechtcasten, dafür wurde er nicht vorgereitet. In dem Fall brauchst du CString::GetBuffer. Diese Funktion liefert dir einen entsprechenden Pointer über den du auch schreibend auf den CString zugreifen kannst. Es ist ebenfalls kein cast notwendig. Summa-summarum: Es gibt in der MFC Programmierung Fälle in denen man um einen cast nicht herum kommt. Das ist meist der Fall wenn man in irgendwelchen Controls irgendwelche Daten im ItemData ablegt und wieder zurückholt. Da gehts nicht anders und da muss man casten. Aber ansonsten solltest du praktisch jeden cast als 'Ruhigstellen des Compilers im Fehlerfall' ansehen und nach Möglichkeiten suchen, sodass kein cast notwendig ist.
Okidok, danke für den Hinweis. Ich denke ja, dass ich noch lernfähig bin ... :-) Greets Karlheinz
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.