stdio ohne malloc()

OP #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.
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.