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


Anmelden zum Antworten