Probleme mit mehrdimensionalen Arrays als Parameter



  • Hallo!
    Ich bin noch recht neu in der Programmierung. Also hab ich letztens ein bisschen mit mehrdimensionalen Arrays und Funktionen rumgespielt, um zu gucken was man mit ihnen machen kann und ab wann der Compiler anfängt zu meckern.

    Jetzt das Problem:
    Der Code ist hier.

    Wie man (hoffentlich) sehen kann, hab ich in Zeile 20 hab ich ein Array von der Klasse Feld erstellt und es mit zwei konstanten Variablen aus der Klasse initialisiert. Von dem Array setze ich dann alle Werte auf false, um sie nachher ausgeben zu können. Danach ruf ich die Funktion auf, die den Text in der Konsole zeigen soll. Das Array übergebe ich dabei als Parameter, um es in der neuen Funktion auch benutzen zu können. Jedoch treten dabei Fehler auf, die ich nicht verstehe. Hat wer eine Idee was da falsch läuft?

    Danke schon mal im voraus.



  • Ja die Funktion muss wissen, welche Größe dein Array hat, was du übergibst.
    Edit: Ich meinte die zweite Dimension muss bekannt sein, ein Teil der Größeninformation geht mit in den Typ ein:
    void showSpielfeld(Feld feld[][6]); müsste klappen

    Du hast aber ansonsten noch einen logischen Fehler. Vermutlich den hier, wenn ich deine Klasse Feld richtig als Spielfeld interpretiere

    1. Dein Klasse Feld repräsentiert das ganze Spielfeld (nehme mal an es ist ein Spielfeld) ... dann möchtest du wohl eher ein Array vom Typ char mit der breite und höhe erstellen (dann kannst du da 'X' oder 'O' drin speichern für ein Tic Tac Toe oder was auch immer du umsetzen willst). Aktuell würdest du nämlich ein Array an Spielfeldern erzeugen. In dem Fall sollte dein Char Array auch genauso wie breite/höhe ein Attribut deines Spielfeldes sein. Dadurch müsstest du das Array auch nicht an showSpielfeld übergeben, sondern könntest direkt in der Methode darauf zugreifen.
      Da sich das Attribut besetzt vermutlich auf ein einzelnes Feld (z.B. wie oben den den char bezieht) gehört das nicht in die Klasse Spielfeld. Möchtest du so ein Attribut haben, könntest du einen Wrapper für dein einzelnes Feld (den char) erstellen
    class Feld {
    public:
      void besetzteFeld();
      bool istBesetzt() const;
    private:
      bool besetzt;
      char data;
    };
    
    class Spielfeld {
    public:
      void initSpielfeld();
      void showSpielfeld() const;
    
    private:
      static const int hoehe = 6;
      static const int breite = 6;
      Feld felder[hoehe][breite];
    };
    
    int main() {
      Spielfeld feld {};
      feld.initSpielfeld();
    }
    

    Hier mal um eine mögliche Unterteilung aufzubauen. Ich hab mal versucht an deinem Beispiel nah dran zu bleiben. Du kannst das natürlich verbessern, indem du lieber std::array nimms statt carrays, auf mehrere Dateien aufsplittest, den Konstruktor statt einer init Methode nutzt, die Methoden so bennenst wie es dir passt usw.



  • @Bossmo sagte in Probleme mit mehrdimensionalen Arrays als Parameter:

    Ich bin noch recht neu in der Programmierung. Also hab ich letztens ein bisschen mit mehrdimensionalen Arrays und Funktionen rumgespielt

    Rumspielen damit ist sicher in Ordnung. Für den alltäglichen Gebrauch solltest du über eine Vector2d- oder eine Matrix-Klasse nachdenken. Die Frage nach 2d-Arrays kommt hier sehr regelmäßig, du musst nur ein bisschen suchen, um gute Lösungsvorschläge zu finden. Also in der Regel wird das eine Klasse mit einem 1d-Vector sein, die die Dimensionen speichert und beim Zugriff die 2d-Koordinaten in eine 1d-Koordinate umrechnet.

    Mein Ratschlag wäre daher, diese C-Style-Arrays erst einmal in den Hintergrund zu stellen. Schau dir lieber std::vector an und wie man damit ein mehrdimensionales, variabel großes Array basteln kann.

    Wenn du die Größen kennst, dann probiere auch std::array. Damit ist es leichter zu verstehen, wie man das Array an eine Funktion übergibt.



  • @DocShoe hat unter Array2D: Evolution von manueller Speicherverwaltung zur STL eine passende Klasse (bzw. mehrere Versionen) dafür erzeugt.



  • @Th69 Ja, aber ich habe da extra nicht drauf verlinkt. Die ersten 5 Ansätze kommen wegen manueller Speicherverwaltung sowieso nicht in Frage. Also mindestens Variante 6. Und den Datentyp möchte man sicher frei festlegen. Also ist man gleich bei Version 7. Ich habe vor allem den Punkt der vielen Zwischenversionen mit eigenem Speicherumgefrickle nicht gesehen.

    Alternativ kann man auch mal einen Blick auf Boost.MultiArray werfen, wenn man vor Boost keine Angst hat.


Anmelden zum Antworten