PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Dynamische Funktions-Parameter



MikeG
28-10-2004, 15:42
Hallo,

ich weiß, ich stelle seltsame Fragen. Trotzdem mache ich es nochmal :D

Vielen kennen doch die Funktion printf(). Diese hat die Eigenschaft, beliebige Parameter anzunehmen, einer ist jedoch vorgegeben.

Ich möchte auch so eine Funktion bauen, allerdings komm ich nicht dahinter, wie das gehen soll. Eine Idee kam mir mit getopt(). Aber ich glaube, die Programmierer, die printf() entworfen haben, müssen das anders gemacht haben. getopt() kam wohl erst viel später.

Hat dafür jemand eine Idee?

Gruß

Mike

wraith
28-10-2004, 16:13
Dafür gibt es einen standardisierten Mechanismus.
Was du dazu brauchst steht im Header stdarg.h
Hier ist ein minimales Bsp
http://www.fz-juelich.de/zam/docs/bhb/bhb_html/d0095/chapter_10/section_6.html


Vielen kennen doch die Funktion printf(). Diese hat die Eigenschaft, beliebige Parameter anzunehmen, einer ist jedoch vorgegeben.

Ja, mind. ein Parameter muß benannt sein, der wird benötigt, um die Adresse des ersten unbenannten Parameters zu ermitteln.


Aber ich glaube, die Programmierer, die printf() entworfen haben, müssen das anders gemacht haben. getopt() kam wohl erst viel später.
Und noch vor stdarg.h sah das ganz anders aus (funktioniert mit heutigem C garnicht mehr).

Joghurt
28-10-2004, 16:16
getopt wird für Kommandozeilenparameter benötigt und hat überhaupt nichts mit variablen Parametern zu tun!

Es geht wie folgt:

definiere die Funktion wie folgt

#include <stdarg.h>

void Foo(int bar, ...)
{
va_list varg;

va_start(varg, bar); //"bar" ggf. durch den letzte benötigten Parameter
ersetzen
// benutzen ....
va_end(varg);
}zwischen va_start und va_end kannst du die variablen Parameter benutzen. "va_arg(varg, TYPE)" gibt dir in diesem Fall immer den nächsten Parameter, den TYPE musst du mit angeben.

Mehr unter "Variadic Functions" in "info libc".

Das ganze wird aber nur noch selten verwendet. Wofür brauchst du das denn? Wenn du nur printf modifizieren willst, ist es einfacher, mit vprintf zu arbeiten.

MikeG
28-10-2004, 16:17
Wer hätte es gedacht, das man mit Synonymen der Überschrift genau das richtige findet? :(

Trotzdem,
vielen Dank!

Gruß
Mike

MikeG
28-10-2004, 16:21
Wofür brauchst du das denn? Wenn du nur printf modifizieren willst, ist es einfacher, mit vprintf zu arbeiten.

Genau genommen will ich eine Logging-Funktion programmieren und diese in eine private Library für mich packen.

Außerdem will ich mich endlich mal genauer mit den Möglichkeiten von C befassen und lernen.
:)