Forum: Mikrocontroller und Digitale Elektronik printf Formatierungsfrage


von Matze (Gast)


Lesenswert?

Hallo zusammen,

ich wünsche euch einen schönen Samstag vormittag.

Könnt ihr mir sagen, warum folgende Zeile

double d=5, e=8;


printf ("%f durch %f = %f",d,e,d/e  );

"   ? durch ? = ?   "      ausgibt ?

Wie bekomme ich denn die Fragezeichen weg?

Das war schon alles.

Ich danke Euch im Vorraus sehr für die Hilfe.

viele Grüße,

Matthias.

von narf (Gast)


Lesenswert?

printf ("%4.2f durch %4.2f = %4.2f",d,e,d/e  );

von Oliver J. (skriptkiddy)


Lesenswert?

Matze schrieb:
> Wie bekomme ich denn die Fragezeichen weg?

Indem du die libprintf_flt mitlinkst.

von Matze (Gast)


Lesenswert?

Hallo,

vielen Dank für Deine Antwort.

doch es geht noch immer nicht.  Als Ausgabe gibt es nur ein 
Fragezeichen.

Der rechnet irgendwie nicht in dem Format.

Muss ich noch eine Library includen?

Grüße, MAtthias.

von Fred (Gast)


Lesenswert?

Matze schrieb:
> double d=5, e=8;

Und mit

double d=5.0, e=8.0;

?

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Matze schrieb:
> Muss ich noch eine Library includen?

Woher sollen wir das wissen, wenn Du es nicht einmal für nötig 
befindest, auch nur die kleinste Andeutung hinsichtlich Deines 
Zielsystems und der Produktionsumgebung zu machen?

von Matze (Gast)


Lesenswert?

Oh, entschuldigung, dass ich hdas alles gart nicht mitgeteilt habe.
bin hier noch anfänger in dem Forum, deswegen.

STK 500 mit Atmega 8515 Chip

AVR Studio4.18

hier mal der ganze code, bin gespannt, woran der Fehler liegen soll



#include <avr/io.h>
#include <stdlib.h>
#include "string.h"


// #include <util/delay.h>    // wenn das aktiviert, dann sendet er gar 
nichts, wißt ihr warum? brauche ich doch  für delay funktionen, nicht 
wahr?

#ifndef F_CPU

#warning "F_CPU war noch nicht definiert, wird nun nachgeholt"


#define F_CPU 8000000UL

#endif



#define BAUD 4800UL      // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.


#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif



void uart_init(void)
{
  UCSRB |= (1<<TXEN);  // UART TX einschalten
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1

  UBRRH = UBRR_VAL >> 8;
  UBRRL = UBRR_VAL & 0xFF;
}




int uart_putchar(unsigned char c)        //diese Funktion bekommt ein 
einzelnes Zeichen zugeschickt und gibt dieses aus
{



    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
    {
    }

    UDR = c;                      /* sende Zeichen */
    return 0;
}





int main(void)
{




   uart_init();



fdevopen (uart_putchar, NULL,0);

  int a= 5,b =8;
  double i=5.0/8.0 ;






  printf ("%d x %d = %d",a,b,a*b  );
  printf ( "\r\n" );
  printf ("%d durch %d = %d",a,b,a/b  );
  printf ( "\r\n" );

  printf ("%d durch %d = %4.2f",a,b,i  );    //  funktioniert so noch 
nicht, nur Fragezeichen
  printf ( "\r\n" );





   while (1)
    {
      ;
   }

return 0;
}

von Oliver J. (skriptkiddy)


Lesenswert?

Die libm muss auch noch mitgelinkt werden. Hab ich vorhin vergessen.
Schau mal hier:
http://winavr.scienceprog.com/avr-gcc-tutorial/using-sprintf--function-for-float-numbers-in-avr-gcc.html

von eklige Tunke (Gast)


Lesenswert?

Nur so ein paar allgemeine Tipps zum Posten in Foren:
Netiquette

von besucher (Gast)


Lesenswert?

double-Variablen printfen mit %lf, nicht mit %f.

von Klaus W. (mfgkw)


Lesenswert?

Sorry, das ist erstens Unsinn und tut hier zweitens nichts zur Sache.

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.