stdio ohne malloc()

#3452134
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
Gast #3452169
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.
#3452887
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!
Moderator Persönliche Seite #3452915
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren