Funktion mit beliebig vielen Parametern eines Typs
-
Hi,
ich möchte gerne eine Funktion entwickeln, der ich beliebig viele Parameter übergeben kann. Also ist meine Frage wie das geht, und ob man die Anzahl der gezählten Parameter irgendiwe bekommen kann.DIV Ominion
-
Hmm..was fürn Typ den?
Könntest einen vector übergeben, dann mit size() die Grösse abfragen.
-
Ist das nicht egal? Mir geht es ja erstmal nur darum, dass meine Funktion eben beliebig viele Parameter annehmen kann, wie zum Beispiel wsprintf. Der Datentyp wäre dann aber ein String.
Mfg Ominion
-
Ominion schrieb:
Ist das nicht egal? Mir geht es ja erstmal nur darum, dass meine Funktion eben beliebig viele Parameter annehmen kann, wie zum Beispiel wsprintf.
So etwas wird von der Programmiersprache C/C++ standardmäßig zur Verfügung gestellt (Stichwort: 'variable Anzahl an Argumenten'), siehe: http://www.willemer.de/informatik/cpp/parameter.htm oder
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_va_arg.2c_.va_end.2c_.va_start.asp
-
Ich habe das jetzt mal so probiert:
void InsertColumn (HWND hListView, int iCountColumns, ...) { va_list params; char iColumnTitle[100]; va_start (params, iCountColumns); LVCOLUMN lvColumn; lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; for (int i = 0; i < iCountColumns; i++) { iColumnTitle = va_arg (params, char); lvColumn.iSubItem = i; lvColumn.pszText = iColumnTitle; lvColumn.cx = 120; lvColumn.fmt = LVCFMT_CENTER; ListView_InsertColumn (hListView, i, &lvColumn); } va_end (params); }
er sagt mir, dass in Zeile 12 ein Lvalue benötigt wird. Aber was soll denn da sonst rein?
-
vielleicht
iColumnTitle[i] = va_arg (params, char);
-
neeeee, ich will ja mit der Zeile 12 bewirken, dass der String, der dort eingegeben wurde, in iColumnTitle kopiert wird. Ich will nicht nur ein einzelnes Zeichen haben. Ich habe es auch schon so probiert:
iColumnTitle = va_arg (params, char*);
Mfg Ominion
-
ja, aber einem array kannste im nachhinein nix zuweisen durch '='
probier's doch mal indem du auschar iColumnTitle[100];
das machst:
char *iColumnTitle[100];
-
geht leider auch nicht...
Mfg Ominion
EDIT: es wird zwar compiliert aber nur wenn ich
char *iColumnTitle;
mache
Mfg Ominion
-
Es funktioniert jetzt mit LPSTR, auch wenn ich es lieber mit char* gemacht hätte...thx@all für die Hilfe
Mfg Ominion
-
sry für den tripple-post, aber mir ist da gerade wieder eine frage eingefallen:
aus den Links konnte ich nicht entnehemen, wie man rauskriegt, wieviele Parameter übergeben werden. Derzeitig lasse ich die Anzahl noch als einen extra Parameter übergeben, was allerdings nicht die Endlösung sein soll. Ich hoffe ihr könnt mir dabei weiterhelfen.Mfg Ominion
-
kannst was dranhängen als endekennzeichen:
#include <stdio.h> #include <stdarg.h> void va_test (char *first, ...) { va_list params; char *str = first; va_start (params, first); while (str) { puts (str); str = va_arg (params, char*); } va_end (params); } void main() { va_test ("so", "kann", "man", "das", "machen", 0); }
-
Hmm, das funktioniert nicht (ich habe es schon probiert), da ich für die Berechnung der Größe (EDIT) vom Column (/EDIT) zum Beispiel die genaue anzahl brauche. Außerdem verstehe ich auch nicht wie das mit nem char funktionieren sollte...
Mfg Ominion
-
Ominion schrieb:
Derzeitig lasse ich die Anzahl noch als einen extra Parameter übergeben, was allerdings nicht die Endlösung sein soll. Ich hoffe ihr könnt mir dabei weiterhelfen.
Laut Standard: Gar nicht - das heißt du mußt deine eigene Methode entwickeln, um der Funktion die Anzahl und den Typ der übergebenen Parameter mitzuteilen (die gängigsten Lösungen sind ein fester Parameter oder ein Dummy-Element am Ende der Liste).
-
hmm...ok danke
Mfg Ominion