Es ist mir ein Rätsel! oder Unterschiedliches Ergebnis zwischen Debug- und Release-Modus
-
Hallo allerseits,
ich quäle mich schon einige Zeit mit einem Problem herum. Die unten aufgeführt Funktion soll mir ein bestimmtes Element einer char-Zeile als String zurückgeben. Die Zählung beginnt bei 1. Will ich also das 5.Element der Zeile
"3489776.270 5985448.680 1.920 52.000 1700"
haben, so sollte die korrekte Lösung "1700" sein. Im Debug-Modus funktioniert das auch prächtig. Im Release-modus bekomme ich ein leeres String zurück. Ich habe dann zum Spaß das 4. Element ausgelesen. Im Debug-Modus erhalte ich "52.000" im Release-Modus "1700". Nochmal! Ich ändere den Code nicht sondern schalte nur zwischen Debug und Release-Modus und erhalte ein anderes Ergebnis. Wo liegt mein Fehler? Ich programmiere und Visual C++ Net 2003 Version 7.1.6030. Vielen Dank für Eure Hilfe!
int AB_important_Tools::Get_Element_string_from_char_Line(char *Line, string &Element, unsigned int Pos_Element) { /*************************************************************************************************** * Bestimmung eines Elementes (char-Array) mit vorgegebener Position in einem string * (erste Position = 1) * * Rückgabewerte: * 0 alles i.O. * 1 Ungültige Position ****************************************************************************************************/ int numberOfElements = 0, m = 0, k = 0, count = 0, ElementXPos = -1, j=0; char ElementX[50]; bool element; //Bestimmung der Anzahl der Elemente numberOfElements = Get_Number_of_Elements(Line); //Nullsetzen aller Elemente for (unsigned int Counter = 0; Counter < 50; Counter++) { ElementX[Counter] = 0; } // Hier wird geprüft, ob eine gültige Position abgefragt wird if ((unsigned int)numberOfElements<Pos_Element) return 1; /**************************************************************** * Bestimmung der einzelnen Zahlen des Elementes *****************************************************************/ while(k<(int)strlen(Line)) { m = (int)Line[k]; if((m == 9) || (m == 32)) { element = false; } else { if(!element) { element = true; count++; } } if(count == Pos_Element && (m!=9) && (m!=32)) { if((m!=46 && m<48) || (m!=46 && m>57)) { return 2; } ElementXPos++; ElementX[ElementXPos] = Line[k]; } k++; } Element = ElementX; return 0; }
-
Ohne mir jetzt grade die Details anzuschauen:
a) was hat das mit "C++/CLI mit .NET" zu tun?
b) Kannst du mir mal sagen wo du die Variable "element" vor der ersten Verwendung
initialisierst (Im Degugmodus wird diese in der Regel vom Compiler vorbelegt,
in der Releaseversion ist diese undefiniert - sprich was grad in der
Speicherstelle steht).cu André
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
asc Adlerauge, hm? (ich hätte das jetzt nicht gesehen
)
Ja, tut er garnicht, und genau das ist das Problem.@Redone:
Du musst element mit "true" initialisieren.
Und du solltest vor der while Schleife noch alle Spaces und Tabs überspringen, sonst wird von der Funktion eine Reihe Spaces/Tabs als Element gezählt.Im Übrigen kannst du wenn du schon mit nullterminierten Strings arbeitest das Abbruchkriterium für die Schleife ändern:
//while(k<(int)strlen(Line)) // wird zu while(Line[k])
-
Nebenbei, sowas:
while(k<(int)strlen(Line))ist sträflich... (gleiches gilt für Abbruchbedingung in einer for-schleife)
Die Abbruchbedingung wir bei jedem Schleifendurchlauf neu berrechnet, wenn Du also z.B. einen String von 1000 Zeichen parsed, berrechnest Du hier 1000 mal strlen.
Sowas kann der Compiler auch nicht wegoptimieren, weil Line nicht const ist und daher die strlen ja bei jedem Schleifendurchlauf anders sein könnte...
-
hustbaer schrieb:
asc Adlerauge, hm? (ich hätte das jetzt nicht gesehen

Nein, weniger Adlerauge als die eigene Erfahrungen aus Hobby und Beruf :p
cu André