Mehrdimensionales Array



  • in einer klasse kannst du arrays nicht einfach so initialisieren!

    Mach dir doch dafür eine extra-funktion in der klasse!

    übrigens kannst du das keyboard aber auf einmal initialisieren:

    int keyboard[2][2] = {{/*erstes Array*/ 1,2},{/*zweites Array*/ 3,4}};
    


  • Mein Quelltext begrenzt auf zwei Dimensionen mit Größe 2:

    Header-File:

    class KeyTable {
    
    	public:
    		KeyTable();
                void getLayout(int givenchar, int *left, int *top, int *color, int *form, int *modifier);
    
    	private:
    		int keyboardArray[2][2];
    		QHash<QChar, int> keyboardHash;
    		void arrayInit();
    		void hashInit();
    };
    

    CPP-File:

    #include <QtGui>
    
    #include "keytable.h"
    
    // Konstruktor
    KeyTable::KeyTable() {
        arrayInit();
        hashInit();
    }
    
    void KeyTable::getLayout(int givenchar, int *left, int *top, int *color, int *form, int *modifier) {
    	// Char ueber Hash in Index des Arrays (int) wandeln
    	int arrayIndex = keyboardHash[givenchar];
    	// Int ueber Array in Eigenschaften wandeln und Signal senden
    	*left = keyboardArray[arrayIndex][0];
    	*top = keyboardArray[arrayIndex][1];
    }
    
    void KeyTable::arrayInit() {
           //***************************************************
           //Das funktioniert:
    	keyboardArray[0][0] = 1;
    	keyboardArray[0][1] = 2;
           //***************************************************
            //Das nicht:
           keyboardArray[1] = {3,4};
           //***************************************************
    }
    
    void KeyTable::hashInit() {
    	int i;
    	for (i = 0; i < 2; i++) {
    		keyboardHash[keyboardArray[i][0]] = i;
    	}
    }
    

    DANKE



  • Gratuliere, Du hast korrekt erkannt dass das in C++ nicht geht.



  • Danke, aber was gibt es noch für Alternativen um z.B. folgendes Array formschön (Diplomarbeit..) in einer Klasse zu erstellen und die Eintrage über eine Funktion abzufragen?

    keyboardArray[1] = {'b', 250, 120, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[2] = {'c', 170, 120, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[3] = {'d', 150, 80, BLUE, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[4] = {'e', 140, 40, BLUE, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[5] = {'f', 190, 80, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[6] = {'g', 230, 80, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[7] = {'h', 270, 80, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[8] = {'i', 340, 40, GREEN, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[9] = {'j', 310, 80, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[10] = {'k', 350, 80, BLUE, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[11] = {'l', 390, 80, YELLOW, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[12] = {'m', 330, 120, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[13] = {'n', 290, 120, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[14] = {'o', 380, 40, GREEN, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[15] = {'p', 420, 40, YELLOW, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[16] = {'q', 60, 40, YELLOW, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[17] = {'r', 180, 40, BLUE, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[18] = {'s', 110, 80, GREEN, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[19] = {'t', 220, 40, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[20] = {'u', 300, 40, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[21] = {'v', 210, 120, RED, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[22] = {'w', 100, 40, GREEN, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[23] = {'x', 130, 120, BLUE, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[24] = {'y', 90, 120, GREEN, FORM_NORM, MODIFIER_NONE};
    	keyboardArray[25] = {'z', 260, 40, RED, FORM_NORM, MODIFIER_NONE};
    

    Danke!



  • ..vielleicht gehts auch einfacher, aber wie wärs mit folgendem

    class key_array
    {
    privat:
        int _array[6];
    public:
        int fill_array( int array[6] ) {
            _array[6] = array[6];
        }
    }
    
    //und dann im header weiter
    
    key_array keyboard_array[27];
    
    //in der implementierung dann
    
    keyboardArray[0].fill_array( array = {'a', 70, 80, YELLOW, FORM_NORM, MODIFIER_NONE} );
    keyboardArray[1].fill_array( array = {'b', 250, 120, RED, FORM_NORM, MODIFIER_NONE} );
    

    habs jetzt nicht getestet..
    kann man den operator '{}' eintech auch überladen wie '[]'???
    nur mal so ausm bauchraus gefragt: formschöner, weil oop ??



  • ..sorry sollte wohl so heissen:

    keyboardArray[0].fill_array([b]int[/b] array = {'a', 70, 80, YELLOW, FORM_NORM, MODIFIER_NONE} );
    


  • das ist eine feine möglichkeit, danke rized01!
    ich brauche das ganze für meine diplomarbeit und möchte vermeiden, eine liste mit lauter indizes zu erstellen. wenn ich dann etwas ändern möchte muss ich auch alle indizes ändern, zudem muss das ganze auch dokumentiert und gedruckt werden. da soll es sauber aussehen und nicht tausend zeilen besitzen.

    danke nochmal allen.



  • btw: die letzten beiden einträge (FORM_NORM, MODIFIER_NONE) änderst Du gar nie, wozu dann??

    -----
    wiederhole nie etwas mehr als 5mal



  • hmmm.weis zwar nicht was Du brauchst, (was bedeuten die 40 80 120, und die farb-parameter??) aber mindestens einmal wirst du die liste wohl schreiben müsssen, oder?
    wie wärs mit einer externen tabelle, woraus du dann mittels des buchstabens ausliest??



  • Danke für eure Anworten.

    Allgemein
    In der Liste stehen Koordinaten von Tasten (die zwei Zahlen), eine Farbe, eine Tastenform und eine Kennung für evtl. Modifier (Shift, Ctrl etc.).
    Die Einträge FORM_NORM und MODIFIER_NONE ändern sich schon noch, die Liste wird noch länger.

    Die Initialisierung
    Das mit der externen Tabelle habe ich mir auch schon überlegt, aber eigentlich ist das Array komplett fix, daher möchte ich es einmal intern, ohne DB-Anbindung, initialisieren und dann nur noch auslesen. Meine erste Frage diente daher nur der "schönen übersichtlichen Initialisierung" des Arrays.

    Die Verwendung
    Das Auslesen muss oft geschehen. Daher dachte ich mir, es macht Sinn, da ich ein Char bekomme und dazu die entspr. Eigenschaften auslesen möchte, zuerst über eine schnelle Hash-Tabelle den Index des Array zu bekommen. Und dann musss ich nur (das sollte dann ja nicht mehr viel rechenzeit benötigen) die entsprechende Stelle im Array auslesen.
    Die Hastablle kann ich leicht aus dem Array erstellen:

    void KeyTable::hashInit() {
        int i;
        for (i = 0; i < 48; i++) {
            keyboardHash[keyboardArray[i][0]] = i;
        }
    }
    

    **Haltet ihr das insgesamt für eine gute Möglichkeit bzw. für einen guten Weg?

    Danke!**


Anmelden zum Antworten