Variable bekommt nach Methodenaufruf anderen Speicherbereich zugewiesen
-
Hallo zusammen!
Ich habe da ein kleines Problem in meinem Programm. Hier mal der Code. Ist jetzt zwar nur ein kleiner Teil der entsprechenden Funktionen aber ich denke mal das sollte reichen.
void CValueList::checkLevel(int iValue) { for(int i=0; i<m_listNorms.getSize(); i++) { char strValue[64]; SNorm* currentNorm = m_listNorms.getContent(i); [...] checkNorm(currentNorm, itoa(iValue, strValue, 10)); [...] } } void CValueList::checkLevel(double dValue) { for(int i=0; i<m_listNorms.getSize(); i++) { char strValue[64]; SNorm* currentNorm = m_listNorms.getContent(i); [...] checkNorm(currentNorm, _gcvt(dValue, 64, strValue)); [...] } } void CValueList::checkNorm(SNorm* ptrNorm, char* value) { if(ptrNorm->s_dTime > 0) { if(ptrNorm->s_bChecked) { if(ptrNorm->s_dTimeStart + time(NULL) >= ptrNorm->s_dTime) { if(sendMessage(ptrNorm, value)) { ptrNorm->s_lWarningTime = time(NULL); ptrNorm->s_bWarned = true; } } } else { ptrNorm->s_dTimeStart = time(NULL); } } else { if(sendMessage(ptrNorm, value)) { ptrNorm->s_lWarningTime = time(NULL); ptrNorm->s_bWarned = true; } } }Es geht jetzt um die Variable currentNorm. Die bekommt aus der Liste das aktuelle Element zugewiesen. Anschließend wird die Funkrion checkNorm ausgeführt in der einige Abfragen getätigt werden. Die erste Funktion funktioniert auch wunderbar. Allerdings tritt bei der zweiten das Phänomen auf, dass die Variable currentNorm eine andere Adresse nach dem Aufruf der Funktion checkNorm hat als vorher.
Im Prinzip machen die beiden ersten Funktionen fast das selbe. Der Unterschied liegt halt in den Datentypen. SNorm ist eine Struktur die eine Union enthält sodass ich jeden Datentyp in die selbe Variable speichern kann. In mehr unterscheiden sich beide Funktionen nicht.
Durch sorgfältiges Debuggen bin ich zu der Erkenntnis gekommen, dass die Variable ptrNorm in der Methode checkNorm schon einen anderen Speicherbereich beinhaltet als übergeben wird. Und genau dieser Speicherbereich steht nach Ausführen der Funktion anschließend in der Variable currentNorm. Das wie gesagt aber nur bei Aufruf durch die 2. Methode.
Ich hoffe ich konnte mein Problem halbwegs verständlich erläutern. Hätte da jemand eine Idee woran das liegen könnte?Ich bedanke mich im Voraus schonmal für die Hilfe.
Gruß,
Sloenig
-
Wenn du einen Breakpoint beim Aufruf von checkNorm setzt und einen auf die erste Zeile in checkNorm, dann ändert sich die Adresse von currentNorm (bzw. innerhalb der Funktion ptrNorm)? Kann ich mir ehrlich gesagt schwer vorstellen. Wo sollte die neue Adresse herkommen? Du vergleichst nicht zufällig zwei Iterationen deiner for-Schleife?
-
Hab den Fehler nun gefunden. lag an der Funktion _gcvt. Hab dort das Stringendezeichen innerhalb des strings nicht beachtet und so wurde in fremden Speicherbereich rumgefuscht.
-
Sloenig schrieb:
Hab den Fehler nun gefunden. lag an der Funktion _gcvt. Hab dort das Stringendezeichen innerhalb des strings nicht beachtet und so wurde in fremden Speicherbereich rumgefuscht.
Ah ja. Wäre auch komisch gewesen. Sonst hätte ich meine Erfahrungen bzgl. Zeigern nochmal gründlich überdenken müssen...
