sprintf() bzw. snprintf() für uint32_t funktioniert nicht wie gewünscht
-
Hallo zusammen!
Bei den Funktionen sprintf() bzw. snprintf() lässt sich immer nur ein einziger Modifizier angeben, z.b. %d, %c ,.... Bei eingabe von %ld wird beispielsweise nur d ausgegeben.
Aber ich benötige in meinem fall ja sowas wie %ld oder %PRIu32.Habt ihr eine Anhung, an was das liegen könnte?
Ich benutze als Ide CodeComposer Studio (Eclipse) der neuesten Version.void printUINT_32(uint32_t input){ char buffer[16] = ""; snprintf(buffer, 16, "Bla %ld Bla", input); //nicht ok sprintf(buffer, "%d", input); //ok printf_lcd(0,0,"UINT-WERT",1); printf_lcd(0,1,buffer,1); printf_lcd(0,2,"",1); delay_ms(200); }
-
Hier steht, dass du in deinem Projekt die printf Unterstützung auf "Full" stellen musst.
-
/* muss mit jedem C99 konformen C Compiler funktionieren */ if( 16 <= snprintf(buffer, 16, "Bla %ld Bla", (long)input) ) perror("fehler"); /* muss mit jedem C89 konformen C Compiler funktionieren */ if( sprintf(buffer, "%d", (int)input)<0 ) perror("fehler");
Wahrscheinlich sind 15 Zeichen zu wenig für Ziffern + zusätzliche Zeichen.
-
Wutz schrieb:
/* muss mit jedem C99 konformen C Compiler funktionieren */
CodeComposer ist von TI für embedded Systeme.
Und da wird schon mal die Library beschnitten. Gerade bei solchen komplexen Funktionen wie bei der printf() bzw. scanf()-Familie
-
Ich danke euch beiden für die Antworten.
Ich fürchte auch, dass TI mich da etwas ausschmiert.
Ich habs jetzt so gelöst. Gefällt mir zwar ned, aber was besseres fiel mir ned ein.
void uintToString(uint32_t dwNbr, char * pString) { uint32_t dwDigit; uint32_t dwDivisor = 1000000000; int boShowZero = 0; while(dwDivisor) { dwDigit = dwNbr / dwDivisor; dwNbr -= dwDigit * dwDivisor; dwDivisor /= 10; if ( (0 != dwDigit) || ( 1 == boShowZero ) ) { *pString = dwDigit + '0'; pString++; boShowZero = 1; } } *pString = 0; }
-
Hallo,
also, wenn man schon uint32_t hat, was mit C99 eingeführt wurde, sollte man mit hoher wahrscheinlichkeit auch inttypes.h haben. Dann ist die saubere Ausgabe/Eingabe von uint32_t werten mittels PRIu32, PRIo32, PRIx32, PRIX32, SCNu32, etc. zu erledigen. D.h.
snprintf(buffer, 16, "Bla %" PRIu32 " Bla", input);
Ausserdem sollte man mal bemerken, dass uin32_t "unsigned" ist und nicht "signed" und damit wäre ein Workaround auch wenn
snprintf(buffer, 16, "Bla %lu Bla", (unsigned long)input);
und nicht
snprintf(buffer, 16, "Bla %ld Bla", (long)input);
Das mit unsigned long müsste eigentlich auch immer funktionieren, da ich meine mich zu erinnern, ein unsigned long quasi mindestes 32-bit breit ist, bzw. eigentlich nur garantieren muss, dass man mindestens die Zahlen 0 bis 2^32-1 darstellen kann...
Gruß
Pauline