Forum: Compiler & IDEs stdio ohne malloc()


von Walter T. (nicolas)


Lesenswert?

Hallo zusammen,
wie die Überschrift schon sagt, gibt es zu meinem Problem schon eine 
Beschreibung in der AVR-GCC-Doku. Nur: Ich verstehe sie nicht:

http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html#stdio_without_malloc

Wo/wie lege ich den Puffer fest? In dem Beispiel habe ich doch nirgendwo 
eine Variable, die dauerhaft Speicher belegt?

Die Frage ist zwar peinlich, aber ich werde wohl damit leben müssen.

Viele Grüße
Nicolas

von Rolf Magnus (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Wo/wie lege ich den Puffer fest?

Welchen Puffer?

> In dem Beispiel habe ich doch nirgendwo eine Variable, die dauerhaft
> Speicher belegt?

Doch:
static FILE mystdout

von Tim (Gast)


Lesenswert?

Es gibt in dem Beispiel keinen Buffer.
1
printf("Hello, world!\n");
Ruft intern für jedes Zeichen die funktion uart_putchar auf.
Welche dann wiederum das Zeichen per UART sendet.
Wenn du da einen TX-Buffer drin haben willst musst du den
selbst einbauen.
static FILE mystdout ist vereinfacht gesagt nur ein Pointer auf 
uart_putchar.
Und mit stdout = ... legst du das Ziel der Standardausgabe fest.
Umschalten (Display/UART/...) ist so möglich.

von Walter T. (nicolas)


Lesenswert?

Tim schrieb:
> Es gibt in dem Beispiel keinen Buffer.

Ah, das erklärt einiges. printf arbeitet den Eingangsstring also 
häppchenweise ab.

Was natürlich eine weitere Frage aufwirft: Ist dann "snprintf" schneller 
als "printf" (von der Laufzeit von "putchar" mal abgesehen)?

von Rolf Magnus (Gast)


Lesenswert?

Walter Tarpan schrieb:
> Was natürlich eine weitere Frage aufwirft: Ist dann "snprintf" schneller
> als "printf" (von der Laufzeit von "putchar" mal abgesehen)?

Warum sollte es? putchar ist ja gerade der Unterschied zwischen den 
beiden.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ansonsten: das ist Opensource.  Schau dir doch bitte einfach die
Implementierung an, und mach dir selbst ein Bild davon.  Steht alles
in vfprintf.c.  (Alle anderen *printf.c-Dateien sind nur Wrapper um
diese herum.)

von Walter T. (nicolas)


Lesenswert?

Rolf Magnus schrieb:
> Warum sollte es?

Rein intuitive Vermutung: wenn das eine (printf) normaleweise einen 
Puffer benötigt ("malloc") und zurechtsgestutzt wird, das nicht zu tun 
und das andere ("snprintf") sowieso einen Puffer hat drängt sich die 
Frage auf, ob das Geschwindigkeitsunterschiede mit sich bringt.

Jörg Wunsch schrieb:
> Ansonsten: das ist Opensource.  Schau dir doch bitte einfach die
> Implementierung an, und mach dir selbst ein Bild davon.  Steht alles
> in vfprintf.c

Ich habe Respekt vor Leuten, die gut anderer Leute Quelltext lesen 
können. Selbst mache ich das nur dann, wenn die anderen Möglichkeiten 
der Informationsbeschaffung ausgeschöpft sind. OK, dieser Punkt ist wohl 
erreicht.

Danke für die Hilfe!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Walter Tarpan schrieb:
> Rein intuitive Vermutung: wenn das eine (printf) normaleweise einen
> Puffer benötigt ("malloc") und zurechtsgestutzt wird

Da wird nichts "zurechtgestutzt".

fdevopen() ist das Äquivalent zu fopen() aus dem Standard.  Diese
Funktion liefert (weil das eben im Standard so steht) einen Zeiger
auf ein Objekt vom Typ "FILE".  Dafür (und nur dafür) wird malloc()
benötigt.

Wenn man die FILE-Objekte jedoch stattdessen statisch vordefinieren
will, entfällt die Notwendigkeit für malloc(), denn der Speicher ist
ja dann statisch in der Applikation bereits vorhanden.

Ein Puffer ist dabei in keinem Fall involviert (wenn man von einem
„Puffer“ der Tiefe eins absieht, der dafür da ist, damit das im Standard
vorgesehene ungetc() implementiert werden kann).

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.