Vergleichbares zu ParamArray (Visual Basic) in C++
-
Wie CStoll schon gesagt hat, geht das mit der
va_list
. Und wie er auch schon gesagt hat ist diese Methode nicht typsicher. Oder du nimmst, wie CStoll auch schon gesagt hat, variadic templates. Wenn du nicht weisst, was das ist, dann hier.
-
Gut... Ich versuche das gerade zu verstehn...
Habe es mal wie in dem Beispiel von jkljkl versucht und die FuncImpl auf meine Funktion übertragen... jedoch bekomme ich weiterhin die Fehlermeldung, dass meine Funktion "keine 4 Argumente" bzw. "keine 1 Argumente" akzeptiert...
-
jkljkl schrieb:
void Func(FuncType type, const char *fmt, ...);
Öhm, ich glaube, dass es vor den drei Punkten kein Komma braucht.
-
zeig's doch mal, vielleicht können wir dann bessere Diagnosen liefern.
In jkl's Beispiel hast du zwei Funktionen - Fun() nimmt eine variable Parameterliste (mindestens zwei Parameter) und verpackt die Eingaben in einen vector<>, FuncImpl() nimmt diesen vector<>.Das Problem mit diesem Ansatz ist allerdings, daß der Compiler keinerlei Kontrollen vornimmt, ob die übergebenen Parameter stimmen - und du kannst nicht feststellen, wie viele Parameter tatsächlich übergeben wurden (von daher ist die Abbruchbedingung der while-Schleife alles andere als zuverlässig).
-
Wenn die maximnale Anzahl der Parameter beschränkt ist (z.B. 10) wäre in dem Fall eventuell auch eine Funktion mit 10 Parametern mit Defaultwerten sinnvoll. Volständig sicher ist das immer noch nicht, aber schon viel besser als die
va_arg
-Geschichte.
-
#include "stdafx.h" #include <string> #include <iostream> #include <cstdarg> #include <string> #include <vector> using namespace System; using namespace std; using namespace System::Threading; using namespace System::Net; using namespace System::Net::Sockets; enum cmd{LOGIN, PNG}; ref class TCPManager { public: String^ server; Int32 port; TcpClient^ client; NetworkStream^ stream; TCPManager(){} TCPManager(String^ _server, Int32 _port, String^ message) : server(_server), port(_port) { } void connect( String^ server, Int32 port) { try { client = gcnew TcpClient( server,port ); stream = client->GetStream(); } catch ( ArgumentNullException^ e ) { Console::WriteLine( "ArgumentNullException: {0}", e ); } catch ( SocketException^ e ) { Console::WriteLine( "SocketException: {0}", e ); } } void sendCmd(cmd art, std::vector<String^> args) { switch(art) { case LOGIN: send("LOGIN|" + args[0] + "|" + args[1] + "|" + args[2]); break; case PNG: send("PNG"); break; default: break; } } void send(String^ message) { array<Byte>^data = Text::Encoding::ASCII->GetBytes( message+"\n\0" ); stream->Write( data, 0, data->Length ); Console::WriteLine( "Sent: {0}", message ); } //void connect() //{ // TcpClient^ client = gcnew TcpClient( server,port ); // cout << server << endl; // cout << port << endl; //} }; int main(array<System::String ^> ^args) { String^ UID; String^ SID; Console::WriteLine("UID eingeben:"); UID = "4321";//Console::ReadLine(); Console::WriteLine("SID eingeben:"); SID = "7cdfsgrv92a7e8eae233395a6fb2f";//Console::ReadLine(); TCPManager tcp; tcp.connect("1234", 80); tcp.sendCmd(LOGIN, UID, SID, "2"); tcp.sendCmd(PNG); Console::Read(); return 0; }
Sieht nicht sehr schön aus und ist auch noch nicht fertig... aber so in etwa hatte ich mir das vorgestellt...
-
Sag doch gleich, dass du C++/CLI programmierst. Zumindest in C# gibt es mit
param
genau das, was du suchst, da gibt es bestimmt auch eine Entsprechung in C++/CLI.
-
Das Ding sieht aber eher aus wie C++/CLI - hättest du etwas dagegen, wenn ich dich dorthin weiterleite?
-
ipsec schrieb:
Sag doch gleich, dass du C++/CLI programmierst. Zumindest in C# gibt es mit
param
genau das, was du suchst, da gibt es bestimmt auch eine Entsprechung in C++/CLI.tut mir leid
seit 2 tagen arbeite ich mich nun in C++ ein (was genau da was ist, kann ich noch nicht wirklich unterscheiden...) hab hier 2 dicke Bücher die ich parallel am lesen bin... Und ich bin froh, dass ich immerhin meistens das hinbekomme, was ich will ^^
@CStoll: Nein natürlich nicht!
-
Dieser Thread wurde von Moderator/in CStoll aus dem Forum C++ (auch C++0x) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Probier mal:
void sendCmd(cmd art, ... array<Object^>^ args) { // ... }
-
jkhjkhujk schrieb:
Probier mal:
void sendCmd(cmd art, ... array<Object^>^ args) { // ... }
Danke!! Funktioniert wunderbar...Nur würde mich jetzt gerne noch intressieren, was genau diese Zeile bewirkt...? (will nicht einfach C&P betreiben...)
-
Die ... sagen an, das es sich um eine variable Parameterliste handelt, die bitte in ein Array gepackt werden soll. Dabei sind die Elemente im Array vom Typ Object (dabei ist Object eine Oberklasse für alles, was es so gibt...) Sofern du aber ohnehin nur String als Parameter haben willst, wäre es vielleicht besser, wenn du anstatt Object lieber String schreibst. Dann kann man nicht versehentlich eine Zahl oder so übergeben.
Vielleicht funktioniert es aber auch nur mit Object. An dieser Stelle muss ich passen, da ich nur in C++ und nicht in C++/CLI programmiere.
Aber vielleicht willst du ja auch Zahlen, etc. übergeben. Dann kannst du es einfach so lassen und es sollte funktionieren, wobei du natürlich von Object wieder nach String oder was auch immer casten musst.
-
Wunderbar
danke für die Erklärung! Unklar waren mir eigentlich nur die "..."
Aus dem Object^ hatte ich schon ein String^ gemacht
funktioniert genauso gut!
lg
-