Forum: Mikrocontroller und Digitale Elektronik Problem mit der Ausgabe einer Zahl am LCD


von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

HI!

Ich habe wiedermal ein kleines Problem beim Programmieren. Und zwar 
übergebe ich meiner Funktion vier Werte und diese soll sie dann mehr 
oder weniger nur multiplizieren und das Ergebnis dann am LCD ausgeben.
Jedoch dürfte irgendwas bei der Rechnung passieren oder die Zahl einfach 
zu groß werden, was aber nicht sein dürfte. Alle Werte hab ich mit 444 
angenommen. Jeden Wert einzeln kann ich ausgegeben, dass heißt es kann 
lediglich an der Zeile mit der Rechnung oder beim umwandeln auf char ein 
Fehler sein.
In der Ausgabe steht dann statt der Zahl ein Fragezeichen.
1
void zeilenscan(int laengex, int laengey, int anfz, int endz)    //Steuert die zwei Motoren in einem Zeilenscannverfahren. Zeilen sind durch ez und iz vernderbar
2
{  
3
  int xz;  
4
  int d;
5
  int yz;
6
  float dauer;
7
  char buffer[20]="";
8
  lcd_puts("Dauer der \n");
9
  //dauer=laengex*laengey*(endz-anfz+1)/60;
10
  dauer=laengex*laengey;
11
  lcd_puts("Messung:");
12
  lcd_gotoxy(9,1);
13
  sprintf(buffer,"%d",dauer);
14
  lcd_puts(buffer);

Schon mal ein Dankeschön im Voraus für die Hilfen!

Lg Oliver

von Edi R. (edi_r)


Lesenswert?

Ich gehe mal davon aus, dass zuerst laengex*laengey als int ausgerechnet 
wird, was einen Überlauf ergibt, und das (falsche) Ergebnis wird dann in 
ein float konvertiert.

Ach ja: Im sprintf - bedeutet %d nicht eine Ganzzahl? "dauer" ist aber 
ein float.

Summa summarum: Probier's einfach mal mit einem anderen "dauer", z. B.:

long int dauer;

von Falk B. (falk)


Lesenswert?


von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

Hi!

pff, bei der Festkommaarithmetik blick ich nicht ganz durch :-(
Gibt es da keine einfachere Lösung?
Außerdem ist das ja alles unnötiger Quellcode und kostet nur 
Performance.

Lg

von holger (Gast)


Lesenswert?

>Außerdem ist das ja alles unnötiger Quellcode und kostet nur
>Performance.

ROFL;) Das sagt jemand der float benutzt.

von g457 (Gast)


Lesenswert?

Oliver Kra schrieb:
> float dauer;
[..]
> sprintf(buffer,"%d",dauer);

Da passt was mit den Typen nicht zusammen, 'dauer' ist float, '%d' 
erwartet einen int-Artigen.

HTH

von g457 (Gast)


Lesenswert?

..ich muss schon wieder die Ingrid machen:
Ein anständiger(tm) Compiler meckert die fehlerhaften Typen übrigens 
sogar an (-Wall regelt :-) :
1
$ avr-gcc -Wall -c main.c -o main.o
2
main.c: In function ‘zeilenscan’:
3
main.c:7: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘float’

HTH

von Oliver K. (Firma: TGM) (oliver1990)


Lesenswert?

dauer ist jetzt ein int.
Der Fehler ist nur, dass, wenn die Zahl größer als 500 wird der Datentyp 
zu klein werd oder so und dann wird irgendwas angezeigt.
Aber die Zahlen werden ohnehin nicht all zu groß und bis zur maximalen 
Größe ist es kein großes Problem. Schöner wäre es trotzdem, wenn es 
einwandfrei funkt :-( Das einzige was er noch hat, ist, dass er immer 
abrundet, aber das macht auch nichts.

lg

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.