mikrocontroller.net

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


Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Karlheinz Druschel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Merke:
Ein cast ist eine Waffe!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okidok, danke für den Hinweis.
Ich denke ja, dass ich noch lernfähig bin ... :-)


Greets
Karlheinz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.