Mehrdimensionales Array



  • Hallo,

    ich möchte in einem header-File ein zweidimensionales Array initialisieren und anschliessend in einer Funktion mit Werten füllen und zwar am liebsten über die Methode mit geschweiften Klammern, da es relativ viele sind und ich so die Übersicht behalten kann.

    Im Header:
    int keyboardArray[27][6];

    In der Funktion:
    keyboardArray[0] = {'a', 70, 80, YELLOW, FORM_NORM, MODIFIER_NONE};
    keyboardArray[1] = {'b', 250, 120, RED, FORM_NORM, MODIFIER_NONE};

    Fehlermeldungen:
    keytable.cpp: In member function void KeyTable::arrayInit()': keytable.cpp:37: error: expected primary-expression before '{' token keytable.cpp:37: error: expected;' before '{' token
    keytable.cpp:38: error: expected primary-expression before '{' token
    keytable.cpp:38: error: expected `;' before '{' token

    Wenn mir jmd helfen könnte, dann wär das super!

    Danke,
    Tom



  • was hast du vor?



  • wilderindianer schrieb:

    Hallo,

    ich möchte in einem header-File ein zweidimensionales Array initialisieren und anschliessend in einer Funktion mit Werten füllen und zwar am liebsten über die Methode mit geschweiften Klammern, da es relativ viele sind und ich so die Übersicht behalten kann.

    Im Header:
    int keyboardArray[27][6];

    In der Funktion:
    keyboardArray[0] = {'a', 70, 80, YELLOW, FORM_NORM, MODIFIER_NONE};
    keyboardArray[1] = {'b', 250, 120, RED, FORM_NORM, MODIFIER_NONE};

    Fehlermeldungen:
    keytable.cpp: In member function void KeyTable::arrayInit()': keytable.cpp:37: error: expected primary-expression before '{' token keytable.cpp:37: error: expected;' before '{' token
    keytable.cpp:38: error: expected primary-expression before '{' token
    keytable.cpp:38: error: expected `;' before '{' token

    Wenn mir jmd helfen könnte, dann wär das super!

    Danke,
    Tom

    int array[4][4];
    array[0][0]=1;
    array[0][1]=2;
    


  • Das Array soll Buchstabe, Koordinaten und andere Eigenschaften speichern, damit ich diese schnell auslesen kann.
    Ich würde das Array aber, wie gesagt, gerne mit der Methode der geschweiften Klammern erstellen, da die Liste (im Beispiel nur zweimal gefüllt) ziemlich lang ist und so die Übersicht bewahrt wäre.
    Mit
    int array[4][4];
    array[0][0]=1;
    array[0][1]=2;
    ..
    wäre die Liste viel viel länger.
    Ich hätte gerne nur eine Zeile Code pro erste Dimension.

    Danke für etwaige Hilfe!



  • da ist ein array wohl das falsche..da kannst daten des gleichen typs speichern!
    nciht verschiedene!

    Mach dir doch nen struct:

    enum ccolor{cRED,cYELLOW,cGREEN};
    enum modifier{MODIFIER_NONE,MODIFIER_SINGLE};
    enum form{FORM_NONE,FORM_SINGLE};
    struct AttrCollector
    {
      AttrCollector(string methode,int status1,int status2,ccolor Color,modifier Modifier,form Form)
      {
      m_methode = methode;
      m_status1 = status1;
      m_status2 = status2;
      m_Color = Color;
      m_Modifier = Modifier;
      m_Form = Form;
      }
      string m_methode;
      int m_status1;
      int m_status2;
    
      ccolor m_Color;
      modifier m_Modifier;
      form m_Form;
    
     void PrintAttributes()
     {
      cout<<"Methode: "<<m_methode<<endl;
      cout<<"Status 1: "<<m_status1<<endl;
      cout<<"Status 2: "<<m_status2<<endl;
      cout<<"Farbe: "<<m_Color<<endl;  //natürlich der Zahlenwert
      cout<<"Modifizierer: "<<m_Modifier<<endl; //selbe
      cout<<"Form: "<<m_Form<<endl; //selbe
     }
    };
    

    aufurfen und benutzen kannst das ganze dann so:

    AttrCollector Collection("a",40,30,cRED,MODIFIER_NONE,FORM_SINGLE);
    


  • Vielen Dank ser1al für die Antwort.
    Das ist eine gute Lösung, aber eigentlich überflüssig bei mir. Ein Array würde mir reichen, denn alle Daten haben den gleichen Typ. Das Char wird doch auch in einen Wert gewandelt. Und selbst wenn nicht, dass ist hier nicht meine Problem, leider. Können wir auch eine Zahl hinschreiben statt einem Buchstaben.

    Die Aufgabe/Idee:
    Ich möchte gerne über eine Hashtabelle ein Char in einen (selbst festgelegten) int-Wert wandeln, was wiederum der Index meines Arrays ist, wo die Eigenschaften zu dem Char drinstehen. Hash ist schnell und mein statisches Array hält die eigentlichen Daten.

    Die Frage:
    Gibt es denn nicht die Möglichkeit, ein Array zu initialisieren und annschließend über geschweifte Klammern zu füllen???
    Also so:

    int keyboardArray[2][2]; 
    keyboardArray[0] = {1, 2};
    keyboardArray[1] = {3, 4};
    

    Danke!



  • doch:

    int array[2][3] = {{1,2,3},{10,20,30}};
    cout<<array[1][2]<<endl;  //gibt 30 aus...
    


  • aber leider nicht wenn ich in der klasse

    int keyboardArray[2][2];
    

    privat initialisiere

    und dann

    keyboardArray[0] = {1, 2};
    keyboardArray[1] = {3, 4};
    

    in einer funktion füllen möchte.

    allerdings fällt mir gerade auf, dass ich das dumme array auch im header file füllen könnte..

    aber vielleicht weißt du ja doch noch eine lösung...

    danke für die antworten. wirklich nett.



  • 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