Forum: Mikrocontroller und Digitale Elektronik sprintf ist mal wieder ungehorsam


von Thomas R. (Gast)


Angehängte Dateien:

Lesenswert?

Liebe Leute,

ich bin wieder mal ratlos!
Im AVR-Studio 4 mag sprintf wieder mal nicht richtig:

// hier das relevante Codeschnipsel:-------------------------
char str16 [17],  command [33];
double hispeeddelay;


else if(strncmp(command,"#HID=",5) == 0)
  {
    memcpy(str16,&command[ 5],strlen(command)-5);   // command ist z.B. 
"#HID=123.4"
  str16[strlen(command)-5] = 0;    // str16 ist z.B. "123.4"
  hispeeddelay = atof(str16);      //ob das funktioniert, weiss ich 
nicht
   if (BT_CONNECTED )
   {
      uart_puts ( "str16=" );
      uart_putl ( str16 );

      sprintf ( command,"##: %6.1f us", hispeeddelay);   //ergibt "## 
? us"
        uart_putl(command);
     }
  }
//-----------------------------------------------------------

Warum gibt das sprintf  "##      ? us"  aus??

Vielen Dank für jede Hilfe!
Thomas
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

von Thomas R. (Gast)


Lesenswert?

Hallo Jörg,
danke für den Link, ich finde aber nichts, was ich falsch mache ;-(
Vielleicht habe ich Tomaten auf den Augen?
vfprintf() habe ich jetzt rausgenommen, das nützt aber auch nichts.
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Thomas R. schrieb:
> sprintf ( command,"##: %6.1f us", hispeeddelay);   //ergibt "##
> Warum gibt das sprintf  "##      ? us"  aus??
Ich frage mich auch, wo da der Doppelpunkt hingekommen ist...  ;-)

Thomas R. schrieb:
> danke für den Link, ich finde aber nichts, was ich falsch mache ;-(
Such mal nach diesem Text in diesem Text:
1
By default, all the conversions described above are available except 
2
the floating-point conversions
Fazit: du mußt den richtigen Schalter umlegen, damit die "richtige" Lib 
verwendet wird.
von Stefan E. (sternst)


Lesenswert?

"Viel hilft viel" gilt hier nicht. Es ist z.B. totaler Quatsch gegen 
libprintf_flt.a und libprintf_min.a zu linken. Das macht das Ganze ja 
zu einem Glückspiel: in welcher Reihenfolge packt das AVR-Studio das 
wohl in die Kommandozeile?

http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio
von Thomas R. (Gast)


Angehängte Dateien:

Lesenswert?

Das stimmt natürlich.
Ich habe jetzt aufgeräumt und verwende nur libprintf_flt.a
Trotzdem funktioniert es immer noch nicht:

str16=   1.0
##:      ? us
von Stefan E. (sternst)


Lesenswert?

Thomas R. schrieb:
> Trotzdem funktioniert es immer noch nicht:

Weil du das "-Wl,-u,vfprintf" an die falsche Stelle gepackt hast.

PS: Was haben die ganzen -l.. Optionen da zu suchen (und teilweise in 
dreifacher Ausführung)? Und wozu brauchst du libc.a und libobjc.a? Du 
bist wirklich ein großer Fan von "viel hilft viel", oder?
von Thomas R. (Gast)


Angehängte Dateien:

Lesenswert?

ok - die Custom-Options und Libraries sind von mir noch nicht ganz 
erforscht!
Ich habe es jetzt mit einer minimalistischen Konfiguration probiert.
Das hat nicht geholfen.
von Stefan E. (sternst)


Lesenswert?

Immer noch die falsche Stelle.
[Linker Options], nicht [All files].
von Thomas R. (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die Libs.
von Thomas R. (Gast)


Lesenswert?

JETZT FUNZT ES!

str16=   1.0
##:    1.0 us

Besten Dank an alle, die mir geholfen haben!
Ich werde heute ein Bier auf euer Wohl trinken!
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.