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



  • 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