CString, 2 Variablen auf der gleichen Adresse ?

Gast #417638
Lesenswert?

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
Gast #417639
Lesenswert?

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
#417642
Lesenswert?

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.
Gast #417643
Lesenswert?

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 ?
Gast #417644
Lesenswert?

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
#417646
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren