www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler in der Float Funktion


Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen,
ich hab probleme mit der float funktion.
es soll nur eine stelle nach dem komma angezeigt werden. allerdings auch 
im minus bereich.
das problem ist, dass das komma an einer unterschiedlichen stelle im 
minusbereich angezeigt wird und auch springt wenn die zahl 1 oder zwei 
stellen vor dem komma hat. so bekomme ich keine einheitliche anzeige 
hin.
weis jemand rat für mein problem ?

gruss martin



for (double f=-20.0; f<15.0; f=f+1.111) {
      char string[3];

      dtostrf(f,2,1, string);
      //if (!(f>=10)) {string[3]='\0';}
      if (!(f<=0)) {string[3]='\0';}

      //strpos(string,".");
      //itoa(u,string,10);
      LCD_Print(string, 6, 113, 2, 1, 1, yellow, black);
      delay_ms(450);


    }

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"string" bietet Platz für drei Zeichen, was die abschließende \0 mit 
einschließt.

Das reicht für eine Floatingpoint-Zahl ganz und gar nicht; davon 
abgesehen ist ein Zugriff auf string[3] konsequenterweise illegal.

"string" muss mit Platz für mindestens 6 Zeichen deklariert werden:

-20.0 = '-', '2', '0', '.', '0', '\0'

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für den tipp.
hab die 3 auf 6 geändert.
das problem des "wandernden" komma bleibt aber gleich :-(

gruss martin

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
scheinbar ist das problem, dass der wert immer linksbündig angezeigt 
wird und somit einige zahlen einfach stehen bleiben. komma sollte immer 
an der gleichen stelle positioniert werden. unabhängig von dem 
minuszeichen und ob eine oder zwei stellen vor dem komma stehen.
das geht glaub nicht so einfach.

Autor: Stefan Oberpeilsteiner (stefano)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ist printf() eine Alternative für dich?
Damit kann man solche Dinge festlegen - schau dir einfach die 
entsprechenden "Flags?" an.

lg Stefan

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..soweit ich weis kann man da keine negativen werte übergeben

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan Oberpeilsteiner (stefano)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist echt immer wieder faszinierend wie breit das Angebot an Artikeln 
hier ist.

lg Stefan

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Stefan Oberpeilsteiner (stefano)

>Es ist echt immer wieder faszinierend wie breit das Angebot an Artikeln
>hier ist.

Sind ja nur ~400 ;-)

MFG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..ganz schön arrogant.
wenn es so einfach wäre, dass komma an einer festen position zu halten, 
frage ich mich, warum mir dann nicht jemand gütigerweise weiterhilft.
mit arroganten aussagen und links wo auf dieses problem auch nicht 
eingangen wird hilft mir nicht wirklich weiter.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So richtig habe ich Dein Problem nicht verstanden. Die einfachste 
Möglichkeit sollte aber ein sprintf bieten, wobei mit %6.1f formatiert 
werden könnte. Was dann auf der linken Seite zuviel an Leerzeichen steht 
kann man ausblenden.
Generell brauchen Ausgaben mit Nachkommastellen, die auch negativ werden 
können, immer ein wenig mehr Platz bei der Anzeige.

Blöd sieht es aus, wenn unsere transatlantischen Freunde kleine 
Millimeterwerte in inch angezeigt haben möchten. Da bekommt man immer 
lange Zahlen mit vielen Nullen. Vielleicht sind diese vielen Nullen der 
Grund für alles andere :-)

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die anzeige läuft momentan linksbündig. d.h.:
-10.5
-9.5
9.0
20.0

in der anzeige bleiben nicht mehr benutze zahlen stehen und auch die 
formatierung sieht so nicht wirklich toll aus.
-10.5
-9.55
9.055
20.05


aussehen sollte es wie folgt:
-10.5
 -9.5
  9.0
 20.0

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aktuell sieht der code wie folgt aus:

for (double f=-15.0; f<15.0; f=f+1.111) {
      char string[6];
      //sprintf(string,"e %.2f",f);        // ZielBuf02 =f(float), 
%3.2f=xxx.xxx (3vorkomma-,2nachkommastellen)
      dtostrf(f,2,1, string);
      //if (!(f>=10)) {string[6]='\0';}
      if (!(f<=0)) {string[3]='\0';}

      //strpos(string,".");
      //itoa(u,string,10);
      LCD_Print(string, 6, 113, 2, 1, 1, yellow, black);
      delay_ms(50);


    }

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Martin Schmid (paul-stanley)

Ein Blick in ein C-Grundlagenbuch enthüllt.

char string[6];
for (double f=-15.0; f<15.0; f=f+1.111) {
      sprintf(string,"e % #5.1f",f);
      LCD_Print(string, 6, 113, 2, 1, 1, yellow, black);
      delay_ms(50);
    }

>        // ZielBuf02 =f(float),%3.2f=xxx.xxx (3vorkomma-,2nachkommastellen)

Das ist ein Irrtum. 3.3 Sind NICHT 3 Vorkommastellen, sondern 3 Zeichen 
Gesamtbreite, davon zwei Nachkommastellen.

MfG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..als ergebnis wird bei diesem code nur ein "e     ?" ausgegeben !!!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann fang doch mal ganz einfach an:

1. anstatt double nimm float
2. reserviere für string getrost 20 Byte, Geiz kann von großem Übel sein
3. verwende sprintf(s,"%5.1f",f);

Vielleicht sagst Du auch noch, welchen Prozessor Du einsetzt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich beim AVR-GCC vergessen das float-printf mit einzulinken?

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab einen atmel 2561 und AVR

code sieht nun so aus:

char string[20];
for (float f=-15.0; f<15.0; f=f+1.111) {
      sprintf(s,"%5.1f",f);
      LCD_Print(string, 6, 113, 2, 1, 1, yellow, black);
      delay_ms(350);
    }

folgende fehler kommen beim compilieren:
displaydemo.c: In function 'main':
displaydemo.c:334: error: 's' undeclared (first use in this function)
displaydemo.c:334: error: (Each undeclared identifier is reported only 
once
displaydemo.c:334: error: for each function it appears in.)
displaydemo.c:334: warning: format '%5.1f' expects type 'double', but 
argument 3 has type 'float'
make.exe: *** [obj/displaydemo.o] Error 1

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Troll? Du schaffst es nicht einmal, richtig zu copy&pasten, beschimpfst 
andere aber als arrogant? Kopfschüttel
Kauf dir ein C-Buch und arbeite es durch. Das ist hier doch keine 
Spaßveranstaltung.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl wrote:
> Das ist hier doch keine Spaßveranstaltung.

Naja, meistens doch...irgendwie...

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Schmid

Es steht doch eh so toll in der Fehlermeldung, was verkehrt ist...

Ersetz mal "s" durch "string"

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das s hatte ich vorher schon durch string ersetzt.
aber dann kommt:

displaydemo.c: In function 'main':
displaydemo.c:334: warning: format '%5.1f' expects type 'double', but 
argument 3 has type 'float'

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..irgendwie dreht man sich hier nur im kreis.
der eine sagt "float"..der andere wieder "double"......oder mal 
"sprintf"..dann wieder "itoa"...langsam drängt sich mir der verdacht 
auf, dass die wo am meisten denken sie könnten das problem so einfach 
lösen, gar keine ahnung haben wie man es löst.

ein forum sollte eigentlich dafür da sein um hilfestellung zu geben und 
nicht so grosskotzig auf der tastatur rumzuklopfen.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Schmid wrote:
> ..irgendwie dreht man sich hier nur im kreis.
> der eine sagt "float"..der andere wieder "double"......oder mal
> "sprintf"..dann wieder "itoa"...langsam drängt sich mir der verdacht
> auf, dass die wo am meisten denken sie könnten das problem so einfach
> lösen, gar keine ahnung haben wie man es löst.
>
> ein forum sollte eigentlich dafür da sein um hilfestellung zu geben und
> nicht so grosskotzig auf der tastatur rumzuklopfen.

Jetzt mal ehrlich, das du keinen Schimmer von der Sache hast ist absolut 
klar.

Falks Beispiel war absolut ok, das du dich danach von Gast (Gast) in die 
Irre führen lässt irgendwie DEIN PROBLEM. Spätestens bei der 
Fehlermeldung des Compilers hätte ich zumindest mal mein HIRN 
eingeschaltet, solch absolut EINDEUTIGE Fehlermeldungen hab ich bei 
meinen Problemen selten.

Letzte Hilfe:

%[flags][width][.precision][length]specifier

sprintf(string,"%5.1f",f);
//Ist 5 Stellen Lang mit einer Nachkommastelle z.B. 123.4

Das Ganze passt in einen string[6], 5 Stellen und Stringende.

PS: Der Fehler liegt in deiner LCD_Print Funktion.

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int main(void){
 char string[20];
 for (double f=-15.0; f<15.0; f=f+1.111) {
  sprintf(string,"e % #5.1f",f);
  printf(string); //Testausgabe
  printf("\n"); //Nur damit Ausgabe untereinander
 }
 getchar(); //Offenhalten des Fensters
 return 0;
}

Ausgabe:

e -15.0
e -13.9
e -12.8
e -11.7
e -10.6
e  -9.4
e  -8.3
e  -7.2
e  -6.1
e  -5.0
e  -3.9
e  -2.8
e  -1.7
e  -0.6
e   0.6
e   1.7
e   2.8
e   3.9
e   5.0
e   6.1
e   7.2
e   8.3
e   9.4
e  10.6
e  11.7
e  12.8
e  13.9
e  15.0

Autor: Kanzler Gorkon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Martin Schmid

> ein forum sollte eigentlich dafür da sein um hilfestellung zu geben und
> nicht so grosskotzig auf der tastatur rumzuklopfen.

Und Du als Hilfesuchender bist nicht in der Position, diejenigen, die 
Dir Hilfe anbieten zu massregeln. Dass Du mit den Antworten, die 
großteils sinnvoll und gut sind, Dein Problem nicht (sebstständig) lösen 
kannst, liegt alleine in Deiner Verantwortlichkeit.
Warum interpretierst Du die Fehlermeldungen/Warnungen von Deinem 
Compiler nicht?
Willst Du nicht oder kannst Du nicht?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Tim T. (tim_taylor)

>PS: Der Fehler liegt in deiner LCD_Print Funktion.

Nein, er hat auch nicht die Fliesskommaversion von printf gelinkt.
Das geht so.

- Im AVR Studio im Menu Project -> Configurations Options
- Custom Options
- im linken Fenster [Linker Options] markieren, WICHTIG!
- dann inten rechts in die Zeile eintragen
  -Wl,-u,vfprintf -lprintf_flt -lm
- ADD drücken, dann OK

Dann normal compilieren (F7). Dann gehts.

MfG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab seither nur das Programmers Notepad benutzt und lade gerade AVR 
studio und probiere es wie oben beschrieben nochmals.

Autor: Martin Schmid (paul-stanley)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
..hab das avr studio installiert. allerdings wird da meine parallele 
datenverbindung nicht unterstützt. des weiteren gibt es den oben 
erwähnten menüpunkt auch nicht.
gibt es einen weg die änderung auch übers programmers notepad 
reinzubekommen ?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Martin Schmid wrote:
> des weiteren gibt es den oben
> erwähnten menüpunkt auch nicht.
Den gibt es natürlich nur dann, wenn auch ein Projekt geöffnet ist!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Schmid (paul-stanley)

>..hab das avr studio installiert. allerdings wird da meine parallele
>datenverbindung nicht unterstützt. des weiteren gibt es den oben

War schon immer so. Nur Seriell oder USB.

MFG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
na ja..dann muss ich doch weiter mit dem programmers notepad 
weitermachen.
notfalls muss ich halt den string aufwendig von hand an die richtige 
stelle verschieben.

trotzdem danke für die hilfe.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Schmid (paul-stanley)

>na ja..dann muss ich doch weiter mit dem programmers notepad
>weitermachen.

???
Was ist an einer AVRStudio Installation so schwierig? Und deinen 
Programmer kannst du auch ohne AVRStudio nutzen, einfach nur ds HEX-File 
per AVR-Studio erzeugen und gut.

>notfalls muss ich halt den string aufwendig von hand an die richtige
>stelle verschieben.

?????????????????????????????????
Anstatt sich mal eine ordentliche Programmierumgebung zu schaffen lieber 
sinnlos rummurksen? Naja  . . . .

MFg
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
?????
AVR Studio ist doch installiert.
gibt es da defizite beim lesen ????

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Martin Schmid (paul-stanley)

>AVR Studio ist doch installiert.

Und liegt dann das Problem? Projekt anlegen, Quelltext reinziehen, F7 
drücken. Kann man sogar nett simulieren.

MFg
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keine ahnung was da wieder los ist.
da schieb ich lieber den string bevor ich da noch stundenlang das avr 
studio überrede ein im programmers notepad auffähiges prg zu 
complilieren.


Build started 2.2.2008 at 19:02:53
avr-gcc.exe -mmcu=atmega2561 -Wl,-u,vfprintf -lprintf_flt -lm      -o 
testms.elf
c:/winavr-20071221/bin/../lib/gcc/avr/4.2.2/../../../../avr/lib/avr6/crt 
m2561.o:  In function `__vectors':
../../../../crt1/gcrt1.S:52: undefined reference to `main'
make: *** [testms.elf] Error 1
Build failed with 1 errors and 0 warnings...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Schmid (paul-stanley)

>keine ahnung was da wieder los ist.
>da schieb ich lieber den string bevor ich da noch stundenlang das avr
>studio überrede ein im programmers notepad auffähiges prg zu
>complilieren.

Der Compiler ist der gleiche, AVRGCC. Das einzige was AVRSTUDIO macht 
ist, dem Anfänger das Gefummel mit dem makefile abzunehmen. Das kann man 
aber auch wieder selber machen, einfach in den Optionen eintragen, 
external makefile.

MFG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
..wenn man eine externe makefile datei auswählt kann man Linker Options 
nicht mehr setzen.

hab mal in meinen original makefile reingeschaut und da stehen unter 
Library Options genau die gleichen sachen drin die du mir auch schon 
geschrieben hast.

anbei der original (unter programmers notepad lauffähige) makefile.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Martin Schmid (paul-stanley)

Und was sehen wir hier? Du nutzt NICHT die Floatig Point Pintf Version. 
Probiers mal damit
#---------------- Library Options ----------------
# If this is left blank, then it will use the Standard printf version.
#PRINTF_LIB = 
#PRINTF_LIB = $(PRINTF_LIB_MIN)
PRINTF_LIB = $(PRINTF_LIB_FLOAT)

Das leere PRINTF_LIB = auskommentieren und das letzte aktivieren, durch 
Entfernen des Kommentars.

MFG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
puh..das war eine geburt :-)

mit diesem code geht es jetzt wie gewünscht:


 char string[20];
 for (double f=-15.0; f<15.0; f=f+1.111) {
       sprintf(string,"%5.1f",f);
       LCD_Print(string, 1, 113, 2, 1, 1, yellow, black);
       delay_ms(350);
     }

wenn double durch float ersetzt wird, kommt ne warnung beim kompilieren. 
deshalb lass ich es jetzt so. darstellung ist wie gewünscht.


meine anfängliche vermutung, dass was in der funktion nicht richtig 
läuft, war  dann nicht ganz falsch.

vielen dank für eure hilfe.

gruss und einen schönen abend

martin

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Martin Schmid (paul-stanley)

>puh..das war eine geburt :-)

Herzlichen Glückwunsch. Was ist es denn? Junge, Mädchen oder AK?
(Insidergag für Mittermaier-Kenner)

> char string[20];
> for (double f=-15.0; f<15.0; f=f+1.111) {
>       sprintf(string,"%5.1f",f);
>       LCD_Print(string, 1, 113, 2, 1, 1, yellow, black);
>       delay_ms(350);
>     }

Schön, aber was bringt das dir? Wenn du sie nicht schon vorher verwendet 
hast, verballern dir sprintf und die Fliesskommazahlen ca 2,5kB Flash. 
Und das nur, um

e -15.0
e -13.9
e -12.8
e -11.7
e -10.6
e  -9.4
e  -8.3
e  -7.2
e  -6.1
e  -5.0
e  -3.9
e  -2.8
e  -1.7
e  -0.6
e   0.6
e   1.7
e   2.8
e   3.9
e   5.0
e   6.1
e   7.2
e   8.3
e   9.4
e  10.6
e  11.7
e  12.8
e  13.9
e  15.0

anzuzeigen?
Das geht, wie bereits geschrieben, mit Festkommaarithmetik 
wesentlich resourcenschonender. Dann reichen 50 Byte Flash.

MFG
Falk

Autor: Martin Schmid (paul-stanley)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne ne.
jetzt lassen wir es wie es ist, da alle 6 messwerte korrekt angezeigt 
werden.
das ganze prg incl. grafik verbraucht gerade mal 10 Kb und ich hab ja 
256 Kb flash auf dem board.

also lass ich es jetzt lieber lauffähig und geniese die eingesparte zeit 
um auf den fashcing zu gehen :-)

gruss und nochmals danke

martin

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> also lass ich es jetzt lieber lauffähig und geniese die eingesparte
> zeit um auf den fashcing zu gehen :-)

Da hast Du sogar recht.

Solange es keinen Grund zum Optimieren gibt, auf keinen Fall optimieren!

Frühes, zielloses Optimieren verschwendet Zeit und generiert Fehler.

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.