Forum: Compiler & IDEs float to str mit dtostrf


von Erich F. (fler)


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

von Erich F. (fler)


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

von Karl H. (kbuchegg)


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.

von Erich F. (fler)


Lesenswert?

Hallo

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.