mikrocontroller.net

Forum: Compiler & IDEs schwerer Rechenfehler


Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo da draussen,

ich habe ein Programm, das sich verrechnet.

Ich will aus 5 ASII-Zeichen (Ziffern) eine int machen.
Bei den lower 4 digts klappt es, aber bei dem 10.000er digit
kommt es zu einem Rechenfehler. Hier die wesentlichen Programmzeilen:

uint8_t x ; // hier definiere ich ein ASCII - Zeichen
            // jetzt wandle ich das ASCII-Zeichen in eine int
            // und weil's die 5te Stelle der gesamten int ist, *10000
            // und ausgeben...
            // der gcc gibt eine Warnung: "int Format. anderer
            // Typ Argument (Argument 2)
printf ( "x = %i \r\n ", ( ( x - 48 ) * 10000 ) ) ;
            // das Ergebnis: ab x > 3 (genau ab 32.768, was ja 2^15
            // ist) kommen falsche Ergebnisse der Berechnung.

Was mache ich falsch ?

Vielen Dank für Eure Mühe

Otto

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
%u (wie unsigned)


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was mache ich falsch ?

Du hast keine Doku gelesen sondern einfach was angenommen.

%i   ist fuer 'vorzeichenbehaftete' Zahlen.
%u   ist fuer 'unsigned'

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

..hab ich natürlich probiert, macht aber die gleichen Fehler.

Trotzdem danke für Deine schnelle Antwort

Otto

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz

...ich hab' %u probiert, ich habe auch versucht mit x als unint32_t.
Es kommt immer die gleiche Compiler-Warnung und der gleiche
Rechenfehler. Ich habe auch eine long int als Variable eingeführt und
diese ausgegeben, ergab immer den gleichen Fehler.

Ich weiß nicht, ob der Fehler durch die Berechnung entsteht, oder durch
die Ausgabe.

Trotzdem Danke für Deinen Hinweis,

Otto

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

#include <stdio.h>

int main()
{
  char buf[256];

  uint8_t x; // hier definiere ich ein ASCII - Zeichen
            // jetzt wandle ich das ASCII-Zeichen in eine int
            // und weil's die 5te Stelle der gesamten int ist, *10000
            // und ausgeben...
            // der gcc gibt eine Warnung: "int Format. anderer 
            // Typ Argument (Argument 2)
  x = '0' + 4;
  sprintf ( buf, "x = %u", ( ( x - 48 ) * 10000 ) ) ;
            // das Ergebnis: ab x > 3 (genau ab 32.768, was ja 2^15 
            // ist) kommen falsche Ergebnisse der Berechnung.
}

funktioniert so wie es sollte.
%u im Gegensatz zu %i

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> gleiche Compiler-Warnung

Welche?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab's schon gesehen, du hast die Warnung im Pgm
als Kommentar reingeschreieben.

Poste doch mal Deinen richtigen, kompletten Code. Nicht
nur einen Ausschnitt.

Autor: Otto Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An Alle,

...hat sich erledigt. Muss natürlich %u sein anstelle %i !

Ich hatte die Änderungen an der falsche Stelle ausprobiert, sorry,
jetzt  rechnet der uC richtig.

Danke für Eure Bemühungen !

Otto

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es tut keinem weh, die Warnung exakt und in vollem Wortlaut per
copy+paste reinzustellen, hilft aber ungemein.

Und dann auch sämtliche Quelltextzeilen bis zu dieser Warnung (als
Anhang).


Peter

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.