"itoa" verrückter Wert?
-
Dann hast du noch einen char Überlauf.
char hat(wenn man es nicht anders im Compiler einstellt) den Zahlenbereich von
-128 bis 127 ... 150 ist da dann etwas viel.*edit* ok genaugenommen nicht 0-127
[ Dieser Beitrag wurde am 01.07.2003 um 13:21 Uhr von dreaddy editiert. ]
-
char: -127 bis 128
unsigned char 0 - 255?!
Die vielen Zeichen davor kommen vom - .
Versuch mal
unsigned char * Buffer = new unsigned char[8];
[ Dieser Beitrag wurde am 01.07.2003 um 12:48 Uhr von Knuddlbaer editiert. ]
-
Kein BCB-Problem. Verschoben nach "C++".
-
Wenn ich das ganze mit "unsigned char" erstelle, dann wird gar nichts mehr aus der Datei eingelesen. Mein vollständiger Code an dieser Stelle sieht folgendermaßen aus:
// Beim drücken des Buttons werden x Byte aus einer Datei gelesen // und die Funktion getSize() aufgerufen void __fastcall TForm1::Button2Click(TObject *Sender) { if (Edit3->Text != "") { int iTemp = StrToInt(Edit3->Text); unsigned char* pchTemp = new unsigned char(iTemp); ifstream datei; datei.open("C:\\test.txt",ios::binary); char Buffer; for (int i = 0; i < iTemp; i++) datei.get(pchTemp[i]); // hier passiert bei unsigned nichts!!! // Bei signed wird normal eingelesen!!! datei.close(); int Value = getSize(pchTemp,iTemp); Edit2->Text = IntToStr(Value); } }
So, wenn ich das ganze also mit unsigned mache, dann liest er gar keine Zeichen aus der Datei ein. Nur mit dem normalen char... woran kann das liegen?
Mipe
-
Den Prototypen von itoa kennst du oder?
[cpp]char *itoa(int value, char *string, int radix);[/cpp]
Die wichtigen Stellen hab ich mal fett markiert...
-junix
<edit>Ok, das mit dem Fett ging in die Hose, aber schau dir mal an wie value deklariert ist. Wenn ein signed wert erwartet wird, erfolgt bei unsigned werten immer ein impliziter cast nach signed (soviel ich weiss)... klingelts?</edit>
[ Dieser Beitrag wurde am 01.07.2003 um 14:10 Uhr von junix editiert. ]
-
sieht man aber nix von :p :p :p
-
Value[i] nach unsigned char zu casten sollte es tun.
-
Value[] ist ein Char-Array
itoa wandelt keine Zeichen, sondern int's um. Dh aus deiner 150 (als char -106 wegen -128..127 Wertebereich) wird ein int -106. Und das hat binär nunmal soviele Stellen.
btw:Das mit Buffer spielt keine Rolle
Tut es schon, wenn du keinen Buffer Overflow haben willst.
-
Hey, mit
itoa((unsigned char)Value[i],Buffer,2);
haut's wunderbar hin. Danke.
Mipe
PS. Natürlich spielt der Buffer mit Größe 8 eine Rolle, jedoch nicht für das Problem des Chars meinte ich
-
Ich glaube es weiss nicht jeder, woher der "Fehler" den nun
eigentlich herkommt, deshalb noch eine kurze Erläuterung:itoa erwartet ein int als Parameter, bekommt aber ein char.
Der Kompiler "denkt": char < int also alles okay.
Bei positiven Werten ist dann auch alles okay; bei negativen Werten
werden die 24 zusätzlichen Bits aber mit 1en aufgefüllt (2er Komplement).itoa arbeitet also völlig korrekt.
Jockel