AVR-GCC: Umrechnug array nach integer macht Probleme

Gast #1058806
Ich benutze einen ATMEGA128 mit AVRStudio 4.14 und WinAVR20080610 und
möchte aus einem array einige Stellen auslesen und in dann in ein 32bit 
Integer speichern. Mit dem unten angegebenen Code gibt es aber Probleme. 
Das Problem liegt bei frequenz[4]. Wenn dort eine Null steht wird alles 
problemlos umgerechnet. Steht dort jedoch eine Zahl die größer ist als 3 
bekomme ich nur noch falsche Werte angezeigt.
Z.B.: im Array steht "12.345,678" wird freq = 12280142
Auch im Simulator kommen falsche Werte zustande.
Hat jemand eine Idee?

1
char frequenz[11] = "12.345,678";
2
uint32_t freq = 0;
3
  // umrechnen vom array nach integerzahl 
4
  freq =   (frequenz[0] - '0') * 10000000 + (frequenz[1] - '0') * 1000000 + (frequenz[3] - '0') * 100000 + 
5
      (frequenz[4] - '0') * 10000 + (frequenz[5] - '0') * 1000 + (frequenz[7] - '0') * 100 +
6
      (frequenz[8] - '0') * 10 + (frequenz[9] - '0');
7
  sprintf(Buffer, "%10lu ", freq);
8
  lcd_gotoxy(0,3);
9
  lcd_puts(Buffer);

Gruß

Marcus
Wenn Frequenz von [4] grosser ist als 3 bekommst du an der Stelle einen 
ueberlauf weil der Compiler erstmal nur mit 16 Bit rechnet. Und das 
reicht nur von -32768 .. 32767

(frequenz[4] - '0') * 10000

Schreibe lieber mal

(frequenz[4] - '0') * 10000L

Dann macht er auch eine Longmultiplikation mit 32 Bit

Das gilt auch fuer die anderen Stellen.

Gruss Helmi
Johann L. wrote:

> Deine Initializer macht sowas wie
>
>
1
> frequenz[0] = (char) "12.345,678";
2
>
>
> Nimmt also die Adresse von "12.345,678", schnippelt ab Bit 8 alles ab
> und macht das nach [0].

Nein, es macht genau das, was der OP davon erwartet.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.