unsigned char
-
Hallo,
ich möchte einByte übertragen. In diesem steht eine 204d (0xCC). Diese wird aber umgewandelt in 0xFFFFFFCC). Das Problem habe sich schon mal hier beschreiben:
[url] Char positiv/negativ ?! [/url]
Nun hab eich aber folgendes in der Hilfe gefunden:
onstanten, die aus einem einzigen Zeichen bestehen (beispielsweise `A`,
und `07`), werden als int dargestellt. In diesem Fall gilt das niederwertige Bit als vorzeichenbehaftet, das heißt, wenn der Wert größer ist als 127 (Basis 10), wird das höherwertige Bit auf -1 (hexadezimal: 0xFF) gesetzt. Diese Automatik kann ausgeschaltet werden, indem man als standardmäßigen char-Typ unsigned char wählt.
Die drei Zeichentypen char, signed char und unsigned char erfordern einen 8-Bit-Speicher (ein Byte). Per Voreinstellung behandelt C++Builder Zeichendeklarationen als mit Vorzeichen behaftet. Mit der Compiler-Option -K können Sie Zeichendeklarationen wie ohne Vorzeichen behandeln. Das Verhalten von C-Programmen bleibt durch die Unterscheidung zwischen diesen drei Zeichentypen unberührt.
Demnach ist die Umwandlung zu 0xFFFFFFCC richtig. Nun habe ich aber bei den Compileroptionen nachgesehen und da steht schon "-K". Also sollte unsigned char voreingestellt sein und das Zeichen nicht vorzeichenbehaftet sein. Wie kann das sein?
Ich möchte also ein Zeichen übertragen (0xCC). Wie bekomme ich aus dem char 0xFFFFFFCC wieder eine 204??? Danke schon mal.
Grüße
Franky
-
überträgst du per Deutsche Post oder per Fax?
Wie wäre es wenn du mal deinen Post so schreibst das jeder nachvollziehen kann was genau Schritt für Schritt passiert....
WOMIT sendest du, TCP/IP, seriele Schnittstelle, USB.. WIE sendest du(welche Funktion, optimalerweise Quellcode) usw...Man liest nur "irgendwie wird ein char über irgendwas gesendet und nachher ist er was andres, warum?"
-
sorry, wenn ich mich etwas unglücklich ausgedrückt habe. Senden tue ich über die serielle Schnittstelle.
Das problem tritt bei Werten zwischen 128 und 255 auf. Zurückzuführen ist dies auf die Umwandlung in vorzeichenbehaftete Werte.
Ich sende also ein char-Array, in dem an einer beliebigen Stelle der Wert 204d (Beispiel) steht, über die ser. Schnittstelle (RS232). Wenn ich die Senderoutine an der Stelle anhalte, an der der Puffer gesendet wird, und mir die Werte genauer betrachte (untersuche), komme ich zu folgendem Ergebnis:
204d sollte 0xCCh sein - es steht dort aber 0xFFFFFFCC, wegen der Vorzeichengeschichte (s. mein Zitat aus der Borland Hilfe).
In meinem Empfangspuffer steht dann natürlich auch 204d (0xFFFFFFCC). Und wenn ich diesen Wert für weitere Berechnungen nutzen will, bekomme ich -52d. Das ist mien Problem, ich will aber die 204.
In der Hilfe steht auch, dass man diese Vorzeichengeschichte auch ausstellen kann, nämlich mit -K in den Compiler-Optionen (.bpl). Nur da steht schon -K. Von daher gehe ich davon aus, daß aus der 204d 0xCC gemacht werde sollte, und nicht 0xFFFFFFCC.
Ich hoffe, ich habe mich diesmal besser ausgedrückt.
Grüße
Franky
-
Ich hatte das auch 'mal.
Bei mir hilft ein sauberer TypeCast
- Du laest in längeren Typ wandeln, da hat der Compiler Problem mit Vorzeichen beim automatischen TypeCast.
Musste sauber sagen was er machen soll
-
Danke schon mal,
also TypeCast heißt Typumwandlung. Und was soll ich wie umwandeln? Ich habe in der in der Hilfe nur etwas mit Zeigerdeklariationen gefunden. Bitte um mehr Infos. Danke.
Grüße
Franky
-
Das machste ungefaehr so:
...neuerTyp(Datenfeld) ...
oder
... (neuerTyp)Datenfeld ...als neuerTyp mus exakt stehen, was der Befehl, den Du rufst an der Stelle will!!
Das musste aus Hilfe zu dem Befehl holen
Datenfeld ist das, was Du uebergeben willst, Variable, Konstante oder Wert
-
Anstelle der C-Casts empfehle ich aber immer wieder wärmstens die _cast s von C++.
-junix
-
Verstehe ich das jetzt richtig?
unsigned char ReceiveBuff[10]; ... Receive(); ... int x= int(ReceiveBuf[5]);
Ich glaube, das habe ich schon probiert. Müsste es aber nochmal testen. Sollte ich besser gleich unsigned int benutzen?
Grüße
Franky
-
-
So in etwa.
Aber warum nicht
unsigned int x .....;???
sollte aber auch geh'n?
-
DIese unübersichtlichen und gefährlichen Klammer-Aktionen sind C-Style-Casts... C++ hat aus Gründen der Übersichtlichkeit, der Sicherheit und der Dokumentation neu die Schlüsselwörter
static_cast dynamic_cast const_cast reinterpret_cast
eingeführt.
-junix
-
Alles klar, Fehler gefunden!
Der Punkt, an dem dem der Fehler produziert wurde lag ja in meiner DLL. Diese war aber mit der falschen Host-Anwendung verbunden.
Ich hatte nämlich in meiner richtigen Host-Anwendung alle char- Arrays in unsigned char- Arrays verändert und konnte mir daher diesen Fehler nicht erklären.
Da aber die DLL mit der alten Anwendung mit dem char-Arrays zusammengearbeitet hat, wurden hier vorzeichenbehafteten Werte genutzt.
Also bleibt festzuhalten: char -128 ... 127
unsigned char 0 ... 255Schade, dass dies nicht so ganz mit der Borland Hilfe überein stimmt. Da wird ja gesagt, daß mit der Compiler-Option -K der Ausdruck char auf unsigned char voreingestellt wird. Das hätte mir einiges erspart.
Trotzdem vielen Danke an alle. Es ist wirklich toll, wie einem hier geholfen wird, auch wenn man sich nicht gleich verständlich ausdrückt.
...und das nächste Problem kommt bestimmt.
Grüße
Franky
-
Original erstellt von Franky:
Also bleibt festzuhalten: char -128 ... 127
unsigned char 0 ... 255Wobei dies so auch in der Borland Hilfe in der Datentypen-Dokumentation steht (-;
-junix
-
Na ja, ich habe z.B. in der Hilfe dies gefunden:
Beispiele
unsigned int i; unsigned i; /* Gleichwertig mit "unsigned int i;" */ unsigned long int l; /* "int" ist erlaubt, aber nicht erforderlich */ unsigned char ch; /* Voreinstellung für char ist unsigned */
Wobei vor allem die letzte Zeile interessant ist. Findet man unter unsigned -> Beipiele. Oder dies:
Vorzeichenlose Zeichen
Kommandozeilen-Äquivalent = -K)Ist die Option vorzeichenlose Zeichen eingeschaltet, behandelt der Compiler alle char-Deklarationen, als seien sie vom Typ unsigned char, wodurch die Kompatibilität mit anderen Compilern gewährleistet wird.
Standard= AUS (char-Deklarationen als signed; -K-)
Und enn ich mir die Compiler-Optionen in meinen .bpl Dateien mit einem Editor ansehen, finde ich:
<OPTIONS> <IDLCFLAGS value="-I..\. -ISleepTest -I$(BCB)\projects\mmtimer -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG -boa"/> <CFLAG1 value="-Od -H=$(BCB)\lib\vcl60.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -c -tW -tWM"/> <PFLAGS value="-$YD -$W -$O- -$A8 -v -JPHNE -M"/> <RFLAGS value=""/> <AFLAGS value="/mx /w2 /zd"/> <LFLAGS value="-D"" -aa -Tpe -x -Gn -v"/> <OTHERFILES value=""/> </OPTIONS>
Also so ganz eindeutig ist die Hilfe auf jeden Fall nicht, oder verstehe ich das alles falsch???
Grüße
Franky