float to str mit dtostrf

OP #1222303
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
OP #1222314
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
#1222330
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

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

3
  dtostrf( temp, 5, 1, tempstr );
4

5
  // wieviele Leerzeichen braucht man?
6
  AnzLeer = 5 - strlen( tempstr );
7
  for( i = 0; i < AnzLeer; ++i )
8
    lcd_putc( ' ' );
9
  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)
1
  char tempstr[10];    // hier ist kleckern meist kontraproduktiv
2

3
  dtostrf( temp, 5, 1, tempstr );
4

5
  // wieviele Leerzeichen braucht man?
6
  lcd_puts( "     " + strlen( tempstr ) );
7
  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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren