PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C : Merkwürdige Fehler beim Umwandeln unsigned int => char



DanDanger
18-04-2003, 17:20
Hallo,

mir ist beim Ausführen des folgendem C-Code's was seltsames aufgefallen:



char c = 64 ;
printf("Char : %c \n", c ) ;


Hier soll ein (unsigned) integer-Wert in seinen ASCII-Wert umgewandelt werden.
Das Problem ist nur : Es kommen (nur bei bestimmten Zahlen(!) ) die falschen ASCII-Werte heraus ???!???

Ein Beispiel : Bei Zahlen wie 2, 4, 16, 64, ... Stimmen die ASCII-Werte mit der ASCII-Tabelle überein.
Bei Zahlen wie 8, 200, 205, ... Kommen jedoch ganz andere Werte heraus.

Bei c = 214 Kriege ich z.B. Das < " >Zeichen zurück, dass laut ASCII-Tabelle aber den Dezimal-Wert 34 hat ??? :confused:

Meine Frage : WAS LÄUFT DA FALSCH ????
Warum klappt das mit manchen Werten, und mit anderen wiederum nicht ???

Ich kompiliere übrigends mit " gcc -g -Wall -o Test Test.c"
Beim Kompilieren gibt's weder Warnungen noch Fehler.

Ich hab's übrigends auf mehreren Rechnern und mit versch. gcc und cc Versionen ausprobiert : Immer dasselbe Ergebniss :mad:

Neugierige Grüsse
DanDanger

anda_skoa
19-04-2003, 11:35
char ist für ASCII Zeichen.
Der ASCII Code hat nur 127 Zeichen.
char ist signe, das oberste Bit ist also ein Vorzeichen Bit.

Wenn du Zeichen aus dem erweiterten ASCII Code brauchst, probier es mal mit uchar bzw. unsigned char als Datentyp.

Ciao,
_

DanDanger
19-04-2003, 14:20
Hmm,

das Problem ist, das auch die ASCII-Zeichen für die Zahl 8 nicht stimmen.
Wie "zwinge" ich den den Compiler dazu, den erweiterten ASCII-Satz (also mit 255 Zeichen) zu benutzen ??

Wenn ich bei meinem Linux-System mit dem Programm "ascii" den ASCII-Zeichensatz auflisten lasse, so sind die ersten Zeichen (0 - 12) mit Steuerzeichen belegt :confused:


BTW : Weiss jemand, wie ich mit den curses-Blibliothken Zahlen ausgeben kann mvaddstr(xKoord, yKoord, "%i" , intWert) ; refresh() ; Klappt leider nicht :mad:

Neugierige Grüsse
DanDanger

arthur
19-04-2003, 14:33
vielleicht stimmt etwas nicht mit deiner referenz-tabelle
schau mal da:
http://www.asciitable.com/
und die steuerzeichen sind doch immer da ?
gruss
Arthur

DanDanger
19-04-2003, 16:51
Genau da liegt das Problem :

Laut ASCII-Tabelle soll der Wert 205 das '= - Zeichen sein.
In meinem Code :



#define BALKEN_HORIZONTAL 205
mvaddch(1, i_horizontal + HEADER_START + 1, BALKEN_HORIZONTAL) ;


wird daraus jedoch ein I mit Aphostroph, das eigentlich den ASCII-Wert 161 hat.

Kann es sein, dass die Curses-Lib's eine andere Referenz-Tabelle benutzen ?? :confused:

arthur
19-04-2003, 17:38
wirklich gleich sind immer nur die ersten 128 zeichen,
alles darüber kann unterschiedlich sein.
was du testweise machen kannst ist zb. mc (midnight commader)
oder ein anderes (n)curses program starten und gucken ob es
dort auch zu falschen darstellung kommt, wenn ja
dann musst du was an der konfiguration rumschrauben.
(hatte ähnliches problem auch unter windows)

gruss
Arthur

DanDanger
19-04-2003, 20:18
Hi,

kompiler mal folgenden Code :



#include <stdio.h>

void main()
{
unsigned char c = 8 ;
printf("Char : %c \n", c ) ;
}


Laut meiner ASCII-Tabelle vom alten DOS QBasic soll da ein "Quadrat mit Punkt" erscheinen.

Nun ist es so :
Bei c = 1, 2, 3, ...7 und von 9 bis (...) Stimmt die Ausgabe der o.g Funktion mit der QBasic-Tabelle überein. Nur bei 8(!), 128 und ein paar anderen Werten stimmt's eben nicht.
Der Midnight-Commander wird übrigends Korrekt dargestellt....:confused:

Neugierige Grüsse
DanDanger

arthur
19-04-2003, 21:21
die ersten 32 zeichen sind steuerzeichen und 008 ist backspace:



unsigned char c = 8 ;
printf("Char : blabla%c \n", c ) ;

lass es laufen und du wirst sehen dass das zweite a von blabla fehlt.
qbasic wird vermutlich das ding maskieren damit du überhaupt was siehst.
genauso wie es zb. biew (ein hexeditor) macht, der zeigte mir auch bei
backspaces das quadrat mit dem punkt.
noch ein tip, wenn du dir alle zeichen lesbar anschauen möchtest
dann setzt immer ein escape davor:


unsigned char c = 8 ;
printf("Char : %c%c \n", 27, c ) ;


gruss
Arthur

anda_skoa
20-04-2003, 10:47
Original geschrieben von DanDanger
BTW : Weiss jemand, wie ich mit den curses-Blibliothken Zahlen ausgeben kann mvaddstr(xKoord, yKoord, "%i" , intWert) ; refresh() ; Klappt leider nicht :mad:


Bist du dir sicher, dass es diese Funktion gibt?

Nach dem Namen zu urteilen gibt die Strings aus.

Wenn das so ist, dann kannst du zuerst die Zahl mit snprintf in einen String schreiben und diesen dann ausgeben lassen.

Ciao,
_