Eigene print-Funktion ohne stdio.h
-
Swordfish schrieb:
Indem du direkt die entsprechenden APIs deines Lieblingsbetriebssystems benutzt.
Besserer Vorschlag: putchar
@Threadersteller: Was genau möchtest du wissen? printf ist eine komplexe Funktion bei der ein Anfänger an sehr vielen Stellen auf technische Schwierigkeiten stoßen kann.
-
SeppJ schrieb:
Besserer Vorschlag: putchar
wie geht das? schrieb:
[...] ohne stdio.h, [...]
:p
-
Swordfish schrieb:
SeppJ schrieb:
Besserer Vorschlag: putchar
wie geht das? schrieb:
[...] ohne stdio.h, [...]
:p
Ups.
Ich empfehle dann als ersten Schritt, eine Reimplementierung der Grundfunktionalitat aus stdio.h. Das heißt Filehandles implementieren (unter Unix einfach Integer), damit dann fputc und puts implementieren (unter Unix mit write aus unistd.h), mit denen dann fprintf. Dann stdout-Handle besorgen (unter Unix 1), damit dann putchar, puts und printf.
-
ok, danke ... vorschläge zum googeln?
-
Quellcode einer C-Standard-Lib oder auch µClib
-
Hier die Implementierung in der glibc http://sourceware.org/git/?p=glibc.git;a=blob;f=stdio-common/vfprintf.c;h=d5690342536bc8cf948c786f663bb63f73f91f3a;hb=HEAD und hier die von vsnprintf im Linux-Kernel https://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=lib/vsprintf.c;h=c3f36d415bdf43034415c801b8e3f922f5e5b928;hb=133fd9f5cda2d86904126f4b9fa4e8f4330c9569
-
danke, aber die implementierung in glibc hat auch den header stdio.h includiert.
-
wie geht das? schrieb:
danke, aber die implementierung in glibc hat auch den header stdio.h includiert.
Klar, da sind ja auch die Sachen drin definiert, die stdio.c braucht.
Willst du jetzt erstmal ein putchar nachbasteln oder gleich in die Vollen mit printf?
-
DirkB schrieb:
Willst du jetzt erstmal ein putchar nachbasteln oder gleich in die Vollen mit printf?
warum? ist putchar wohl einfacher?
-
wie geht das? schrieb:
danke, aber die implementierung in glibc hat auch den header stdio.h includiert.
Ah, du verstehst den Unterschied zwischen Header und Library nicht. Gut, hier ist printf ohne stdio.h
/* hier in C89 */ main() { printf("Hello %g\n", 0.5); return 0; }
// hier in C99/11 int printf(const char * restrict format, ...); int main(void) { printf("Hello %g\n", 0.5); }
Der Header enthält nur Deklarationen. Die Implementierung findet man dann aber in der Bibliothek. Die glibc ist so eine Implementierung und ob die stdio.h einbinden oder nicht ist dabei egal.
-
putchar gibt ein Zeichen auf stdout aus.
printf benutzt putchar um Zeichen auszugeben.
putchar ist in stdio.h deklariert.Du willst kein stdio.h -> also auch kein putchar.
Du musst erstmal die Basis schaffen.Es sei denn, du willst ein my_printf machen das putchar nutzt.
Also Auswertung vom Formatstring, lesen der variablen Parameterliste usw.Was du genau machen willst, hast du leider noch nicht gesagt.
-
@rüdiger: danke, den unterschied wusste ich wirklich nicht!
@DirkB: dann werde ich wohl erstmal putchar ohne stdio.h machen. ich kapier allerdings immernoch nicht, wie das geht...
-
wie geht das? schrieb:
@DirkB: dann werde ich wohl erstmal putchar ohne stdio.h machen. ich kapier allerdings immernoch nicht, wie das geht...
Dafür nimmst du die Funktionen des Betriebssystems. zB man: write(2) unter Linux/OSX.
-
rüdiger schrieb:
wie geht das? schrieb:
@DirkB: dann werde ich wohl erstmal putchar ohne stdio.h machen. ich kapier allerdings immernoch nicht, wie das geht...
Dafür nimmst du die Funktionen des Betriebssystems. zB man: write(2) unter Linux/OSX.
und unter win?
-
Schau dir doch mal ein putchar.c an. Ist doch kein Geheimnis.
-
wie geht das? schrieb:
rüdiger schrieb:
wie geht das? schrieb:
@DirkB: dann werde ich wohl erstmal putchar ohne stdio.h machen. ich kapier allerdings immernoch nicht, wie das geht...
Dafür nimmst du die Funktionen des Betriebssystems. zB man: write(2) unter Linux/OSX.
und unter win?
Warum hast du das überhaupt vor? Für jemanden der printf nachprogrammieren möchte, scheinst du weder den Ansatz eines Plans zu haben, noch scheinst du genau zu wissen, was du überhaupt genau möchtest. Wir können dir doch nicht alles aus der Nase ziehen, was du überhaupt willst, noch dir jede Kleinigkeit vormachen.
-
SeppJ schrieb:
wie geht das? schrieb:
rüdiger schrieb:
wie geht das? schrieb:
@DirkB: dann werde ich wohl erstmal putchar ohne stdio.h machen. ich kapier allerdings immernoch nicht, wie das geht...
Dafür nimmst du die Funktionen des Betriebssystems. zB man: write(2) unter Linux/OSX.
und unter win?
Warum hast du das überhaupt vor? Für jemanden der printf nachprogrammieren möchte, scheinst du weder den Ansatz eines Plans zu haben, noch scheinst du genau zu wissen, was du überhaupt genau möchtest. Wir können dir doch nicht alles aus der Nase ziehen, was du überhaupt willst, noch dir jede Kleinigkeit vormachen.
um zu kapieren, wie das funktioniert. und nein, ich habe tatsächlich keinen plan, und da helfen auch sachen wie "zB write(2) unter Linux/OSX." nicht weiter, wenn ich unter windows programmieren will.
-
wie geht das? schrieb:
um zu kapieren, wie das funktioniert. und nein, ich habe tatsächlich keinen plan, und da helfen auch sachen wie "zB write(2) unter Linux/OSX." nicht weiter, wenn ich unter windows programmieren will.
Das mit Windows hast du ja gerade erst gesagt.
Da wird es irgendeine WinAPI-Funktion geben.Hängt auch davon ab, ob du das in einem Fenster oder in der Konsole machen willst.
Mach doch ein putchar über eine TCP/IP-Verbindung und verbinde dich mit putty oder netcat.
Ist bestimmt einfacher.
-
Mal eine Frage in die Runde: gibt es dazu was im Projekt: OS-Development?
-
DirkB schrieb:
wie geht das? schrieb:
um zu kapieren, wie das funktioniert. und nein, ich habe tatsächlich keinen plan, und da helfen auch sachen wie "zB write(2) unter Linux/OSX." nicht weiter, wenn ich unter windows programmieren will.
Das mit Windows hast du ja gerade erst gesagt.
Da wird es irgendeine WinAPI-Funktion geben.Hängt auch davon ab, ob du das in einem Fenster oder in der Konsole machen willst.
Mach doch ein putchar über eine TCP/IP-Verbindung und verbinde dich mit putty oder netcat.
Ist bestimmt einfacher.der punkt ist: ich weiß immernoch nicht, wie sowas funktioniert, wie soll ich dann eine tcp-verbindung machen? inwiefern vereinfacht das was?