www.mikrocontroller.net

Forum: Compiler & IDEs float to str mit dtostrf


Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich habe grundsätzlich das AVR-net-io von Pollin und eine abgeänderte 
Radig Softare mit LCD von fleuri.

ich möchte zwei float und 3 int zahlen am display anzeigen lassen.
habe ich grundsätzlich gemacht jedoch sind die zahlen einmal einstellig 
und bis zu dreistellig und ich möchte haben das die einerstelle dieser 
zahlen am LCD immer an der gleichen stelle ausgegeben wird.
die habe ich nun gemacht in dem ich zuerst den wert abfrage und danach 
dementsprechend den string schreibe.
hier ein sinnhaftes beispiel

float temp;   hier steht die temperatur mit einer kommastelle und 
maximal 3 stellen vor dem komma , zwei stellen wert und ein eventuelles 
minus
char tempstr[5];


if((temp < 100) && (temp > 10))  also zweistellig
{
tempstr[0] = ' ',
dtostrf(temp,2,1,tempstr[2]);
}
.
.
.
lcd_gotoxy(5,0);lcd_puts(tempstr);
.
.
.

so frage ich weiter bis ich alle möglichkeiten durch habe die es gibt
Das mache ich bei allen zahlen.
danach steht der Prozessor.
wenn ich dies nur bei einer oder zwei zahlen mache geht es noch.
wenn ich es mit allen zahlen die ich ausgeben will nach diesem Prinzip 
schreibe dann startet der Prozessor permanent neu.
wie kann ich dies kürzer machen um den selben effekt zu erziehlen.
Ich hoffe Ihr versteht was ich meine.
Wenn ich den tempstr aufs display ausgebe und sie ist nur ein stellig 
wird es linksbündig ins dilay geschrieben ich möchte es jedoch an einer 
bestimmten stelle rechtsbündig schreiben.
Im daten blatt meines displays(DEM16481 SYH-LY) habe ich jedoch nichts 
gefunden das ich von rechts nach links schreiben kann.

Wie gehe ich am besten vor um dieses Ausgabeproblem zu lösen.
Bitte um Info.
mfg fler

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe vergessen mit anzugeben das ich bei Compillieren bei jeder der 
oben genannten dtostrf funktion die fehlermeldung
../main.c:609: warning: passing argument 4 of 'dtostrf' makes pointer 
from integer without a cast

bekomme. Also anscheinend gefällt im die art wie ich die funktion 
schreibe nicht.
mfg Erich

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

Bewertung
0 lesenswert
nicht lesenswert
Erich Floh wrote:


> float temp;   hier steht die temperatur mit einer kommastelle und
> maximal 3 stellen vor dem komma , zwei stellen wert und ein eventuelles
> minus

Rechnen wir mal:
  1 Kommastelle
  1 Stelle für das Komma
  3 Stellen vor dem Komma
  1 obligatorisches '\0' für den String
------
  6

> char tempstr[5];

Der ist also schon mal um 1 Zeichen zu kurz.


> if((temp < 100) && (temp > 10))  also zweistellig
> {
> tempstr[0] = ' ',
> dtostrf(temp,2,1,tempstr[2]);

tempstr[2]   ist ein einzelner char
Was du willst, ist die Adresse an der dieser char beginnen soll.

    &tempstr[2]

Aber auch das hilft dir nicht viel.
  tempstr[0]  enthält ein Leerzeichen
  tempstr[1]  enthält ....  irgendwas
  tempstr[2]  ab dort beginnt dann deine Stringrepräsentierung.


> so frage ich weiter bis ich alle möglichkeiten durch habe die es gibt
> Das mache ich bei allen zahlen.

Ziemlich umständlich.
Lass dir doch einfach den String mal generieren.
Danach siehst du nach wie lange der String geworden ist, und gibst vor 
dem String eine entsprechende Anzahl Leerzeichen aus.

Und deine Formatierangaben beim dtostrf stimmen auch nicht.

> dtostrf(temp,2,1,tempstr[2]);
               ^
               |
               +-- das hier ist die Feldbreite: Also die Anzahl
                   aller Zeichen insgesammt. Inklusive Dezimalpunkt
                   und Vorzeichen

  char tempstr[10];    // hier ist kleckern meist kontraproduktiv

  dtostrf( temp, 5, 1, tempstr );

  // wieviele Leerzeichen braucht man?
  AnzLeer = 5 - strlen( tempstr );
  for( i = 0; i < AnzLeer; ++i )
    lcd_putc( ' ' );
  lcd_puts( tempstr );

Für die Ausgabe der Leerzeichen gibt es auch noch einen kleinen Trick 
(Ich hoffe mal, dass ich mich jetzt nicht um 1 verzählt habe)
  char tempstr[10];    // hier ist kleckern meist kontraproduktiv

  dtostrf( temp, 5, 1, tempstr );

  // wieviele Leerzeichen braucht man?
  lcd_puts( "     " + strlen( tempstr ) );
  lcd_puts( tempstr );

Wenn du aber mit Pointern noch auf Kriegsfuss stehst, ist wahrscheinlich 
die Schleifenmethode für dich besser geeignet. Acch deshalb weil die 
Stringlänge in "     " mit der gewünschten Feldbreite korrespondieren 
muss. Wenn man den Trick erst mal durchschaut hat, ist er ganz simpel, 
aber er ist für einen Neuling nicht leicht zu durchschauen.

Autor: Erich Floh (fler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Danke für die hilfe, es lauft, ich habe auch bei der dtostrf funktion 
falsche infos bekommen.
mfg Erich

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.