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.
>> 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.
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
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
>>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?
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
> 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.
>> 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
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
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 ;)
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.
> 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.
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.
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.