Stdargs mit dynamischem String



  • Und wenn wir schon die plattformabhängigen Kisten rauskramen, gibt's da auch noch vasprintf:

    void log (char *fmt, ...)
    {
      char* buff;
      va_list args;
    
      va_start (args, fmt);
      vasprintf (&buff, fmt, args);
      va_end (args);
    
      // ausgabe
      puts (buff);
    
      free(buff);
    }
    


  • @ten: bei deinem Code ist die Größe ja schon wieder begrenzt.
    @LordJaxom: irgendwie kennt mein Kompiler vasprintf nicht?!



  • Dr. C++ schrieb:

    @ten: bei deinem Code ist die Größe ja schon wieder begrenzt.

    du kannst ja auch BUFFERSIZE auf 0xffff setzen.
    so lange zeilen brauchst du doch gar nicht, kann ja keiner mehr lesen 😉



  • Loooool, das würde ich machen, wenn ich nen Stackoverflow oder nen vollen Arbeitsspeicher haben wöllte.



  • Dr. C++ schrieb:

    Loooool, das würde ich machen, wenn ich nen Stackoverflow oder nen vollen Arbeitsspeicher haben wöllte.

    na also,
    dann mach den buffer 'static' und 256 bytes gross.
    das sollte doch reichen...
    🙂



  • ten schrieb:

    Dr. C++ schrieb:

    Loooool, das würde ich machen, wenn ich nen Stackoverflow oder nen vollen Arbeitsspeicher haben wöllte.

    na also,
    dann mach den buffer 'static' und 256 bytes gross.
    das sollte doch reichen...
    🙂

    Ich frag hier, wie ich stdargs mit unbegrenzter Länge kriegen kann und nicht wie ich einen Buffer anlege, diesen als static deklarieren und 256 Bytes klein lasse 😕 . Die Logs werden nicht gerade mit kurzen Messages gefüllt und ich weißt nicht, ob static unbedingt sehr threadsicher ist.



  • Wie schon mehrfach gesagt wurde, kannst du das nicht mit Standard-Mitteln - zumindest kenne ich keine Funktion, die a-priori die Länge der printf()-Ausgabe berechnet. Also bleiben dir nur die Möglichkeiten, die Länge abzuschätzen (mit der geringen Chance, trotzdem zu wenig Speicher zu haben), mehrfach mit wachsenden Speichergrößen Anlauf zu nehmen (wenn's nicht geklappt hat, holst du dir etwas mehr Speicher und rufst vnsprintf() nochmal auf) oder den Formatstring selber zu parsen (und dir quasi ein printf()-Derivat für std::string zu bauen*).

    * Da wäre eventuell Boost::Format eine Lösungsmöglichkeit.



  • Dr. C++ schrieb:

    Ich frag hier, wie ich stdargs mit unbegrenzter Länge kriegen kann

    die frage wurde schon beantwortet: das gibt es nicht.

    Dr. C++ schrieb:

    Die Logs werden nicht gerade mit kurzen Messages gefüllt und ich weißt nicht, ob static unbedingt sehr threadsicher ist.

    der pufferinhalt muss ja nur so lange gültig sein, bis die message weggeschrieben wurde. also machste den buffer so gross wie eine lange message sein kann, _vsnprintf verhindert einen overflow, ein 'lock' am angang der funktion und ein 'unlock' am ende. und schon kann der nächste thread seine message loswerden...



  • Und was hat dann LordJaxom mit seinem letzten Post und der Funktion vasprintf gemeint?



  • Da ten auch nicht erwähnt hat dass _vsnprintf ne MS-Erweiterung ist, habe ich mir erlaubt zu unterschlagen, dass vasprintf eine GNU-Erweiterung ist. Ist also nur unter Linux und möglicherweise noch mit dem MinGW-Compiler für Windows verfügbar.


Anmelden zum Antworten