Forum: Mikrocontroller und Digitale Elektronik Wert von chararray in eine Int umwandeln


von Elektrolyt (Gast)


Lesenswert?

Hallo Leute,

ic verzweifel seit gestern an einer simplen Lösung habe eigentlich auch 
schon (meiner Meinung nach) alles probiert. Ich möchte einfach per 
Hyperterminal eine Zahl einlesen und diesen Per ATmega8 
weiterverarbeiten.
Die Uart klappt wunderbar, allerding habe ich enorme Probleme beim 
Umwandeln meines Char-Arrays mit Nullterminierung (Enter)
in eine einfache INT Variable. Die Eingegebene Zahl bzw die Eingegeben 
Zeichen sind in der Größenordnung 5000-10000
Also 4 oder 5 bytes... Warum bekomme ich die Zahl werder mit atoi oder 
mit irgendwelchen anderen berechnungen wie zb int a= 
1000*charstring[0]+100*charstring[1]+10*charstring[2]+charstring[3]
was mache ich seit falsch?
Weiss jemand noch eine Möglichkeit die ich probieren könnte? Auch schon 
mit dem Casten versucht, allerdings spuckt mir mein compiler warnungen 
aus, wegen pointer und variable zu klein...
Danke schon mal und schönen restabend...
Elko

von Helmut L. (helmi1)


Lesenswert?

Ohne deinen Code zu sehen kann man nur raten.

Gruss Helmi

von Matthias L. (Gast)


Lesenswert?

>1000*charstring[0]+100*charstring[1]+10*charstring[2]+charstring[3]
>was mache ich seit falsch?

Du sendest ASCII! Deshalb musst du das vorher zurückwandeln und auf 
Überlüfe achten:
1
u16Val =   1000 * ( (uint16_t) (charstring[0] - '0')  )
2
         +  100 * ( (uint16_t) (charstring[1] - '0')  )
3
         +   10 * ( (uint16_t) (charstring[2] - '0')  )
4
         +        ( (uint16_t) (charstring[3] - '0')  );

So müsste es gehen, wenn die Variable 4stellig und wirklich nur aus 
Ziffern  besteht...
(Und kleiner als 65536 ist)

von Wolfgang Mües (Gast)


Lesenswert?

unsigned int read(const char *cp)
{
  unsigned int result = 0;
  while (*cp) {
    result = result * 10 + *cp - '0';
    cp++;
  }
  return result;
}

von Elektrolyt (Gast)


Lesenswert?

Vielen Dank an alle... Die Lösung von Matthias klappt auf Anhieb, danke 
nochmal an dieser Stelle. Ich habe gestern die halbe Nacht versucht und 
hin und her gecastet und eigentlich auch genau das gemacht, nur an der 
Stelle ohne cast und subtrahierter '0' :-)
Die FKT von Wolfgang habe ich leider nicht zum laufen bekommen...
aufgerufen habe ich die Fkt mit: zahl = read((char*) string); wobei zahl 
unsigned int ist. Jedoch leider ohne Erfolg. Was lief da schief?
Besten Dank für eure Mühe
Gruss Elko

von Spinner (Gast)


Lesenswert?

Komisch, das atoi nicht ging.

von Helmut L. (helmi1)


Lesenswert?

>Die FKT von Wolfgang habe ich leider nicht zum laufen bekommen...
>aufgerufen habe ich die Fkt mit: zahl = read((char*) string); wobei zahl
>unsigned int ist. Jedoch leider ohne Erfolg. Was lief da schief?


Hat dein String auch eine 0 am Ende ?
Das wuerde auch das nichtfunktionieren von atoi erklaeren.

Gruss Helmi

von Elektrolyt (Gast)


Lesenswert?

Nabend,

joa fands auch komisch, dass atoi nicht ging, aber ich denke, ich habe 
da irgendwas mit dem übergebenen Parameter vercheckt.
habs ja jetzt am Laufen, aber ich würde ja schon gerne wissen, warum die 
Funktionen wie atoi oder itoa nicht wollten oder besser warum ich die 
nicht zum Laufen bekommen habe :-) kann mir vorstellen, dass ich das 
typecasten falsch gemacht hab, oder einfach nicht die Adresse von 
charstring übergeben hab, man(n) weiss es nicht :-)
vielleicht könnte es ja so klappen...
result = (int) atoi ((char *)  & charstring); ??????

@Helmi: Ja ich initialiere mein charstring vorher mit:

char string[5]={0,0,0,0,0};

beschreiben tue ich halt per Tastatureingabe nur die ersten 4 Stellen, 
also bis string[3] und dann per Enter die Nullterminierung. Da ich 
eigentlich aus dem Hause C++ für Win komme, möchte ich vorab gern 
nochmal klären, ob die Entertaste im Terminalprogramm ein 0x0D sendet 
(tuts eigentlich), also "\R\C" oder ein '\0' also 0 so wie in 
Win32-Applikationen. Oder ist das identisch? Besten Dank und schönen 
Abend
ps: ich tu mit jetzt das hier mal an:
Beitrag "String in Int umwandeln, damit rechnen und wieder zurückkonvertieren"

Elko

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.