Anzeige:
Ergebnis 1 bis 6 von 6

Thema: "abstraktes" printf()?

  1. #1
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609

    "abstraktes" printf()?

    Hi

    Gibt's ne Art abstraktes printf()? Also eins das ca. so aussehn würd:
    int aprintf( void * data, int (*putc)( void * data, char c ) const char * fmt, ... );

    Das wäre dann echt geil weil total unabhängig. Auf was geprintet wird müsste printf dann nicht mehr wissen, alles was es braucht ist diese eine per Parameter übergebene Funktion die ein Zeichen schreibt. Ob jetzt mein data ein fd, ein FILE, ein String oder was ganz anders ist, ist dann völlig egal.

    Unter ANSI und POSIX gibt so ne Funktion natürlch nicht, aber hat vieleicht GNUC sowas? Oder ne andere lib?
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  2. #2
    Registrierter Benutzer
    Registriert seit
    28.04.2001
    Beiträge
    62
    So eine Funktion kenne ich zwar nicht, aber es gibt in der GNU C Lib die Möglichkeit printf neue Parameter-Typen (z.B. für eigene Datenstrukturen) einzuimpfen. Infos dazu findest du entweder in info oder hier: http://www.gnu.org/software/libc/man...izing%20Printf. Die Funktion heisst register_printf_function. Die selbst definierten Parameter sollten dann laut Doku auch mit sprintf & Co. funktionieren.

  3. #3
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Nein, ist nicht das was ich suchte. Ich mach's jetzt mit asprintf() (ne GNU extension) und kopier dann diesen string dorthin wo ich ihn haben will. Ist halt ein wenig unnötiger overhead. snprintf() ist auch net besser, denn da müss't ich unter Umständen x mal probieren bis ich genug Speicher alloziert hab...

    Hmm.. ich könnt aber snprintf() als "fallback" verwenden, wenn asprintf() nicht zur Verfügung steht...

    Das Problem das bleibt ist: Wie stell ich zuverlässig fest ob es snprintf() bzw. asprintf() gibt?
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  4. #4
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Das Problem schreit geradezu nach dem C++ stream Konzept :-)
    Benutzt du ausschließlich C? Wenn nicht würde ich mal überdenken ob du das nicht in C++ realsieren möchtest. Abgesehen davon ist mir aber noch nicht ganz klar geworden, warum die fprintf und sprintf Familien von Funktionen nicht ausreichen. Du schriebst doch das du den String dann dahin kopierst wohin du ihn haben willst. Das bezieht sich doch auf den Speicher, oder? Dann kannst du den String doch auch direkt dorthin kopieren. Sollte das nicht gehen, wirst du einmaligem Kopieren so oder so nicht aus dem Weg gehen können. Denn eine Funktion wie du sie dir vorgestellt hast, müsste intern ja auch mit einem Puffer arbeiten. Nur wäre der dann versteckt.

    Aber wie gesagt, hier zeigt sich, das das Ganze mit C++ eleganter zu lösen ist.

  5. #5
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Original geschrieben von locus vivendi
    Das Problem schreit geradezu nach dem C++ stream Konzept :-)
    Benutzt du ausschließlich C? Wenn nicht würde ich mal überdenken ob du das nicht in C++ realsieren möchtest. Abgesehen davon ist mir aber noch nicht ganz klar geworden, warum die fprintf und sprintf Familien von Funktionen nicht ausreichen. Du schriebst doch das du den String dann dahin kopierst wohin du ihn haben willst. Das bezieht sich doch auf den Speicher, oder? Dann kannst du den String doch auch direkt dorthin kopieren. Sollte das nicht gehen, wirst du einmaligem Kopieren so oder so nicht aus dem Weg gehen können. Denn eine Funktion wie du sie dir vorgestellt hast, müsste intern ja auch mit einem Puffer arbeiten. Nur wäre der dann versteckt.

    Aber wie gesagt, hier zeigt sich, das das Ganze mit C++ eleganter zu lösen ist.
    hehe, naja. Das ganze rührt daher das ich C gegenüber C++ von der Standardlib her einfach zu minimal finde. Ich mag eben auch sehr das stream-Konzept usw., deswegen programier ich halt einiges von C++ unter C nach.
    Warum tu ich das? Weil mir langweilig ist. Gib mir ne bessere Aufgabe!

    Umgekehrt hab ich auch nen pthread wrapper für C++ geschrieben, vieleicht mach ich das auch noch mit sockets...
    Nur selber von iostreams ableiten is irgendwie ziemlich problematisch... (wegen socketstream )
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #6
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    05.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Angefangen hat das damit, dass ich in der EDVO HTL (jetzt mach ich grad Zivieldienst) oft was in C programmieren MUSSTE (HÜ), und mir da z.B. stringstream abging.
    Und ich hab auch in meinen HÜs unter C quasi objektorientiert Programmiert. Bei den Benotungen hat's den Prof. anscheinend nicht gestört. Richtig, effektiv und gut strukturiert/wiederverwendbar muss der Code sein, was ja bei OOP der Fall ist.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •