Forum: Compiler & IDEs Datentyp uint8_t


von Frank (Gast)


Lesenswert?

Hallo,
es geht um den Datentyp uint8_t;
uint8_t:bedeudet einen 8-Bit Integer ohne Vorzeichen.Die Werte von 0 bis 
255.
dh uint8_t message[4]:wäre dann 4 mal 8-Bit Integer ohne Vorzeichen.

warum uint8_t message[0]=0XFFF; zeigt mir keinen Fehler.

Eine kleine Erklärung wird mir helfen.
ich danke euch.

von Gast (Gast)


Lesenswert?

>> warum uint8_t message[0]=0XFFF; zeigt mir keinen Fehler.

Weiss zwar nicht genau auf was du hinauswillst, aber 0xFFF (4095) ist 
definitiv zu gross für einen Bytewert.

von Frank (Gast)


Lesenswert?

Hallo,
das ist genau mein Problem ich erwarte dass der Compiler einen Fehler 
signalisiert, und es ist nicht der Fall.

von Simon K. (simon) Benutzerseite


Lesenswert?

Frank wrote:
> warum uint8_t message[0]=0XFFF; zeigt mir keinen Fehler.

Klar zeigt das einen Fehler, weils nichtmal C-Standardkonform ist.
Bitte schreibe doch ein kleines Testprogramm, was wir alle schnell 
ausprobieren können. Außerdem solltest du deine Kompilierparameter mit 
angeben.

Zu deinem Problem
1
#include <stdint.h>
2
3
int main()
4
{
5
  uint8_t message[4];
6
  message[0] = 0XFFF;
7
8
  return 0;
9
}

Ergibt bei mir:
1
avr-gcc -Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega3250 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
2
../main.c: In function 'main':
3
../main.c:133: warning: large integer implicitly truncated to unsigned type
4
Finished building: ../main.c

mit dem AVR-GCC v 4.3.0 (WinAVR 20080512)

von Frank (Gast)


Lesenswert?

es wird immer die 0XFF in message[0]schreiben.
Wenn ich schreibe:
if(message[0] <= 255){
X=a+b;
}
dann habe ich die warnung: comparison is always true due to limited 
range of data type

von Gast (Gast)


Lesenswert?

>>Wenn ich schreibe:
>>if(message[0] <= 255){
>>X=a+b;
>>}
>>dann habe ich die warnung: comparison is always true due to limited
>>range of data type
Ein uint8_t-Datentyp kann nur Werte von 0 - 255 annehmen. Daher ist die 
o.a. Bedingung immer true und die Warnung berechtigt.
Nochmal: Welche Probleme hast du und auf was willst du hinaus?

von Frank (Gast)


Lesenswert?

was soll ich machen, damit die Bedingung nicht erfüllt ist?

von Michael A. (micha54)


Lesenswert?

Hallo,

wie sind denn Deine warning options gesetzt ? -w ?

Manche der im Netz angebotenen Programme lassen sich nur damit 
übersetzen oder man ist so pingelig wie ich und fügt alle sinnvollen 
type-casts ein.

Gruss,
Michael

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> was soll ich machen, damit die Bedingung nicht erfüllt ist?

Banale Antwort:
Setz statt der 255 eine kleinere Zahl ein oder ändere den Datentyp von 
message auf einen grosseren Datentyp.

Ansonsten:
Das hängt von deinem Problem ab. Beschreib doch mal in einfachen Worten, 
was du machen willst.

von Gast (Gast)


Lesenswert?

>> was soll ich machen, damit die Bedingung nicht erfüllt ist?
Ich glaube so langsam meine ich dich zu verstehen. Du hast ein Problem 
mit den Zahlenbereichen, sonst würdest du
1. Nicht 0xFFF an message[0] zuweisen.
2. In der if-Bedingung auf Werte <= 255 testen.

Nochmal die Zahlenbereiche:
uint8_t = 0 .. 255 (0xFF)
uint16_t = 0 .. 65535 (0xFFFF).
uint32_t = 0 .. 4294967295 (0xFFFFFFFF)

Ich glaube mit Änderung der Deklaration nach
1
uint16_t message[4];
bist du besser dran. Glaubsch du mir.

von Frank (Gast)


Lesenswert?

habe ich folgende Veränderungen gemacht aber ohne gutes Ergebnis
uint16_t message[4];

if(((message[0]) <= 255) && ((message[1]) <= 255) &&
         ((message[2]) <= 255) &&  ((message[3]) <= 255)

)

functionX();

else

Error();

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vielleicht solltest Du weiter vorne anfangen ... und erstmal beschreiben 
was Du überhaupt erreichen willst.

von Frank (Gast)


Lesenswert?

hallo,
zuerst möchte ich mich entschuldigen als Ausländer es ist nicht einfach 
mich
klar auszudrücken.
Ich fange jetzt vorne an. Ich bekomme einen String,ich zerlege den 
String und ich muss jedes Teil mit einem Bereich vergleichen. Falls der 
Bereich stimmt, soll ich das Teil bearbeiten und wenn nicht soll ich der 
Fehler signalisiert.
ZB Der String besteht aus:"Name ID Länge Message"
Name kann COMD oder RESQ sein
ID soll 0 -4294967295
Länge soll zwischen 0-8 sein
Message soll 0-255 sein
ich habe schon den String zerlegt und jedes Teil in einem zwei 
dimensionalen Array zugewiesen.
Ich hoffe, dass ich mein Problem jetzt klar formuliert.

Danke

von Simon K. (simon) Benutzerseite


Lesenswert?

Frank wrote:
> hallo,
> zuerst möchte ich mich entschuldigen als Ausländer es ist nicht einfach
> mich
> klar auszudrücken.
> Ich fange jetzt vorne an. Ich bekomme einen String,ich zerlege den
> String und ich muss jedes Teil mit einem Bereich vergleichen. Falls der
> Bereich stimmt, soll ich das Teil bearbeiten und wenn nicht soll ich der
> Fehler signalisiert.
> ZB Der String besteht aus:"Name ID Länge Message"
> Name kann COMD oder RESQ sein
> ID soll 0 -4294967295
> Länge soll zwischen 0-8 sein
> Message soll 0-255 sein
> ich habe schon den String zerlegt und jedes Teil in einem zwei
> dimensionalen Array zugewiesen.
> Ich hoffe, dass ich mein Problem jetzt klar formuliert.

Aaaah, ich glaube ich weiß wo es hakt. Wenn du mit "String" tatsächlich 
einen String aus Zeichen (chars) meinst, dann musst du die Variable mit 
viel mehr als 4 Zeichen auslegen. Des weiteren musst du den String an 
den Grenzen aufteilen und als Nächstes in Zahlen umwandeln (Zumindest an 
den Stellen, wo du Zahlen erwartest).
Und dann erst, hast du die ID, Länge und Message so umgewandelt, dass du 
sie als Zahl behandeln kannst im Compiler.
Du brauchst also einen kleinen Parser. Funktionen hierfür sind u.a. 
strtok, strtoul (zum umwandeln von 32bit unsigned werten) und ein paar 
schleifen ;)

von Frank (Gast)


Lesenswert?

habe ich schon alles gemacht.
mit strtok habe ich den String zerlegt indem ich das Leerzeichen jedes 
mal sucht.
mit strtoul habe ich das Char in Hexadezimal umgewandelt.

von Norgan (Gast)


Lesenswert?

> mit strtoul habe ich das Char in Hexadezimal umgewandelt.

strtoul() wandelt nicht nach Hex. Es wandelt in die interne binäre 
Darstellung des Compilers / der Plattform.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Frank wrote:
> hallo,
> zuerst möchte ich mich entschuldigen als Ausländer es ist nicht einfach
> mich
> klar auszudrücken.
> Ich fange jetzt vorne an. Ich bekomme einen String,ich zerlege den
> String und ich muss jedes Teil mit einem Bereich vergleichen. Falls der
> Bereich stimmt, soll ich das Teil bearbeiten und wenn nicht soll ich der
> Fehler signalisiert.
> ZB Der String besteht aus:"Name ID Länge Message"
> Name kann COMD oder RESQ sein
> ID soll 0 -4294967295
> Länge soll zwischen 0-8 sein
> Message soll 0-255 sein
> ich habe schon den String zerlegt und jedes Teil in einem zwei
> dimensionalen Array zugewiesen.
> Ich hoffe, dass ich mein Problem jetzt klar formuliert.
>
> Danke

Klar formuliert ist anders. Wo das zweidimensionale Array ins Spiel 
kommt ist mir schleierhaft.

Angenommen eine korrekte Eingabe sieht so aus "COMD 4294967295 8 255" 
und eine im Message-Bereich ungültige sieht so aus "COMD 4294967295 8 
256" ...

Dann kannst du nicht nach dem Parsen (Auftrennen) in Name ID Länge 
Message) erst entscheiden, ob ein Fehler vorliegt, wenn du schon in 
uint8_t message[] gespeichert hast.

uint8_t message[] kann immer nur die Werte 0-255 enthalten und die 
illegale 256 würde nach dem Overflow des Zahlenbereihs als als 1 darin 
gespeichert, d.h. als grundsätzlich korrekter Wert.

Ich würde also auf korrekte Werte beim Parsen prüfen.

Das kannst man so machen, dass ein per strtok() extrahierter Teilstring 
zunächst zu einem temporären uint32_t Wert gewandelt wird, der temporäre 
Wert dann mit dem Maximalwert des zulässigen Wertebereichs verglichen 
wird und dann erst in dem eigentlichen Array gespeichert wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.