PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C, Variable Argument-Liste: Anzahl der Parameter?



nobody0
28-06-2004, 13:13
Gibt's zumindest beim gcc ein Makro, das die Anzahl der übergebnen Parameter ausgibt oder sogar die Daten so wie beim Aufruf von main (d. h. mit argc und argv) übergibt? :confused:

quinte17
29-06-2004, 06:51
ich verstehe dein problem nicht ganz..
du willst die anzahl der übergeben parameter wissen, aber beantwortest dir die frage gleich selbst... (argc)

wo genau möchtest du die denn wissen?
oder was genau möchtest du denn machen?

greetz

nobody0
29-06-2004, 09:35
wo genau möchtest du die denn wissen?
oder was genau möchtest du denn machen?


Ganz einfach bei einer Funktion, beispielswese foo, bestimmen wie viele Parameter übergeben wurden um beispielsweise zu checken ob der Wert im zulässigen Bereich ist.

Für main gibt's ja zwei pointer, über die man diese Information direkt erhält, aber bei ANSI-C gibt's das nur für main; bei anderen braucht man umständliche Makros. Deshalb suche ich nach Makros, die mir die variable Argumetlist möglichst so wie bei main übergeben.
Außerdem stört mich, dass die variable Argumentliste mind. ein Argument braucht, so dass ich ein Dummy-Argument mitschleppen muß. Kann man das nicht ändern, beispielsweise mit einer gnu extension des gcc?
:confused:

quinte17
29-06-2004, 14:23
mhh, diese prob hatte ich bis jetzt noch nicht...
wenn du zum beispiel pointer verwendest, dann kannst ja auf null prüfen, dann eins weiter hüpfen und wieder prüfen... bis null rauskommt (was hoffentlich das ende des arrays ist)
ansonsten fällt mir diesbezüglich auch nichts ein sry

greetz

anda_skoa
29-06-2004, 14:45
Durchiterieren tut man normalerweise mit den Funktionen aus stdarg.h (va_start, va_arg, usw)

Ciao,
_

Trillian
29-06-2004, 17:03
Ja, prinzipiell gibts 2 Möglichkeiten:

* Anzahl Argumente übergeben
* Ende der Liste markieren

Also:

foo (2, eins, zwei);
foo (eins, zwei, NULL);

Habe gerade keine Zeit für Code-Snippets, aber Google hilft ;)

nobody0
29-06-2004, 17:22
Ja, klar, am Ende ist der Pointer NULL, wie auch in K&R nachzulesen, aber das muß man selber machen und allein für das Iterieren muß man ein Makro aufrufen.
Lieber wäre mir ein Makro mit dem ich die Übergabe wie bei main habe und als erstes die Parameteranzahl checken kann und die Parameter nicht umständlich über Makros auslesen muß.
Und eine zulässige leere Argumentliste hätte ich auch gerne, damit ich keinen dummy-Parameter brauche.
Anscheinend gibt's sowas aber nicht; in stdarg.h ist nix entsprechendes.

Alex_K
29-06-2004, 20:19
Lieber wäre mir ein Makro mit dem ich die Übergabe wie bei main habe und als erstes die Parameteranzahl checken kann und die Parameter nicht umständlich über Makros auslesen muß.

ich verstehe noch immer nicht ganz was du willst.
die main hat keine variabe parameteranzahl, der main werden immer 2 parameter übergeben. einer ist die länge des arrays, der andere ist ein zeiger auf das dazugehörige array.
das kannst du auch ganz normal ohen makros in einem programm verwenden. du erzeugst z.b. mit malloc das array dynamisch, da musst du ja wissen wie groß dein array ist (sonst könntest du es ja nicht anlegen), und genau dieses array und die größe übergibst du einer funktion.

panzi
29-06-2004, 21:24
Frage:
Bekommt deine Funktion nur Variablen vom selben Typ übergeben?
Wenn ja: Machs mit einen Array/einer Liste.

nobody0
29-06-2004, 21:26
Also ich will ganz einfach eine (i. Allg. mehrere verschiedene) C-Funktionen aufrufen können wie main, also einmal die Anzahl der Parameter übergeben bekommen und einmal die Argument-Liste übergeben bekommen.
Insbesondere will ich eine Funktion wahlweise auch ohne Parameter aufrufen.

Anscheinend geht das aber auch mit dem gcc nicht; jedenfalls konnte ich in der Richtung nichts finden.
Das macht Funktionen mit variabler Argumentliste etwas aufwendig/kompliziert, zumindest verglichen mit main.

Stanislaus
29-06-2004, 22:03
Du kannst bei der Deklaration einer Funktion doch Vorgabewerte für Parameter vergeben.

Dingenskirchen(int param1 = 0, int param2 = 0, ...);

Und bei der Implementierung musst Du dann halt prüfen, ob die Parameter Deinen Vorgaben entsprechen oder ob welche übergeben wurden.

Oder hab ich Dich jetzt auch falsch verstanden?
Poste am besten mal ein Stück Code, daß Dein Anliegen etwas verdeutlicht.

Bis neulich ...

edit: Ich versteh nicht ganz was für eine Kompileroption Du suchst. Kennst Du einen Kompiler, der eine vergleichbare Option bietet und wenn ja wie nennt sich der Kram bei diesem Kompiler?

panzi
29-06-2004, 22:46
Ich versteh nicht was du haben willst.. etwa das?

// ...
int myfunct( size_t n, const char * strar );

int main( void ) {
// ...
const char *strar[ 5 ] = { "einz", "zwei", "drei", "vier", "fünf" };

myfunct( 5, strar );
// ...
return 0;
}

Oder willst du einen Parameterstring parsen und in so ein array zerlegen? Dann musst halt einen Parameterstringparser schreiben.

nobody0
30-06-2004, 15:25
Also die Argumentliste will ich komplett variabel haben, also auch kein Argument übergen können, d. h.

foo()

foo(bar)

foo(4711, "blub")

foo( foo, &foo, 123456.7)

...

sollen möglich sein, so wie man das von Programmen wie z. B. mount gwohnt ist.
Und das geht leider nicht.

Stanislaus
30-06-2004, 16:01
Komplett variabel kann nicht funktionieren. Du musst in der Deklaration schon die maximale Anzahl (incl. dem jeweiligen Datentyp) der Parameter angeben kannst dabei aber direkt einen Vorgabewert vergeben, der dann genommen wird, wenn Du nichts übergibst.

Dein Beispiel mit mount ist etwas unglücklich, denn maount wird, wie jedes andere Prog auch, die Anzahl von argc der main() abfragen und damit argv[] durchlaufen. Das ist genau was einige Vorredner schonmeinten. Ein Array plus der Anzahl der Array Elemente. Alle übergebenen Parameter sind Strings also nix mit verschiedenen Typen.

Hast Du nicht ein etwas eindeutigeres Beispiel zur Hand. Wie Du den Aufruf gestalten willst ist mir klar nur wie soll die Funktion die Parameter auswerten?
Und was/wie sollte Dir da der Kompiler helfen können?

Bis neulich ...