Matrix initalisieren



  • Hallo,

    ich habe folgendes Problem:

    ich brauche eine 5*5 Matrix, die als Werte jeweils eine long Array von 3 Elementen hat.

    Leider funktioniert folgende Initalisierung im Konstruktor einer Klasse nicht:

    PosMatrix[Y][X] = {
    		{ (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) }
    	};
    

    Definiert habe ich die Matrix als private Variable wie folgt:

    long *PosMatrix[Y][X];
    

    Die Zahlen sind jetzt nur als Beispiel, es werden später ganz unterschiedliche Werte eingesetzt.

    Vielen Dank im Voraus für Eure Hilfe.

    Gruß LosWebos



  • LosWebos schrieb:

    Hallo,
    ich brauche eine 5*5 Matrix, die als Werte jeweils eine long Array von 3 Elementen hat.

    long array[5][5][3];
    


  • Vertexwahn schrieb:

    long array[5][5][3];
    

    👍



  • vielen Dank,

    leider funktioniert das initalisieren der Matrix noch nicht:

    Habe auch mal folgendes getestet:

    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} }
    	};
    

    ich bekomme folgende Fehler (mehrfach):

    error C2059: Syntaxfehler: '{'
    error C2143: Syntaxfehler: Es fehlt ';' vor '{'
    error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    error C2447: '{': Funktionskopf fehlt - Parameterliste im alten Stil?

    Irgendwie verstehe ich das ganze nicht so ganz, warum das Fehler verursacht 😞



  • Hallo,

    du musst das Array schon initialisieren. In der expliziten Definition kannst du
    die Initialisierungsliste nicht verwenden.

    gruss
    v R



  • 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 */ }
    

Anmelden zum Antworten