übergabe von funktion als parameter



  • Hi,
    bei mir meckert der compiler wenn ich eine funktion als paramter übergeben will und diese vorher in ein struct reingesteckt habe kann mir da jemand helfen denn eigentlich solte es funktionieren denn ohne den struct funktioniert es auch.

    ref struct ConnType
    {
    	String^ Name;
    	String^ Host;
    	String^ User;
    	String^ Password;
    	String^ Statement;
    	bool (*comparefunction)(String^ tablename); 
    	ConnType()
    	{
    		Name="";
    		Host="";
    		User="";
    		Password="";
    		Statement="";
    	};
    	ConnType(ConnType^ arg)
    	{
    		Name=String::Copy(arg->Name);
    		Host=String::Copy(arg->Host);
    		User=String::Copy(arg->User);
    		Password=String::Copy(arg->Password);
    		Statement=String::Copy(arg->Statement);			};
    };
    
    private: bool compareconfig(String^ tablename)
    	{
    	         //SetTextServer("geht");
    		return true;
    	}
    private: System::Void button1_Click(System::Object^  sender,System::EventArgs^  e) 
    	{
    		 ConnType^ connection=gcnew ConnType();
    		 connection->comparefunction= &Form1::compareconfig;
                       //hier meckert der compiler
             }
    

    befor jetzt jemand fragt warum ich das so umständlich in ein struct verpake das liegt daran das ich den struct als ein objekt an einen neuen thread übergebe der damit arbeiten soll und ich noch nicht rausgefunden habe wie man an einen neuen thread mehrere objekte übergeben kann ohne das man vom neuen thread aus wieder aus der mainclass irgend welche werte rausholen muss die dann umständlcih gesichert werden müssen.



  • comparefunction ist ein Funktionszeiger und kein Methodenzeiger.

    Abgesehen davon kann ich nur den üblichen Rat geben: C++/CLI ist für das was du machen willst völlig ungeeignet. Wenn du GUI Anwendungen auf Basis von .NET entwickeln willst, nimm C#. Wenn du C++ lernen willst, lern C++ (andere Sprache, hat nichts mit .NET zu tun).



  • ich würde ja gerne c# nehmen aber leider kann(bzw darf) ich das nicht nehmen weil sonst der rest das projekts der nicht meine sache ist auch umgeschrieben werden muss. In c# würde ich das auch nicht so machen aber mir bleibt leider keine wahl ...
    Gibt es in cli eine möglichkeit das ich den funktionszeiger in dem struct verwenden kann und ihn dan später erst zuweise ?



  • shion schrieb:

    ich würde ja gerne c# nehmen aber leider kann(bzw darf) ich das nicht nehmen weil sonst der rest das projekts der nicht meine sache ist auch umgeschrieben werden muss.

    Wenn der Rest des Projektes in C++/CLI ist, dann arbeitet das doch völlig problemlos mit C# zusammen, ist ja alles .NET!?



  • 2 Sachen:
    - in .NET arbeitet man eigentlich mit Delegates statt mit Funktionszeigern
    - soll deine Comparefunktion statisch sein oder nicht?

    @dot: Dann muss man aber 2 Projekte bauen, mit -- meines Wissens -- 2 Assemblies als Ergebnis.



  • Hallo Bashar,
    nein sie soll nicht statisch sein da ich verschiede funktionen gleichen typs habe die damit verwendet werden müssen,
    mit .net hab ich halt noch nicht wirklich arbeiten müssen konnt ich mich immer vor drücken 😉 nun muss ich aber gezwungener masen...
    gibt es ein kleines beispiel wie ich das mit delegates anstellen kann dann muss ich euch nicht weiter belästigen.



  • Shion schrieb:

    Hallo Bashar,
    nein sie soll nicht statisch sein da ich verschiede funktionen gleichen typs habe die damit verwendet werden müssen,

    Die Antwort versteh ich jetzt nicht. Ich glaube du hast eine andere Frage beantwortet als ich gestellt habe. Weißt du den Unterschied zwischen statischen und nichtstatischen Memberfunktionen? Bzw weißt du was es bewirkt, wenn eine Memberfunktion static ist?

    mit .net hab ich halt noch nicht wirklich arbeiten müssen konnt ich mich immer vor drücken 😉 nun muss ich aber gezwungener masen...
    gibt es ein kleines beispiel wie ich das mit delegates anstellen kann dann muss ich euch nicht weiter belästigen.

    So ungefähr vielleicht:

    using namespace System;
    
    ref class Bla {
    public:
        bool compare(String^ blub);
    }; 
    
    delegate bool CompareDelegate(String^ tableName);
    
    int main(array<System::String ^> ^args)
    {
        Bla blub, blab;
        CompareDelegate^ compareFunction = gcnew CompareDelegate(%blub, &Bla::compare); // falls Bla::compare static ist fällt das erste Argument weg
        bool result = compareFunction("Blubb");
        return 0;
    }
    


  • Danke so hat es funktioniert.

    Ja hab dich falsch verstanden bei der frage ^^ hab ich noch nicht drüber nachgedacht aber ich werd sie static machen da ich das strukt dann an einen thread geben will der die basis class nicht kennen soll.


Anmelden zum Antworten