Problem mit List<KeyValuePair<unsigned long, Byte>>



  • Hallo, ich komme anscheinend nicht so ganz klar mit der Klasse KeyValuePair.
    Und zwar bekomme ich immer folgende Fehlermeldung, wenn ich den nachfolgenden Code kompilieren möchte. Vielleicht könnt ihr mir helfen was ich abändern muss.

    error C2440: '=': 'System::Collections::Generic::KeyValuePair<TKey,TValue> ^' kann nicht in 'System::Collections::Generic::KeyValuePair<TKey,TValue>' konvertiert werden

    public: bool GetADCValues(..., List<KeyValuePair<unsigned long, Byte>> Values)
    					{
    KeyValuePair<unsigned long, Byte> kvp; //Hier steht jeweils der Errorcode und der Wert drin
    
    //Mache was
    
    for(int i = 0; i<loopsize ; i++)
    {
      if(i%ValSize == 0) //Wert generiert und eintragen
    	{
    	//Hier FEHLER
    		kvp = gcnew KeyValuePair<unsigned long, Byte>(value, 0);
    		Values.Add(kvp);
    		value = 0;
    	}
    	else
    	{
    		//Mache sonst den anderen Kram
    	}				
    }					
    
    return true; //erfolgreich durchgeführt
    }
    


  • Die Fehlermeldung sagt es doch.

    Für gcnew mit der Typ ein ^ sein, ist er aber nicht.



  • Ahh danke, aber nun bekomme ich genau an

    Values.Add(kvp)
    

    die Fehlermeldung irgendwie bin ich gerade ein wenig Verwirrt wenn man den halben Tag davor sitzt 😮

    error C2664: 'System::Collections::Generic::List<T>::Add': Konvertierung des Parameters 1 von 'System::Collections::Generic::KeyValuePair<TKey,TValue> ^' in 'System::Collections::Generic::KeyValuePair<TKey,TValue>' nicht möglich



  • public: bool GetADCValues(..., List<KeyValuePair<unsigned long, Byte>^> Values)
                        {
    KeyValuePair<unsigned long, Byte> ^kvp; //Hier steht jeweils der Errorcode und der Wert drin
    
    //Mache was
    
    for(int i = 0; i<loopsize ; i++)
    {
      if(i%ValSize == 0) //Wert generiert und eintragen
        {
        //Hier FEHLER
            kvp = gcnew KeyValuePair<unsigned long, Byte>(value, 0);
            Values.Add(kvp);
            value = 0;
        }
        else
        {
            //Mache sonst den anderen Kram
        }               
    }                   
    
    return true; //erfolgreich durchgeführt
    }
    


  • Danke für das Beispiel, genau das selbe hatte ich am Anfang auch.
    Nur springt der in den Kopf der Methode und da bekommt man als Fehlermeldung:

    error C3225: Das generische typ argument für 'T' kann nicht 'System::Collections::Generic::KeyValuePair ^', sein, es muss ein Werttyp oder ein Handle für ein Verweistyp sein.



  • Sry, mein Fehler. C++/CLI ist dann doch zu lange her O🤡 Versuch mal beim Add zu dereferenzieren. Die genaue Erläuterung mag aber jemand machen der im Moment in der Materie schwebt 🤡

    Values.Add(*kvp);
    

    oder

    liste.Add( KeyValuePair<int,int>(109,10));
    


  • Danke 🙂 geht mir nicht anders 😛 Bei mir ist es schon 3 Jahre her ansonsten habe ich immer Ansi C gecodet. Das ist schon an solchen Stellen ein ganz schöner Umstieg:

    [l]Values.Add(*kvp); [/l]

    Damit kompiliert der 😃
    Zum Abschluss eine Frage. Die Instanzen kvp bleiben in der Liste alle erhalten wenn ich die Methode aufrufe und eine Liste übergebe in der kvp geadded wird?

    Nicht das ich in der Liste keine brauchbaren Daten habe, wenn die Methode durchgelaufen ist 😛

    [l]List<KeyValuePair<unsigned long, Byte>^> Values)[/l]



  • Hmm.... ich bin wirklich schwer eingerostet :o( Bei letzter Variante wird die Variable temporär für die Zeit des Methodenaufrufs generiert. Soweit ich mich entsinne müsste das eigentlich quatsch sein was ich da geschrieben habe weil die Lebenszeit der Variable nach dem Methodenaufruf undefiniert ist.



  • So wie ich das in Erinnerung habe werden von Instanzen so keine Kopien erzeugt.
    Deswegen bin ich mir an der Stelle unsicher, ob die Daten erhalten bleiben. Ich werde das mal bei Gelegenheit ausprobieren. Aber vielleicht meldet sich jemand anderes noch diesbezüglich.

    Trotzdem Danke erstmal für deine Hinweise! 👍



  • Müsste sich aber auch in der C++ Bibel finden lassen 🤡



  • Knuddlbaer schrieb:

    public: bool GetADCValues(..., List<KeyValuePair<unsigned long, Byte>^> Values)
                        {
    KeyValuePair<unsigned long, Byte> ^kvp; //Hier steht jeweils der Errorcode und der Wert drin
           
    //Mache was
    
    for(int i = 0; i<loopsize ; i++)
    {
      if(i%ValSize == 0) //Wert generiert und eintragen
        {
        //Hier FEHLER
            kvp = gcnew KeyValuePair<unsigned long, Byte>(value, 0);
            Values.Add(kvp);
            value = 0;
        }
        else
        {
            //Mache sonst den anderen Kram
        }               
    }                   
    
    return true; //erfolgreich durchgeführt
    }
    

    Homo



  • Mal ne Frage, warum nutzt du nicht gleich Dictionary statt List?

    System::Collections::Generic::Dictionary

    GRuß Solick



  • Hmm weil ich die voher noch nicht kannte. Worin liegt denn der Vorteil einer Dict.. List gegenüber einer List<T>?



  • Key und Value sind direkt implementiert und Du greifst direkt über ->Key bzw. ->Value zu. Allerdings sind die Werte nicht editierbar, Du musst dann den kompletten Eintrag löschen und neu anlegen wenn Du die ID ändern willst.

    System::Collections::Generic::Dictionary<Int,String ^> ^dic1 = gcnew Dictionary<int,String ^>();
    
    dic1->Add(1,"Alpha");
    dic1->ADD(2,"Beta");
    
    for each(KeyValuePair ^pair in dic1)
    {
       Console::Writeline("Key: " + pair->key + " / Value: " + pair->Value);
    }
    

    Gruß Solick


Anmelden zum Antworten