PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pointer verbiegen?



klicke
03-10-2008, 19:53
Hi Leute,

ich möchte mir mit vprintf ein "eigenes printf" mit var. Parametern schreiben. Das Problem ist jedoch, dass die Funktion vprintf ebenso wie die Funktion printf standardmäßig über die Fkt. putchar() etwas auf die Konsole schreibt. Ich möchte aber, dass das Programm beim Aufruf der vprintf() Funktion nicht auf die Standardfunktion putchar(), sondern auf eine von mir bearbeitete putchar() Funktion geht.

Man hat mir den Tipp gegeben, dass mit Hilfe des Pointer verbiegens zu lösen.
Doch im Internet hab ich dazu nichts gefunden..
Hat jemand einen Tipp?

locus vivendi
03-10-2008, 20:51
Kannst du noch ein paar Angaben machen?
1. Welche Sprache? Da du von printf und putchar schreibst kommen wahrscheinlich nur C und C++ in Frage, die sind zwar ähnlich jedoch nicht gleich. Aber z.B. gibt es auch eine Sprache namens D die auch ein printf hat.

2. Programmierst du diese printf Alternative nur aus Spass an der Freude, oder geht es darum einen Baustein für etwas Größeres zu haben?

3. Ich bin etwas verwirrt: Im ersten Satz schreibst du, du willst printf *ersetzen*, später schreibst du etwas was sich eher danach anhört, dass du möchtest, dass eine *bestehende* printf Funktion etwas anderes als putchar verwenden soll.


Das Problem ist jedoch, dass die Funktion vprintf ebenso wie die Funktion printf standardmäßig über die Fkt. putchar() etwas auf die Konsole schreibt.
Was C und C++ angeht sagen die jeweiligen Normen, das printf so funktioniert, *als ob* fputc (ähnlich putchar) benutzt wird. Es ist also nicht gesagt, das "zurechtbiegen" von fputc bzw. putchar überhaupt printf betreffen würde.


Man hat mir den Tipp gegeben, dass mit Hilfe des Pointer verbiegens zu lösen.
Egal wie deine Antworten auf die Fragen ob lauten, dieser Tipp scheint mir falsch zu sein. Aber mal schauen...

klicke
03-10-2008, 21:21
Hi locus vivendi,

zu 1: Sorry, dachte ich hätte das angegeben. Es handelt sich um C.

Zu den restlichen zwei Punkten:
Das man das richtig kapiert, muss ich ein bisschen weiter ausholen.
Und zwar geht es darum, dass ich gerne die Vorzüge der printf() Funktion(formatierte Ausgabe durch %d, %f...etc) mit einer Neuerung paaren möchte. Das ganze an einem kleinen Code-Beispiel:



void Ausgabe(char param1,char param2, "Textxyz%d",var1);

param1, param2....Parameter
"Textxyz%d"....beliebiger Text
var1... Variable

Also im Prinzip soll es eine printf() Funktion sein, die außerdem noch zwei Parameter aufweisen soll.
Nun ist es aber so, dass die printf() Funktion standardmäßig auf die Konsole schreiben würde. Da ich das Programm aber für einen Mikrocontroller benötige, sollen die Zeichen nicht auf die Konsole sondern zeichenweise über einen Bus ausgegeben werden. Die zwei Parameter definieren dann die Adresse des Datenempfängers.
Ich hoffe man versteht so ungefähr was es werden soll...

Mittlerweile hab ich eine Idee, die ich morgen ausprobieren werde:

1. Mit vsprintf() einen String erstellen.
In den String soll im Prinzip das: "Textxyz%d",var1

2. den String in einzelne Zeichen zerlegen und dann auf den Bus(zusammen mit der Adresse) schreiben.


Keine Ahnung ob das klappen kann, ist mir jetzt auf die Schnelle eingefallen -> Der Tag war schon lang :D


edit: Ist für etwas Größeres

musketaquid
04-10-2008, 05:32
Nun ist es aber so, dass die printf() Funktion standardmäßig auf die Konsole schreiben würde.

Naja, das stimmt net so ganz. Laut man page kann man auch angeben wohin die Ausgabe geht.

int vfprintf(FILE *stream, const char *format, va_list ap);
Der stream "FILE *stream" könnte dann, glaub ich, benutzt werden um auf deinen mikrokontroller zu schreiben.

klicke
05-10-2008, 10:47
Hi,

habs jetzt mit vsprintf() gelöst. Das mit dem "FILE *stream" hab ich nicht ganz gecheckt..

Danke für eure Hilfe!

Beatkiller
05-10-2008, 12:09
Der Datenstrom fließt bei printf() nach stdout, also Standard-Ausgabe. Dabei ist stdout lediglich ein Datei-Zeiger auf das Ausgabe-Gerät. Du kannst bei vfprintf() den Datenstrom angeben, auf den die Daten geschrieben werden sollen. Das ist immer eine Zeiger-Variable vom Typ FILE.