Forum: PC-Programmierung CString, 2 Variablen auf der gleichen Adresse ?


von Karlheinz Druschel (Gast)


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

von Karlheinz Druschel (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

Ich tippe mal ganz stark darauf, dass m_pConfig auf kein
gültiges Objekt zeigt.

von Karlheinz Druschel (Gast)


Angehängte Dateien:

Lesenswert?

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

von Karl heinz B. (kbucheg)


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.

von Karlheinz Druschel (Gast)


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 ?

von Karlheinz Druschel (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Merke:
Ein cast ist eine Waffe!

von Karl H. (kbuchegg)


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.

von Karlheinz Druschel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.