Datentyp uint8_t

Gast #987073
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.
Gast #987080
>> 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.
Persönliche Seite #987088
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)
Gast #987092
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
Gast #987104
>>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?
Persönliche Seite #987132
> 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.
Gast #987151
>> 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.
Gast #987251
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();
Gast #987800
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
Persönliche Seite #987809
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 ;)
Gast #987832
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.
Gast #987857
> 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.
Persönliche Seite #987941
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.