Matrix initalisieren



  • Edit: Quatsch, der Datentyp fehlt.



  • hmm,

    also ich habe das wie folgt gemacht:

    in der Header:

    private:
    	CPaintDlg m_dlgPaint;
    	long PosMatrix[Y][X][3];
    

    Demnach kennt die KLasse ja schon diese Variable.

    in der cpp:

    CPositionDlg::CPositionDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CPositionDlg::IDD, pParent)
    	, m_iXPos(0)
    	, m_iYPos(0)
    	, m_strAP1(_T("WLAN_Weber"))
    	, m_strAP2(_T("intern"))
    	, m_strAP3(_T("poldi"))
    	, m_RSSIAP1(0)
    	, m_RSSIAP2(0)
    	, m_RSSIAP3(0)
    	, m_sBitmap(_T(""))
    	, m_dlgPaint(0)
    {
    	PosMatrix[Y][X][3] = {
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }
    	};
    }
    

    Hier wollte ich die Matrix mit Werten füllen.
    das ist doch gar nicht in der Parameterliste, sondern im Konstruktor der Klasse.
    Wo kann ich denn die Matrix sonst initalisieren? Es macht doch eigentlich nur an dieser Stelle sinn (habe ich jedenfalls bis jetzt immer gedacht)



  • ÄÄÄh, tja.. seh ich auch so, keine Ahnung.

    Edit: Vermutlich zu kompliziert für den Compiler.



  • Was du vor hast geht leider nicht



  • Warum geht das nicht 😕



  • proggingmania schrieb:

    Warum geht das nicht 😕

    Weil man so ein Array entweder mit der Initialisierungsliste initialisiert oder
    aber die Elemente ganz normal zuweisen muss.

    gruss
    v R



  • wenn ich das Array direkt so initalisiere mit Angabe des Types geht es so.
    Aber dann habe ich nix davon, weil es keine Memebervariable der Klasse ist

    Andere Lösung wäre evtl nur einen Pointer auf diese Matrix als Membervariable und die Matrix extern definieren.

    Aber ich warte noch ein wneig ab. Vlt hat noch jmd einen Geistesblitz 🙂 Meine machen sich grade sehr rar.



  • Axoh, dann also mit Schleifchen drumrum, sieht ja auch besser aus.

    for ( int i = 0; i < 5; i++ )
        {
    			for ( int j = 0; j < 5; j++ )
    			{
    				for ( int k = 0; k < 3; k++ )
    				{
    					PosMatrix[i][j][k] = k+1;
    				}
    			}
    	}
    

    🙂



  • das geht ja leider nicht, da später (falls es mal funktionieren sollte) die Werte alle unterschiedlich sein werden.

    Als Hintergrund: Es wird eine bestimmte Kombination von 3 Werten in de Matrix gesucht, um daraus einen X/Y zu bekommen, der dann weiterverarbeitet wird.
    Demnach wird kein Element dem anderen gleichen. die 1,2,3 waren nur ein Bsp, um zu testen ob die Initalisierung funktioniert (was es leider nicht tut)



  • In welcher Form liegen dir die Daten denn vor?



  • Mit den for-Schleifen kannst du die Initialisierung so machen, das funzt.
    Den Rest was du vorhast raff ich nicht.

    Edit: Achso na dann pack doch die Suche nach einem Koordinatenwert auch in Schleifen ein 😉



  • So jetzt ab in die Sonne, Mädels gucken... tschau. 🕶



  • Die Daten werden zuerst "hart" einprogrammiert, um meine Methoden zu testen.

    Später werden die Daten über eine "Teachingmethode" eingelesen: Also eine X/Y Position mit Mauszeiger und Klick ergibt dann eine Kombination der drei Werte.
    Aber das kommt später.

    Zuerst werde ich die drei Werte fest messen, für jede beliebige x/y Position und für die Testphase direkt in den Code einfügen.
    EDIT:

    hab jetzt folgendes getestet:
    als membervariable:

    long *PosMatrixPtr[Y];
    

    als code im Konstruktor:

    long PosMatrix[Y][X][3] = {
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }
    	};
    
    	for(int i=0; i<Y; i++)
    		PosMatrixPtr[i] = PosMatrix[i];
    

    Aber leider bekomme ich wieder einen Fehler:+

    error C2440: '=': 'long [5][3]' kann nicht in 'long *' konvertiert werden

    Ich glaube ich gehe jetzt auch mal in die Sonne.....



  • Wieso hat deine Membervariable nur zwei Dimensionen? und wo holst du dir den Speicher für den Zeiger? Und wieso überhaupt ein Zeiger, wenn es doch ein Feld fester Größe ist?

    Wie wäre es, wenn der Member auch einfach

    long PosMatrixMember[Y][X][3];
    

    wäre?

    und dann

    for (int y=0; y<5; ++y)
       for (int x=0; x<5; ++x)
          for (int i=0; i<3; ++i)
             PosMatrixMember[y][x][i] = PosMatrix[y][x][i];
    


  • Wozu benutzt du eigentlich diese seltsame Matrix. Die Werte wiederholen sich ja eh andauernd und anstatt die Matrix dann zu benutzen, könntest du ja an die entsprechende Stelle eine Berechnung einbauen, wo eigentlich das Array stehen sollte.

    Oder in deinem Konstruktor eine statische Array initialisieren und es dann dem Member zuweisen:

    class TT {
        private:
                long matrix[5][6][6];
        public:
                TT()
                {
                     static long zwMatrix[5][6][6] = { /* init */ }
                     matrix = zwMatrix;
                }
    };
    

    Wenn die Matrix aber ehe bei jedem Objekt gleich ist dann direkt so:

    class TT {
        private:
                static long matrix[5][6][6];
        public:
    };
    
    long TT::matrix[5][6][6] = { /* init */ }
    


  • KasF schrieb:

    class TT {
        private:
                long matrix[5][6][6];
        public:
                TT()
                {
                     static long zwMatrix[5][6][6] = { /* init */ }
                     matrix = zwMatrix;
                }
    };
    

    --> Fehler:

    error C2106: '=': Linker Operand muss ein L-Wert sein

    KasF schrieb:

    class TT {
        private:
                static long matrix[5][6][6];
        public:
    };
    
    long TT::matrix[5][6][6] = { /* init */ }
    

    -->

    class CPositionDlg : public CDialog
    {
    .....
    ....
    	CBitmap m_bmpBitmap;
    private:
    	CPaintDlg m_dlgPaint;
    	static long PosMatrix[Y][X][3];
    
    	void getPosFingerPrint(long value1, long value2, long value3);
    };
    long CPositionDlg::matrix[Y][X][3] = {
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }
    	};
    

    --> AUch einen Fehler:

    fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    error LNK2005: "private: static long (* CPositionDlg::PosMatrix)[5][3]" (?PosMatrix@CPositionDlg@@0PAY142JA) ist bereits in MFC_TestDlg.obj definiert.

    Und die Werte in der Matrix werden nicht gleich sein, die sind NUR hier in dem Beispiel gleich.
    Für jede X/Y Position wird es NUR eine Kombination von 3 Zahlen geben.

    @ Helium:

    Das hat ja vorher schon nicht funktioniert. Deshalb die Lösung mit dem Zeiger auf die Matrix (welche aber auch nicht funktioniert)



  • EDIT:

    debug Ordner löschen hilft 🙂

    Problem gelöst. Vielen Dank an alle.



  • LosWebos schrieb:

    KasF schrieb:

    class TT {
        private:
                static long matrix[5][6][6];
        public:
    };
    
    long TT::matrix[5][6][6] = { /* init */ }
    

    -->

    class CPositionDlg : public CDialog
    {
    .....
    ....
    	CBitmap m_bmpBitmap;
    private:
    	CPaintDlg m_dlgPaint;
    	static long PosMatrix[Y][X][3];
    
    	void getPosFingerPrint(long value1, long value2, long value3);
    };
    long CPositionDlg::matrix[Y][X][3] = {
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} },
    		{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }
    	};
    

    --> AUch einen Fehler:

    fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
    error LNK2005: "private: static long (* CPositionDlg::PosMatrix)[5][3]" (?PosMatrix@CPositionDlg@@0PAY142JA) ist bereits in MFC_TestDlg.obj definiert.

    Ist ja auch klar, wenn du die Definition mit in den Header packst.

    @ Helium:

    Das hat ja vorher schon nicht funktioniert. Deshalb die Lösung mit dem Zeiger auf die Matrix (welche aber auch nicht funktioniert)

    Hmm, also bei mir macht er das ohne zu murren:

    const int X = 5;
    const int Y = 5;
    
    class Matrix {
    private:
    	long PosMatrixMember[Y][X][3];
    
    public:
    	Matrix () {
    		static long PosMatrix[Y][X][3] = { 
    			{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }, 
    			{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }, 
    			{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }, 
    			{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} }, 
    			{ {1,2,3},{1,2,3},{1,2,3},{1,2,3},{1,2,3} } 
    		};
    
    		for (int y=0; y<5; ++y)
    				for (int x=0; x<5; ++x)
    					for (int i=0; i<3; ++i)
    						PosMatrixMember[y][x][i] = PosMatrix[y][x][i];
    
    	}
    
    };
    
    int main ()
    {
    	Matrix matrix;
    }
    


  • Ehm, das mit static und dann einfach im CTor zuweisen, war Mist 🙂 Klappt doch wohl nur bei eindimensionalen so einfach.

    Denk aber daran, dass du mit dem static Member, EIN Array für alle Objekte deiner Klasse hast.



  • ich habe jetzt die 2te Variante gewählt.

    Die frage ist nun wie ich darauf zugreife:

    for( int i=0; i<Y; i++ )
    	{
    		for( int j=0; j<X; j++ )
    		{
    			if( value1 == PosMatrix[Y][X][0] && value2 == PosMatrix[Y][X][1] && value3 == PosMatrix[Y][X][2])
    			{
    				m_iXPos = X;
    				m_iYPos = Y;
    			}
    			else
    			{
    				m_iXPos = -1;
    				m_iYPos = -1;
    			}
    
    		}
    	}
    

    Ich möchte halt die 3 Werte value 1-3 mit dem Inhalt der Matrix vergleichen.
    Leider weiß ich nun nicht genau wie das geht.
    Der obengenannte Code funktioniert nicht so wie ich möchte 😞

    Wie kann ich nun auf den Inhalt des Array an der bestimmten Stelle in der Matrix zugreifen und diese 3 Werte mit meinen anderen 3 Werten vergleichen?


Anmelden zum Antworten