Array an Funktion übergeben



  • Wenn man mit OOP vertraut ist sicherlich. 🙂
    Aber dazu fehlt mir das Wissen und die Erkenntnis was an OOP um so vieles besser ist.



  • Tal Ker schrieb:

    Aber dazu fehlt mir das Wissen

    Kann man sich aneignen

    und die Erkenntnis was an OOP um so vieles besser ist.

    Zum Beispiel unter anderem, dass der Code sagt, was gemeint ist, und nicht zu jeder Zeile Code eine mindestens so lange Zeile Kommentar zur Erklärung benötigt wird.



  • Tal Ker schrieb:

    Wenn man mit OOP vertraut ist sicherlich. 🙂
    Aber dazu fehlt mir das Wissen und die Erkenntnis was an OOP um so vieles besser ist.

    Dann solltest Du es besser jetzt beim Lernen verinnerlichen. Sonst kommt nur Murks dabei raus.



  • Was ist den an der OOP so gut?
    Wenn ich den Variablen sprechende namen gebe, brauch ich auch keinen Kommentar dazu.



  • Tal Ker schrieb:

    Nicht, wenn ich abwechselnd spielen lasse und die farbe über eine bool steuere

    Und wie repräsentierst du ein leeres Feld?



  • 314159265358979 schrieb:

    Und wie repräsentierst du ein leeres Feld?

    Gar nicht. Das Spielfeld taucht als solches im Code nur bei der mattüberprüfung auf.



  • Irgendwie ist in Deinem Code nur schwer ersichtlich was wo wie ist.

    Durch OOP wird das irgendwie etwas klarer.

    class piece
    {
    public:
        enum color_type{white, black};
        enum figure_type{rook, knight, bishop, queen, king, pawn};
    
        piece(color_type col, figure_type fig);
    private:
        //...
    };
    
    class square
    {
    public:
        enum color_type{white, black};
        square();
        square(color_type col);
        square(color_type col, piece const & p);
    private:
        //...
    };
    
    std::array<std::array<square, 8>, 8> board;
    
    board[0][0] = square(square::white, piece(piece::white, piece::rook));  //weisses Feld, weisser Turm. Kommantar eigentlich ueberfluessig
    
    //im Gegensatz uu:
    array[1][8][0] = 1; //Spielfigur ist ein Turm -> aha...
    

    Wenn man dann noch Entwurfsmuster kennt, könnte man aus board auch noch eine Klasse machen, welche z.B. das Strategie-Muster benutzt um die Regeln für die Figurbewegungen durchzusetzen. Dann könnte man große Teile z.B. auch für Dame wiederverwenden.



  • Tachyon schrieb:

    Irgendwie ist in Deinem Code nur schwer ersichtlich was wo wie ist.

    Durch OOP wird das irgendwie etwas klarer.

    class piece
    {
    public:
        enum color_type{white, black};
        enum figure_type{rook, knight, bishop, queen, king, pawn};
        
        piece(color_type col, figure_type fig);
    private:
        //...
    };
    
    class square
    {
    public:
        enum color_type{white, black};
        square();
        square(color_type col);
        square(color_type col, piece const & p);
    private:
        //...
    };
    
    std::array<std::array<square, 8>, 8> board;
    
    board[0][0] = square(square::white, piece(piece::white, piece::rook));  //weisses Feld, weisser Turm. Kommantar eigentlich ueberfluessig
    //im Gegensatz uu:
    array[1][8][0] = 1; //Spielfigur ist ein Turm -> aha...
    

    Nur wenn man die Bedeutung der Wörter "rook" und "white" kennt. Genauso wie "array[1][8][0] = 1" nur richtig interpretiert werden kann wenn man den Kontext kennt. Und dann ist "array[1][8][0] = 1" kürzer als "board[0][0] = square(square::white, piece(piece::white, piece::rook));"



  • Tal Ker schrieb:

    Nur wenn man die Bedeutung der Wörter "rook" und "white" kennt. Genauso wie "array[1][8][0] = 1" nur richtig interpretiert werden kann wenn man den Kontext kennt. Und dann ist "array[1][8][0] = 1" kürzer als "board[0][0] = square(square::white, piece(piece::white, piece::rook));"

    Ich bin davon ausgegangen, dass man Schachbegriffe kennt, wenn man ein Schachspiel programmiert. Während für jeden, der sich mit Schach auskennt zumindest grob klar sein dürfte, was board[0][0] = square(square::white, piece(piece::white, piece::rook)); bedeutet, hat array[1][8][0] = 1 absolute keinen Bezug zu irgendwas. Das könnte genauso gut dafür sein, den Toaster im Erdgeschoss im Haus Nummer 8 der ersten Straße auf Stufe 1 einzustellen.
    Selbst ohne Schach zu kennen kommt man mit einer Google Suche nach "rook, white, square, board" drauf. Eine Suche nach "1, 8, 0, 1" dürfte da eher weniger sinnvolle Dinge liefern.



  • Ja, und warum? Weil wir die Bedeutung hinter diesen Begriffen zu verstehen glauben. Aber wir können uns nicht sicher sein. "king" könnte auch Herrscher eines Landes bedeuten und nicht die Figur im Schach bezeichnen. Beim Programmieren definiert man die Bedeutung hinter diesen Begriffen und das ist eine sehr, sehr große Freiheit.

    Abgesehen davon, kann man, wie du richtig sagtest in "array[1][8][0] = 1" viel mehr reininterpretieren als in "white" und "rook". Ich kann also "array[1][8][0] = 1" in anderen Zusammenhängen leichter verwenden als "white" und "rook". Und soll man nicht mit hoher wiederverwertbarkeit des Codes programmieren? Ich ändere einmal bei der Definition die Begrifflichkeiten und kann "array[1][8][0] = 1" immer noch verstehen. Bei "white" und "rook" ist das schon schwieriger.



  • Richtig, aber wenn man weiß, dass es sich um ein Schachprogramm handelt, dann weiß man, was king, white usw. zu bedeuten haben. 1,8,0,1 sagt da aber immernoch nichts aus.



  • Tal Ker schrieb:

    Ja, und warum? Weil wir die Bedeutung hinter diesen Begriffen zu verstehen glauben. Aber wir können uns nicht sicher sein. "king" könnte auch Herrscher eines Landes bedeuten und nicht die Figur im Schach bezeichnen. Beim Programmieren definiert man die Bedeutung hinter diesen Begriffen und das ist eine sehr, sehr große Freiheit.

    Genau.
    Die zwei Zeilen

    std::array<std::array<square, 8>, 8> board;
    board[0][4] = square(square::white, piece(piece::white, piece::king));
    

    sind selbstverständlich so zu verstehen, dass es sich bei piece::king um ein Stückchen Herrscher handelt. Und der Herrscher ist weiß und herrscht über ein weißes Quadrat auf einem Brett mit 64 weiteren Quadraten. Wie kann man da nur auf Schach kommen wo doch ganz eindeutig ist, dass es sich um ein Verwaltungsprogramm für Herrscherstücke in Andorra handelt? 🙄
    Ich bin mir recht sicher, dass man mit den zwei Zeilen, selbst ohne das restlich Programm zu kennen, eher darauf kommt, dass es um Schach geht, als wenn man sich Dein gesamtes Programm ansieht.



  • Aber dazu fehlt mir das Wissen und die Erkenntnis was an OOP um so vieles besser ist.

    Der Sinn von OOP ist, Objekte "des echten Lebens" auch als Objekte darzustellen, wodurch sie jeder verstehen kann und Fehler deutlich seltener auftreten da die inneren Vorgänge zur Realisierung des Objektes verborgen bleiben.
    So ne Schachfigur wäre fast das perfekte Beispiel für ein Lehrbuch, weil sich dann jeder etwas darunter vorstellen kann.

    Tipp: Gib jemand Anderem deinen Code mit diesem Murks und schau ob er/sie es korrekt verstehen kann. Oder versuchs selber wieder in ein paar Monaten, du wärst für verständlichen & aussagekräftigen Code froh.



  • So ne Schachfigur wäre fast das perfekte Beispiel für ein Lehrbuch, weil sich dann jeder etwas darunter vorstellen kann.

    Offensichtlich nicht - es scheint tatsächlich auch Leute zu geben, die trotz gutem Beispiel und Erklärungen n Brett vor dem Kopf behalten (aus was für Gründen auch immer).



  • Wir reden aneinander vorbei.
    Mir sind diese Begriff bekannt, mir ging es um das Allgeimeine dahinter.

    Um wieder zur Anfangsfrage zurück zu kommen:

    Gibt es eine Möglichkeit ohne OOP ein Array by value an eine Funktion zu übergeben?



  • Tal Ker schrieb:

    Gibt es eine Möglichkeit ohne OOP ein Array by value an eine Funktion zu übergeben?

    Nein.

    Und an OOP ist sehr viel sehr praktisch. Allein wenn Du ein dynamisch erweiterbares Array brauchst. Dann darfst Du ohne OOP immer irgendwelche resize-Funktionen aufrufen oder musst Das halt in Zugriffsfunktionen für das Array stecken... ziemlich unpraktisch.

    Dann nimmst Du stattdessen einen vector. Den kannst Du benutzen wie ein normales Array, aber der wird automatisch größer, wenn Du was einfügst. Sogar der []-Operator für Zugriffe ist überladen, das ist enorm praktisch, die Fehleranfälligkeit sinkt uvm.

    Das ist nur eins von tausenden Beispielen und das beleuchtet nur einen winzigen Aspekt von OOP. Es gibt enorm viele Vorteile.



  • Tal Ker schrieb:

    Mir sind diese Begriff bekannt, mir ging es um das Allgeimeine dahinter.

    Da du scheinbar keinen Zusatznutzen aus dem "++" hinter dem "C" ziehen willst: Wäre das C-Forum für deine Fragen nicht wesentlich geeigneter? Und nein, das ist nicht böse gemeint, nur glaube ich das bei deinem Programmierstil C++ ungeeignet ist.

    Im C++ Forum versucht man die Probleme auch so zu lösen, wie es unter der Sprache C++ sinnvoll ist. Und in der Regel werden die Fragen so beantwortet, das dies auch sichergestellt wird.


Anmelden zum Antworten