Forum: Mikrocontroller und Digitale Elektronik AVR Atmega sscanf statt unsigned int ein uint_8?


von Anton G. (antong)


Lesenswert?

Hallo,
ich stehe gerade auf dem Schlauch.

Ich möchte mittels sscanf einen Sring bzw. Array in Variablen aufteilen.

Die Variablen in die aufgeteilt werden soll, sind global und schon 
vorgegeben.

Beispiel:
1
...
2
//Globale Variable:
3
uint8_t Anzahl;
4
uint8_t Maximum;
5
uint8_t Textfeld[]="101 312";
6
...
7
//dann hier die Funktion mit dem sscanf (globale Variablen sind über extern eingebunden)
8
sscanf(Textfeld,"%u %u",&Anzahl,&Maximum);
Problem: sscanf erwartet ja für %u ein unsigned int (also 2 Byte).
Wie bekomme ich nun am besten direkt den Wert in uint8_t?
Ich habe folgendes probiert (was allerdins auch nicht klappt):
sscanf(Textfeld,"%u %u",(uint8_t)&Anzahl,(uint8_t)&Maximum);

Das Textfeld ist in Wirklichkeit viel länger und ich teile etliche 
Variablen auf (auch uint16_t und int16_t). Wenn ich die Warnings des 
Compilers einfach ignoriere, passen manche Werte nicht, da mir ein Byte 
fehlt!
Was ist der einfachste Weg? Ich kann doch nicht extra für jeden Wert 
noch ein Variable unsigned int usw anlegen und danach die Werte den 
eigentlichen Variablen zuweisen, oder? Das wäre doch 
Speicherverschwendung...

Bin ich zu blind einen einfacheren Weg zu gehen?
Gruß Antong

von blub (Gast)


Lesenswert?

>They are declared in <inttypes.h> as macros: SCNd8, SCNd16, SCNd32 and >SCNd64.
http://stackoverflow.com/questions/6993132/format-specifiers-for-uint8-t-uint16-t

von Anton G. (antong)


Lesenswert?

Danke erst mal für die schnelle Antwort.
Das hatte ich auch schon gesehen (aber ehrlich gesagt nicht ganz 
verstanden und deshalb auch nur halbherzig probiert).

Ich habe das jetzt aber mal richtig probiert.
Ich bekomme nur bei den uint8_t und dem "SCNd8" folgende Fehlermeldung:
expected ')' before 'SCNd8'

Mache ich aus meinen SCNd8 ein SCNd16 oder SCNd32 bekomme ich keine 
Fehlermeldung. Die inttypes.h habe ich mir auch mal angeschaut.

Dort steht nur bei den "...d8" ein #ifdef vor.
[c]
#ifdef __avr_libc_does_not_implement_hh_in_scanf

#define    SCNd8      "hhd"
...
[\c]
War auch schon mal so dreist und habe da ein #ifndef von gemacht... 
leider kein Erfolg. Warum nimmt er nur die SCNd8 nicht (wie gesagt, ich 
kann an gleicher Stelle ein SCNd16 bzw. 32 schreiben und die oben 
genannte Meldung kommt nicht)?

Gruß Antong

von Anton G. (antong)


Lesenswert?

Hallo,
ich habe jetzt mal direkt statt "SCNd8" oder "SCNu8" direkt hhu% 
eingebe, funktioniert das. Irgendwas scheint da mit der Implementierung 
der SCN...8 nicht in Ordnung zu sein. Wie bereicht oben beschrieben 
funktioniert das Makro für die SNC...16 einwandfrei.

Naja, hauptsache es funktioniert. Man kann also uint8_t direkt mit 
sscanf nutzen.

Gruß Antong

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.