Array als Attribut einer Klasse [gelöst]



  • Hi!

    Es ist denke ich gar nicht so schlecht, sich als Anfaenger einwenig mit C-Arrays auseinanderzusetzen.

    Ich wollte mich eigentlich mit beidem beschäftigen... Das Ziel meines Spieles ist ja, besser in C++ (und OpenGl) zu werden.

    Nachteil bei dieser Loesung ist, dass die Array-Groesse zur Kompilierzeit bestimmbar sein muss. Wenn du die Arrays Groesse aber erst zur Laufzeit (z.B. durch Eingaben des Benutzers) wissen kannst, dann muesstest du dynamische Arrays verwenden.

    Der Grund, warum ich dachte, Arrays währen der beste Weg hierfür war, dass ich ja eben nicht vorhabe meine Level Größe in der Laufzeit zu ändern. Ich will sie halt nur einmal beim Aufruf festlegen.

    Werde es dann auch mit vector versuchen. Welche Lösung ich dann Schlussendlich nähme... KÖNNEN sollte ich ja beides 😉

    Vielen Dank für die Zahlreichen Antworten. Ich werde vielleicht noch schreiben, falls noch was unklar ist.



  • Du koenntest zur Uebung mal eine eigene einfache Vektor-Klasse mit Hilfe von einem Array schreiben. Ist gar nicht so schwer und man lernt sehr viel dabei (Arrays, Zeiger und Speicherverwaltung).

    Werde es dann auch mit vector versuchen. Welche Lösung ich dann Schlussendlich nähme... KÖNNEN sollte ich ja beides

    Ich wuerde dir aufjedenfall empfehlen das ganze trotzdem in eine extra Klasse zu packen. Wie du das dann intern machst (ob vector, Array oder was auch immer) wird nachher, wenn du die Klasse benutzt, keine Rolle mehr spielen. Das ist ja der Sinn und auch das schoene an OOP 🙂

    Viel Erfolg bei deinem Projekt



  • Jap...

    Noch mal kurz zu deinen Lösungsvorschlag...

    Hab es gerade so versucht und es kommen ständig Fehler beim Compilieren..

    Es kommt:

    level.cpp:5:1: Fehler: Prototyp für »Level<width, height>::Level(int (*)[(height - 1)], int (*)[(height - 1)])« passt zu nichts in Klasse »Level<width, height>«
    level.h:8:3: Fehler: Kandidat ist: Level<width, height>::Level(int (*)[height], int (*)[height])
    main.cpp: In Funktion »int main(int, char**)«:
    main.cpp:10:39: Fehler: keine passende Funktion für Aufruf von »Level<5, 4>::Level(int [3][3], int [3][3])«
    main.cpp:10:39: Anmerkung: Kandidaten sind:
    level.h:8:3: Anmerkung: Level<width, height>::Level(int (*)[height], int (*)[height]) [mit int width = 5, int height = 4]
    level.h:8:3: Anmerkung:   keine bekannte Umwandlung für Argument 1 von »int [3][3]« nach »int (*)[4]«
    level.h:3:7: Anmerkung: Level<5, 4>::Level(const Level<5, 4>&)
    level.h:3:7: Anmerkung:   Kandidat erwartet 1 Argument, 2 angegeben
    

    Bitte sag mir schnell woran das liegt.. 🙂



  • Ich glaube du hast inkompatible Arrays benutzt, z.b.

    int arr[3][3] = { ... }
    Level<5, 4> l(arr, arr);    // fehler arr hat andere Groesse
    


  • nein hab ich nicht...

    const int width = 10, height = 8;
    Level<width, height> NeuesLevel(map, collision);
    

    geht auch nicht. Hast du es schon mal Compiliert?



  • jannis95 schrieb:

    Bitte sag mir schnell woran das liegt.. 🙂

    Das sagt dir dein Compiler:

    jannis95 schrieb:

    level.cpp:5:1: Fehler: Prototyp für »Level<width, height>::Level(int (*)[(height - 1)], int (*)[(height - 1)])« passt zu nichts in Klasse »Level<width, height>«
    level.h:8:3: Fehler: Kandidat ist: Level<width, height>::Level(int (*)[height], int (*)[height])
    main.cpp: In Funktion »int main(int, char**)«:
    main.cpp:10:39: Fehler: keine passende Funktion für Aufruf von »Level<5, 4>::Level(int [3][3], int [3][3])«
    

    sogar gaaaanz schnell 👍

    // edit:

    Ferris schrieb:

    Ich glaube du hast inkompatible Arrays benutzt

    jannis95 schrieb:

    nein hab ich nicht...

    Na no na ned ... 🙄

    jannis95 schrieb:

    const int width = 10, height = 8;
    Level<width, height> NeuesLevel(map, collision);
    

    geht auch nicht.

    "Geht nicht" ist keine Fehlerbeschreibung.
    Fehler = ?
    Deklarationen von map und collision = ?

    jannis95 schrieb:

    Hast du es schon mal Compiliert?

    Compiliert toll...



  • Compiliert toll...

    Hm

    OK Ich hab folgenden Code:

    template<size_t width, size_t height>
    class Level
    {
    private:
        int map[width][height];
        int collision[width][height];
    public:
        Level(int (*m)[height], int (*c)[height]);
    };
    
    template<size_t width, size_t height>
    inline Level<width, height>::Level(int (*m)[height], int (*c)[height])
    {
        for (size_t i=0; i<width; i++)
        {
            for (size_t j=0; j<height; j++)
                map[i][j] = m[i][j];
        }
    
        for (size_t i=0; i<width; i++)
        {
            for (size_t j=0; j<height; j++)
                collision[i][j] = c[i][j];
        }
    }
    
    int map[5][4] = {0};
    int collision[5][4] = {0};
    
    Level<5, 4> NeuesLevel(map, collision);
    

    Und bekomme die Fehler:

    test.cpp:1:10: Fehler: »size_t« wurde nicht deklariert
    test.cpp:1:24: Fehler: »size_t« wurde nicht deklariert
    test.cpp:11:10: Fehler: »size_t« wurde nicht deklariert
    test.cpp:11:24: Fehler: »size_t« wurde nicht deklariert
    test.cpp: In Konstruktor »Level<width, height>::Level(int (*)[height], int (*)[height])«:
    test.cpp:14:10: Fehler: »size_t« wurde in diesem Gültigkeitsbereich nicht definiert
    test.cpp:14:17: Fehler: expected »;« before »i«
    test.cpp:14:22: Fehler: »i« wurde in diesem Gültigkeitsbereich nicht definiert
    test.cpp:16:21: Fehler: expected »;« before »j«
    test.cpp:16:26: Fehler: »j« wurde in diesem Gültigkeitsbereich nicht definiert
    test.cpp:20:17: Fehler: expected »;« before »i«
    test.cpp:20:22: Fehler: »i« wurde in diesem Gültigkeitsbereich nicht definiert
    test.cpp:22:21: Fehler: expected »;« before »j«
    test.cpp:22:26: Fehler: »j« wurde in diesem Gültigkeitsbereich nicht definiert
    

    😕 😕



  • #include <cstring>
    

    Welcher Compiler?


  • Mod

    Swordfish schrieb:

    #include <cstring>
    

    Welcher Compiler?

    cstddef bringt das gleiche, aber etwas schlanker.


  • Mod

    #include <cstddef>
    #include <algorithm>
    #include <utiliy>
    
    template <std::size_t width, std::size_t height>
    class Level
    {
    private:
        int map[width][height];
        int collision[width][height];
    public:
        Level(const int (&m)[width][height], const int (&c)[width][height]);
    };
    
    template<size_t width, size_t height>
    Level<width, height>::Level(const int (&m)[width][height], const int (&c)[width][height])
    {
        std::copy( *m, *m + width * height, *map );
        std::copy( *c, *c + width * height, *collision );
    }
    

    Wer mag, macht den Konstruktor noch constexpr-tauglich.



  • C/C++ Code:
    #include <cstring>

    OH.. Jetzt gehts 😃

    Ok Werd hier ne art Schlussstrich ziehen. Dann Rest werde ich wohl alleine hinbekommen.

    VIELEN Dank für die ganze Hilfe! 😃 👍


Anmelden zum Antworten