mikrocontroller.net

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


Autor: Elektrolyt (Gast)
Datum:

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

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne deinen Code zu sehen kann man nur raten.

Gruss Helmi

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht 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:
u16Val =   1000 * ( (uint16_t) (charstring[0] - '0')  )
         +  100 * ( (uint16_t) (charstring[1] - '0')  )
         +   10 * ( (uint16_t) (charstring[2] - '0')  )
         +        ( (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)

Autor: Wolfgang Mües (Gast)
Datum:

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

Autor: Elektrolyt (Gast)
Datum:

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

Autor: Spinner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komisch, das atoi nicht ging.

Autor: Helmut Lenzen (helmi1)
Datum:

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

Autor: Elektrolyt (Gast)
Datum:

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

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.