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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

1

10.09.2011, 12:09

2D Array als Parameter übergeben

Hey,
ich wollte eine TileMap mithilfe eines 2D Arrays machen.
Doch leider scheitere ich seit mehreren Stunden an der Übergabe der Parameter.
Es währe echt Cool wenn mir jemand mal sagen könnte was ich falsch mache :/

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
66
67
68
69
70
71
72
73
#include <SFML/Graphics.hpp>
#include <iostream>

using namespace std;

// Struktur
struct S_Map
{
    int m_X;
    int m_Y;
    int m_Tile;
};

// Prototypen
void Map_Initialisieren (S_Map *Map);
void Map_Zeichnen (sf::RenderWindow &App);

int main ()
{
    // Variablen
    S_Map Map[16][16];

    // Create Game Window
    sf::RenderWindow App(sf::VideoMode (800, 600, 32), "Array TileMap");

    // Game Loop
    while (App.IsOpened ())
    {
        sf::Event Event;
        while (App.GetEvent (Event))
        {
            // Close Window
            if (Event.Type == sf::Event::Closed)
            {
                App.Close ();
            }
        }

        App.Clear ();
        Map_Initialisieren (&Map[16][16]);
        App.Display ();
    }



    return 0;
}

// Map_Initialisieren
// Aufgabe: Initialisiert die Mapdaten.
void Map_Initialisieren (S_Map *Map)
{
    for (int y=0; y<16; y++)
    {
        for (int x=0; x<16; x++)
        {
            Map[x][y]-> // <- Fehler?
        }
    }
}

// Map_Zeichnen
// Aufgabe: Stellt die Map grafisch da.
void Map_Zeichnen (sf::RenderWindow &App)
{
    for (int y=0; y<16; y++)
    {
        for (int x=0; x<16; x++)
        {
            
        }
    }
}

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

10.09.2011, 12:13

Eine von vielen Möglichkeiten (aber gewiss nicht die beste ;)):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
typedef S_Map Map[16][16];

Map meineMap;
meineMap[5][6].m_Tile = 297;
funktionDieMapErwartet(meineMap);

void funktionDieMapErwartet(Map& map) {
    map[5][6].m_Tile = 1337;
}

3

10.09.2011, 13:28

du übergibst einen zeiger auf S_MAP, da du aber ein zweidimensionales array hast, musst du einen zeiger auf einen zeiger auf S_MAP übergeben, d.h. S_MAP**.

Du solltest dir mal angucken, wie arrays im speicher angesprochen werden, dann wird auch klar, warum man zwei zeiger braucht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.09.2011, 13:34

du übergibst einen zeiger auf S_MAP, da du aber ein zweidimensionales array hast, musst du einen zeiger auf einen zeiger auf S_MAP übergeben, d.h. S_MAP**.

Bist du dir da sicher? ;)

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

5

10.09.2011, 14:34

ist das jetzt richtig oder nicht ^^ das verwirrt mich jetzt ein bisschen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

10.09.2011, 14:50

Nein es ist nicht richtig.

Du kannst es wie ein normales Array behandeln und die Position selbst berechnen.

C-/C++-Quelltext

1
Map[x+y*16]
Wobei 16 die Breite ist. Bei einem Array mit der größe 15*12 wäre es also 15.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

10.09.2011, 14:52

Ich würde dir empfehlen, dass du dir eine Klasse für deine Map baust, die den Zugriff auf die einzelnen Felder abstrahiert. Im Hintergrund legt diese Klasse dann alles in einem normalen 1d Array ab.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

10.09.2011, 15:04

Das ist im Prinzip keine schlechte Idee. Allerdings könnte es auch zu viel auf einmal sein und ihn überfordern.
Einem Kind empfiehlt man ja auch nicht den Bagger zu nehmen, wenn es mit der Schippe nicht klar kommt...
achja:

C-/C++-Quelltext

1
2
int m_X;
int m_Y;

in S_Map sind doch überflüssig weil du sowieso den Index benötigst um auf die Tiles zuzugreifen. Der Index sollte ja den gleichen Wert haben wie m_X und m_Y oder nicht? :D
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

9

10.09.2011, 16:54

Verschachtelter Vector und man hat die Probleme gar nicht erst. An der STL kommt er früher oder später eh nicht drum herum.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

11.09.2011, 22:28

Verschachtelter Vektor hat aber den Nachteil von verschwendetem Speicherplatz und eventuellen Performance-Nachteilen, da für jede Zeile ein separater Vektor benutzt werden muss.

Werbeanzeige