mikrocontroller.net

Forum: Compiler & IDEs Datentyp uint8_t


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdint.h>

int main()
{
  uint8_t message[4];
  message[0] = 0XFFF;

  return 0;
}

Ergibt bei mir:
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"
../main.c: In function 'main':
../main.c:133: warning: large integer implicitly truncated to unsigned type
Finished building: ../main.c

mit dem AVR-GCC v 4.3.0 (WinAVR 20080512)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Frank (Gast)
Datum:

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

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
uint16_t message[4];
bist du besser dran. Glaubsch du mir.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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();

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht solltest Du weiter vorne anfangen ... und erstmal beschreiben 
was Du überhaupt erreichen willst.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Norgan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.