Forum: Mikrocontroller und Digitale Elektronik Wieso passt diese Zahl nicht in die Variable ?


von Magnus (Gast)


Lesenswert?

Ich muss jetzt doch mal fragen welche Zahlenlänge in den Variablen Typ
uint32_t passt .
In diese Variable schreibe ich 123456 rein und vergleiche dann in einer 
Abfrage ob 123456 dem Wert der Variablen entspricht .
Dies tut es jedoch nie ?! .Lasse ich mit den Wert der Variablen im 
Display ausgeben bekomme ich einen Wert von -1039 ?! .
Wie kann es bitte sein das ich bei einem unsigned typ einen negativen 
Wert habe ?! .
Fehler in der Prozedur kann ich im übrigen ausschließen zumal ich zb mit 
dem Wert 1234 keine Probleme habe .
Dieser Wert wird dann auch als 1234 auf dem Display ausgegeben .

Welchen Fehler mache ich bei den Variablen ? .
Ich brauche etwas wo ich 9 stellige Zahlen abspeichern kann .
Einen string möchte ich hier allerdings nicht nutzen .

von Karl H. (kbuchegg)


Lesenswert?

Magnus schrieb:

> Fehler in der Prozedur kann ich im übrigen ausschließen zumal ich zb mit
> dem Wert 1234 keine Probleme habe .

Du vielleicht.

Wir hingegen schliessen bei der Fehlersuche grundsätzlich erst einmal 
gar nichts aus solange nicht das Gegenteil bewiesen ist.

Daher:
Beschreib nicht deinen Code. Zeige ihn! In der Zeit, die du zum Tippen 
deiner Beschreibung gebraucht hast, hättest du den Code auch per 
Copy&Paste mindestens 5 mal einfügen können und wenn du deinen Code 
einfach als Dateianhang mitgepostet hättest, hättest du das in der Zeit 
mindestens 10 mal machen können.

Und wir bräuchten nicht nachfragen.

von Karl H. (kbuchegg)


Lesenswert?

> Display ausgeben bekomme ich einen Wert von -1039

Wenn du bei einem unsigned Wert ein negatives Vorzeichen hast, ist das 
schon mal ein deutlicher Hinweis darauf, dass du die falsche 
Ausgabefunktion benutzt.

das i in itoa steht für Integer. Genauso wie das l in ltoa für long 
steht. Und beide werden als 'mit Vorzeichen' angenommen! Die Funktionen 
bekommen jeweils ein Bitmuster. Sie können nicht wissen, dass das bei 
dir ursprünglich unsigned Zahlen waren.

von Ingo (Gast)


Lesenswert?

wenn du einen negativen Wert angezeigt bekommst, liegt das nicht an der 
Variablen, sondern an der Funktion mit der Du das machtst 
(printf("%d",variable) geht davon aus, das die Variable signed ist, 
sonst müsstest du "%ud" schreiben, der Typ der Variablen spielt aber bei 
Vergleichen und Operationen mit ihr eine Rolle.
mfG Ingo

von Karl H. (kbuchegg)


Lesenswert?

Magnus schrieb:

> Ich brauche etwas wo ich 9 stellige Zahlen abspeichern kann .

9-stellig?

Was willst du machen?
Das Budgetdefizit ausrechnen?

von Purzel H. (hacky)


Lesenswert?

Ein Long, longint, longword sind alle um die 9 stellen. Wenn noch was 
uebrig sein soll, dann wuerde man quadword, longlong oder longlongint 
verwenden

von Martin M. (martinm)


Lesenswert?

Hallo,

mir fällt dazu folgendes ein / auf:
- welche Programmiersprache verwendest du? in C ist uint32_t kein 
Schlüsselwort, es muss also ein define oder typedef geben, das daraus 
einen Typ macht. Wie sieht das bei dir aus?
- welche Art Controller verwendest du? Bei einem 8-Bitter kann die 
Verwendung einer long-Var bei Ausgaben anders aussehen als bei einem 
32-Bitter.

Gruß

Martin

von Magnus (Gast)


Lesenswert?

Aha danke für den Hinweis mit dem itoa .Und genau das habe ich bei mir 
gefunden :S.Wie ich die Funktion wissen lassen kann das es ein unsigned 
int ist habe ich allerdings noch nicht ganz herausgefunden .
Kann mir hier vielleicht jemand auf die Sprünge helfen  ?! .
Bin fast sicher das ich hier ein Problem habe !

von g457 (Gast)


Lesenswert?

> Wie ich die Funktion wissen lassen kann das es ein unsigned
> int ist habe ich allerdings noch nicht ganz herausgefunden

Versuchs mal mit utoa() respektive ultoa()

HTH

von Karl H. (kbuchegg)


Lesenswert?

Magnus schrieb:
> Aha danke für den Hinweis mit dem itoa .Und genau das habe ich bei mir
> gefunden :S.Wie ich die Funktion wissen lassen kann das es ein unsigned
> int ist habe ich allerdings noch nicht ganz herausgefunden .

Das geht gar nicht.
Für unsigned gibt es utoa
Aber vorsicht: Du hast prinzipiell keinen int, du hast einen long!
Und die Funktion wiederrum heißt dann ultoa


itoa    für int
utoa    für unsigned int
ltoa    für long
ultoa   für unsigned long



Das alles erklärt aber immer noch nicht, warum deine Vergleiche nicht 
funktionieren :-)

Hast du vielleicht = anstelle von == geschrieben?

von Magnus (Gast)


Lesenswert?

Karl heinz Buchegger schrieb:
> Das alles erklärt aber immer noch nicht, warum deine Vergleiche nicht
>
> funktionieren :-)

Doch und zwar habe ich eine Routine die die Variable mit dem 123456 ins 
Eeprom schreibt .Ins Eeprom schreibe ich diese Zahl allerdings erstmal 
als String so wie ich sie vom PC bekomme .
Der Wert wird dann vor dem Vergleich abgerufen vom string umgewandelt 
und verglichen .
Da die Umwandlung aber nicht stimmte ,stimmte auch der Vergleich nicht .

Allerdings habe ich Dussel gerade nach itoa gefragt .Ich brauche aber 
das Gegenstück also atoi für long int ?! .
Ich habe hier strtoul gefunden .Allerdings erwartet diese Funktion 
wieder einiges mehr .Stelle 1 ist ein Pointer auf meinen String aus dem 
EEprom ,Stelle zwei soll das Ende im String markieren (brauche ich aber 
nicht also wie umgehen ?! .Und Stelle drei ist ja klar 10 für Dezimal .

Oder gibt es noch eine bessere funktion ?

von Karl H. (kbuchegg)


Lesenswert?

Magnus schrieb:

> Ich habe hier strtoul gefunden .Allerdings erwartet diese Funktion
> wieder einiges mehr .Stelle 1 ist ein Pointer auf meinen String aus dem
> EEprom ,Stelle zwei soll das Ende im String markieren (brauche ich aber
> nicht also wie umgehen ?!

Doku lesen.
Du darfst NULL angeben um der Funktion zu sagen: Behalte deine Ergüsse 
für dich.

von Andreas F. (aferber)


Lesenswert?

Magnus schrieb:
> Doch und zwar habe ich eine Routine die die Variable mit dem 123456 ins
> Eeprom schreibt .Ins Eeprom schreibe ich diese Zahl allerdings erstmal
> als String so wie ich sie vom PC bekomme .
> Der Wert wird dann vor dem Vergleich abgerufen vom string umgewandelt
> und verglichen .
> Da die Umwandlung aber nicht stimmte ,stimmte auch der Vergleich nicht .

Und damit ist das mal wieder ein Paradebeispiel dafür, warum der Code 
gepostet werden muss, und nicht eine Beschreibung des Codes. Für dich 
mag die Beschreibung ausreichend sein, alle anderen haben aber etwas 
gänzlich anderes verstanden als in deinem Code steht.

Bleibt die Frage, warum du den Wert überhaupt für den EEPROM in einen 
String umwandelst? Ist ja nicht so, als müssten die EEPROM-Daten 
besonders portabel sein oder sonstwas, also kannst du auch einfach den 
uint32_t als 4 Bytes im EEPROM speichern. Spart sowohl eine ganze Menge 
Code als auch Platz im EEPROM.

Andreas

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.