Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

06.02.2013, 17:22

Pointer auf zweidimensionales Array

Nabend,

Also zu erst einmal gibt es eine Klasse, die im Konstruktor ein zweidimensionales array übergeben bekommt. In meiner Recherche habe ich gelesen, dass man einen Pointer auf das erste Element geben soll.

Mein Problem ist glaube ich, dass das Array klassen beinhaltet und ich da etwas falsch mache.

Hier mal Detailgetreut nachgestellt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
Area Loadarea()
{
Tile *tiles = new Tile[areaWidth,areaHeight];

// Für das Problem unnötiger Code

return tiles;
}

(LoadArea ist NICHT die Klasse, die das Array übergeben bekommt, sondern die die es erzeugt)

Das ganze soll dann eine tileMap erstellen. "Tile" ist eine Klasse.
Wenn ich die Zeile("Tile *tiles = new Tile[areaWidth,areaHeight];") auskommentiere, compiliert alles normal, wenn nicht nicht ;).

Brauche nun eure Hilfe, wie ich das anders(bzw richtig) machen kann :D.


Gruss,
ERROR



PS.: Sorry, falsches Forum, sollte natürlich in "C, C++, C#, Delphi, Java, Python und Lua"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

06.02.2013, 17:34

new Tile[areaWidth, areaHeight]; erzeugt kein zweidimensionales Array, sondern ein eindimensionales Array mit areaHeight Elementen...

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

06.02.2013, 18:25

Hmmm, obwohl du Recht hast, hätte ich irgendwie eher eine Hilfestellung erwartet^^.


Da ich dasnGlück habe Krankgeschrieben zu sein und nicht einfach nur rumliegen kann, sitze ich da heute schon länger dran und habe viele viele viele MEthoden probiert, aber jedes mal war es falsch und bei oben genannter, wurde wenigsens nicht unterkringelt :D.

So ist es schon besser oder?!?: Tile tileArr[areaWidth][areHeight]

Das Problem ist nur, dass ich dann aber meinen Pointer, nicht darauf richten kann, beziehungsweise nicht drauf komme wie.

Unschwer zu erkennen, will ich eine TileEngine aufbauen. Diese habe ich auch schon, leider in C# aber diese hier soll in C++ gemacht werden, deswegen auch die teilweise Verwirrung.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.02.2013, 18:42

Wenn areaWidth keine Konstante ist, dann kannst du keinen Pointer auf ein solches Array erzeugen.
Nimm lieber einen std::vector und bilde das 2D-Array auf 1D ab (Zeile für Zeile hintereinander).

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

06.02.2013, 18:49

Sofern er eine feste Größe haben will, wäre doch std::array besser geeignet.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

6

06.02.2013, 18:51

Nein, David hat schon recht, die Grösse ist nicht immer gleich.

Aber gibt es nicht eine elegantere Lösung?!? Oder erkenne ich nicht dass die std::vector Lösung gut ist?

Ich würde halt gerne später einen gut übersichtlichen Zugriff auf die tiles haben, zB mit "Name[x][y].Irgendwas".


EDIT.: Weiterhin noch das Problem, dass ich die Map an eine andere Funktion übergeben will.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ERROR« (06.02.2013, 19:01)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

06.02.2013, 19:02

y*width + x ?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

06.02.2013, 19:43

Oder du baust dir eine eigene Klasse so wie:
(Code nicht getestet!)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <algorithm>
#include <cassert>

template<typename T> class Array2D
{
public:
    Array2D(size_t width, size_t height)
        : width(width)
        , height(height)
        , p_data(new T[width * height])
    {
    }
    
    Array2D(const Array2D& other)
        : width(other.width)
        , height(other.height)
        , p_data(new T[other.width * other.height])
    {
        *this = other;
    }
    
    ~Array2D()
    {
        delete[] p_data;
    }
    
    // Zugriffsoperator
    T& operator ()(size_t x, size_t y)
    {
        assert(x < width && y < height);
        return p_data[y * width + x];
    }
    
    // Zugriffsoperator (const)
    const T& operator ()(size_t x, size_t y) const
    {
        assert(x < width && y < height);
        return p_data[y * width + x];
    }
    
    // Zuweisungsoperator
    Array2D& operator =(const Array2D& rhs)
    {
        assert(width == rhs.width && height == rhs.height);
        
        // Daten kopieren
        std::copy(rhs.p_data, rhs.p_data + width * height, p_data);

        return *this;
    }
    
    // Getter
    size_t getWidth() const { return width; }
    size_t getHeight() const { return height; }
    
private:
    const size_t width;
    const size_t height;
    T* const p_data;
};

// Beispiel für Benutzung:
Array2D<int> meinArray(30, 50);
meinArray(10, 10) = 42;
meinArray(1000, 1000) = 0; // <-- Fehler, wird bei Debug vom "assert" abgefangen

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

9

06.02.2013, 19:45

Du kannst prinzipiell auch vector schachteln und einen std::vector<std::vector<int>> bauen. Dann ist der Zugriff genau so, wie du ihn haben möchtest. Allerdings musst du bervor du Tiles erstellst x leere Vektoren einfügen, die du vorher mit resize auf die Größe y gebracht hast. Das ist etwas Frickelei, aber so könntest du eben mit tile[x][y] auf entsprechende Elemente zugreifen.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

10

06.02.2013, 20:55

So habe jetzt mal die möglichkeit mit den Vectoren gemacht.

Scheint soweit auch alles zu funktionieren. Vielen Dank ;) :thumbup:

Kann man einen Zeiger auf so einen verschachtelten Vector setzen? Kann man bestimmt, nur wie :D

Werbeanzeige