Vedek Bareil
2005-06-02, 16:12:03
Hi Leute,
letztens hatte ich, bzw. ein Kollege von mir, folgendes Problem.
Ich hatte einen Code verfaßt, mit dem in einem String stehende Hex-Zahlen in integers (bzw. unsigned chars, also 8-bit integers) konvertiert werden sollten, wobei von der Funktion sscanf Gebrauch gemacht wurde:
// Array zum aufnehmen der (hier 4) 8-bit integers
unsigned char ucByte[4];
// durchparsen des Strings mit den Hex-Zahlen
sscanf(sHexString, "0x%x 0x%x 0x%x 0x%x", &ucByte[0], &ucByte[1], &ucByte[2], &ucByte[3]);
sHexString ist ein String aus vier Hex-Zahlen, z.B. "0xa1 0x34 0x3c 0xfe", die in den vier Elementen des Arrays ucByte (als integer-Werte) gespeichert werden sollten, also ucByte[0] = 0xa1 = 161 usw.
Unter VC++ 6 lief das auch ganz gut, aber dann versuchte mein Kollege, das Programm, in dem dieser Code enthalten war, nach .NET zu portieren. Und da funktionierte es dann nicht mehr. Beim Verlassen der Funktion, in der der Code verwendet wurde, gab es immer eine Fehlermelung, irgendwas mit "Variable 'ucByte' korrupt" oder so. Ein Herumexperimentieren mit z.B. dynamischem Anlegen des Arrays ucByte oder unter Verwendung der std::vector-Klasse führte schließlich darauf, daß beim Löschen des Arrays irgendetwas schiefging.
Mein Kollege war schließlich der Ansicht, die Funktion sscanf sei die Quelle des Übels. Testweise haben wir das sscanf dann mal aus dem Code entfernt und die Konvertierung mittels einer selbstgeschriebenen (allerdings recht aufwändigen) Funktion vorgenommen. Und in der Tat war die Fehlermeldung dann verschwunden.
So absolut absurd und unlogisch das auch sein mag - man muß sich das mal vor Augen halten: weil die Elemente des Arrays ucByte ihre Werte mittels sscanf zugewiesen bekommen, funktioniert später das Löschen des Arrays nicht mehr richtig! "Die Logik ist ein kleiner zwitschernder Vogel der in der Wiese zirpt" fällt mir dazu nur ein :conf2: - es hat offenbar tatsächlich an sscanf gelegen.
Wie gesagt haben wir zur Konvertierung dann eine selbstgeschriebene Funktion verwendet. Diese ist aber nicht besonders komfortabel. Gibt es in C++ nicht irgendeine andere Funktion, die man statt sscanf benutzen kann? Vielleicht irgendwas mit stringstreams?
letztens hatte ich, bzw. ein Kollege von mir, folgendes Problem.
Ich hatte einen Code verfaßt, mit dem in einem String stehende Hex-Zahlen in integers (bzw. unsigned chars, also 8-bit integers) konvertiert werden sollten, wobei von der Funktion sscanf Gebrauch gemacht wurde:
// Array zum aufnehmen der (hier 4) 8-bit integers
unsigned char ucByte[4];
// durchparsen des Strings mit den Hex-Zahlen
sscanf(sHexString, "0x%x 0x%x 0x%x 0x%x", &ucByte[0], &ucByte[1], &ucByte[2], &ucByte[3]);
sHexString ist ein String aus vier Hex-Zahlen, z.B. "0xa1 0x34 0x3c 0xfe", die in den vier Elementen des Arrays ucByte (als integer-Werte) gespeichert werden sollten, also ucByte[0] = 0xa1 = 161 usw.
Unter VC++ 6 lief das auch ganz gut, aber dann versuchte mein Kollege, das Programm, in dem dieser Code enthalten war, nach .NET zu portieren. Und da funktionierte es dann nicht mehr. Beim Verlassen der Funktion, in der der Code verwendet wurde, gab es immer eine Fehlermelung, irgendwas mit "Variable 'ucByte' korrupt" oder so. Ein Herumexperimentieren mit z.B. dynamischem Anlegen des Arrays ucByte oder unter Verwendung der std::vector-Klasse führte schließlich darauf, daß beim Löschen des Arrays irgendetwas schiefging.
Mein Kollege war schließlich der Ansicht, die Funktion sscanf sei die Quelle des Übels. Testweise haben wir das sscanf dann mal aus dem Code entfernt und die Konvertierung mittels einer selbstgeschriebenen (allerdings recht aufwändigen) Funktion vorgenommen. Und in der Tat war die Fehlermeldung dann verschwunden.
So absolut absurd und unlogisch das auch sein mag - man muß sich das mal vor Augen halten: weil die Elemente des Arrays ucByte ihre Werte mittels sscanf zugewiesen bekommen, funktioniert später das Löschen des Arrays nicht mehr richtig! "Die Logik ist ein kleiner zwitschernder Vogel der in der Wiese zirpt" fällt mir dazu nur ein :conf2: - es hat offenbar tatsächlich an sscanf gelegen.
Wie gesagt haben wir zur Konvertierung dann eine selbstgeschriebene Funktion verwendet. Diese ist aber nicht besonders komfortabel. Gibt es in C++ nicht irgendeine andere Funktion, die man statt sscanf benutzen kann? Vielleicht irgendwas mit stringstreams?