Vergleichbares zu ParamArray (Visual Basic) in C++



  • 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




Anmelden zum Antworten