Einträge einer Liste innerhalb eines mehrdimensionalen Arrays ansprechen



  • Hi Freunde,
    ich arbeite an einem Programm, dass die Daten einer Messung verarbeitet. Dabei werden zwei verschiedene Datensätze aufgenommen. Hierfür habe ich mir einen zweidimensionalen array erzeugt, der double Listen aufnimmt:

    m_Data = gcnew array<List<double> ^,2>(m_NumberOfSpecs, 2);
    
    for(int k = 0; k <= m_Data->GetUpperBound(0); k++)
    {
    	for(int i = 0; i <= m_Data->GetUpperBound(1); i++)
    	{
    		m_Data[k,i] = gcnew List<double>();				
    	}
    }
    

    Soweit kein Problem. Jetzt muss ich alle Einträge innerhalb einer Dimension umklappen. Doch hierbei brauche ich zugriff auf die Listeneinträge über deren Index. Und hierbei bekomme ich immer die Fehlermeldung:

    Fehler 11 error C2677: Binärer Operator '-': Es konnte kein globaler Operator gefunden werden, der den Typ 'System::Collections::Generic::List<T>' akzeptiert (oder keine geeignete Konvertierung möglich) f:\Eigene Dateien\Programmieren\C++\MyProgs\FPROM_Ctrl_Multi\RoEncCtrl\Data.cpp 100

    Hier Mein Code dazu:

    for(int k = 0; k <= m_Data->GetUpperBound(0); k++)
    {
    	for(int i = 0; i < m_Data[k,BEAM]->Count; i++)
    	{
    		m_Data[k,BEAM][i] = m_MaxValues[k] - m_Data[k,BEAM][i];
    	}
    }
    

    Wäre super, wenn mir jemand erklären könnte warum es nicht funktioniert bzw. wie ich über die Indizes auf die Elemente der Listen zugreifen kann.

    Danke schon mal
    Grüße cpu



  • Keine Ahnung warum der Fehler kommt. Aber lösen kannst Du das indem Du eben mehr Schritte einbaust. Z.B. zuerst List<double>^ rausholen, dann mit Index zugreifen.

    Simon



  • Hi theta und danke für die Antwort.

    also hab es momentan so gelöst:

    List<double> ^tempData = gcnew List<double>();
    
    for(int k = 0; k <= m_Data->GetUpperBound(0); k++)
    {
    	tempData = m_Data[k, BEAM];
    	for(int i = 0; i < m_Data[k,BEAM]->Count; i++)
    	{
    		tempData[i] = m_MaxValues[k] - tempData[i];
    	}
    	m_Data[k,BEAM] = tempData;
    }
    

    Aber falls jemandem noch einfällt, wie ich die Einträge direkt ansprechen kann, wär ich für nen Tip dankbar. Auch rein interessehalber. Denke mal das geht bestimmt irgendwie.

    Gruß cpu



  • //List<double> ^tempData = gcnew List<double>();
    // 1. Dir reicht eine Ref., d.h. gcnew ist nicht nötig!
    // 2. So lokal wie möglich: siehe unten..
    
    for(int k = 0; k <= m_Data->GetUpperBound(0); k++) 
    { 
        List<double> ^tempData = m_Data[k, BEAM]; // Hier Ref. rausholen!
        for(int i = 0; i < m_Data[k,BEAM]->Count; i++) 
        { 
            tempData[i] = m_MaxValues[k] - tempData[i]; 
        } 
        //m_Data[k,BEAM] = tempData; 
        // 3. List<double> ist ein Reference Type, Du es wird das aktuelle Element bearbeitet, keine Kopie, desshalb ist "zurückspeichern" unnötig!
    }
    

    Aber falls jemandem noch einfällt, wie ich die Einträge direkt ansprechen kann, wär ich für nen Tip dankbar. Auch rein interessehalber. Denke mal das geht bestimmt irgendwie.

    Mir fällt nur noch ein, dass Du Abstraktionen nutzen solltest. Definiere Typen (Klassen) welche dienlich sind. Bei Dir sind im Moment einfach "rohe" Datenstrukturen verwendet und "sagen" nicht aus, was damit erreicht werden soll.
    Dann entfällt auch das Problem mit den Index Zugriffen.. 🙂
    Simon



  • Hi theta,
    danke für den Tip mit den Referenzen, hab das total verpennt. Wollte nur nochmal kundtun, wie ich das Programm abgeändert habe.
    Habe mir eine eigene Klasse für die Daten erstellt:

    #pragma once
    
    using System::Collections::Generic::List;
    
    ref class CData
    {
    private:
    	// Membervariables
    	array<List<double>^>    ^m_BeamData;
    	array<List<double>^>    ^m_ClockSignal;
    	int                      m_NumberOfSpecs; // Anzahl Listen in BeamData
    	List<int>               ^m_MaxValues;     // Höchster Wert in Liste
    	List<int>               ^m_Counts;        // Anzahl Messwerte in Liste
    
    	// Methods
    	bool Init        ();
    	bool GetDataMax  ();
    
    public:
    	// Methods
    	CData            (void);
    	CData            (int NumbOfSpecs);
    	bool Clear       ();
    	bool FlipData    ();                                    
    	bool SeperateData();
    	bool FilterData  ();
    
    	// Properties
    	property int NumberOfSpecs                { int get(); }
    	property List<int> ^MaxValues             { List<int> ^get(); }
    	property List<int> ^Counts                { List<int> ^get(); }
    	property array<List<double>^> ^BeamData   { array<List<double>^> ^get(); }
    	property array<List<double>^> ^ClockSignal{ array<List<double>^> ^get(); }
    };
    

    damit fahre ich wahrscheinlich besser als das in einen zweidimensionalen Array zu packen. Jetzt entfällt auch, wie du schon gesagt hast, der Aufwandt sich immer zuerst die Referenz auf die jeweilige Liste zu holen. Danke nochmal.
    Gruß cpu


Log in to reply