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

1

08.06.2007, 20:30

Mehrdimensionale Arrays

Bin zwar schon etwas weiter, genau genommen bei den Strukturen aber so ganz leuchtet mir die Funktion von Mehrdimensionale Arrays nicht ein.
Hier der Quelltext, gefolgt von meiner Frage:
// C++ für Spieleprogrammierer
// Listing 5.5
// Mehrdimensionale Arrays
//
#include <iostream>

using namespace std;

// Hauptprogramm
//
int main ()
{
// Konstanten
//
const int Breite = 3; // Breite der Karte
const int Hoehe = 3; // Hoehe der Karte

// Variablen
//
int Karte[Breite][Hoehe]; // Zweidimensionales Array für die Karte
int x, y; // Schleifenzähler
int Zaehler = 0; // Zum Füllen der Karte

// Karte mit Werten füllen
for (y= 0; y<Hoehe; y++)
{
for (x= 0; x<Breite; x++)
{
Karte[x][y] = Zaehler;
Zaehler++;
}
}

// Karte ausgeben
for (y=0; y<Hoehe; y++)
{
for (x=0; x<Breite; x++)
{
cout << Karte[x][y];
}
cout << endl;
}

return 0;
}

:?: So, ich weise ja nun den Feldern [x][y] Werte anhand des Zaehlers zu, doch welche Werte werden ihnen nun übergeben? Also die for-Schleife zum füllen des Arrays läuft ja so lange bis die Bedingung der äußeren Schleife erfüllt ist.Wenn nun also die Schleife zum ersten mal läuft ist Feld hoehe 0 und Feld Breite 0. Als erstes bekommen sie den Wert 0 vom Zaehler zugewiesen. Läuft die innere Schleife das zweite mal, haben die Felder Breite x 1 und Hoehe y 0 und sie bekommen jetzt durch die inkrementierung von Zaehler jeweils den Wert 1 zugewiesen. Beim dritten und letzten durchlaufen der inneren Schleife hat das Array für Feld Breite x2 und immer noch für Feld Hoehe 0, (da bis jetzt nur der Aktionsteil des x in Kraft getreten ist). den Wert 2 zugewiesen bekommen. Die Bedingung ist erfüllt die Schleife unterbrochen und erst jetzt tretet der Aktionsteil der äußeren Schleife also y in Kraft. y wird inkrementiert , die Bedingung ist nicht erfüllt, also gehts wieder mit der inneren Schleife weiter. Dies verläuft nun so lange bis die Bedingung der äußeren Schleife erfüllt. Nun diese Schema ist mir schon seit dem 2 Kapitel geläufig und damit habe ich auch kein Problem. Was mir nicht einleuchten mag ist, das ich nicht verstehe welche Werte nun y hat, bzw naja ich kann einfach nicht in Worte fassen, was mich krübblen lässt. Es ist ja so, jedes einzelne Feld bekommt Werte zugewiesen, nun ist es ja so, wenn ich das Beispiel kompiliere steht da:

012
345
678

Da aber y und x für Karte [x][y] pro druchlaufen der Schleife zwei Werte zugewiesen bekommen, müssten dort doch doppelt so viele Werte vorhanden sein Also für:

Karte[x=0][y=0] =0 x = 0; y=0
Karte[x=1][y=0] =1 x = 1; y=1
Karte[x=2][y=0] =2 x = 2; y=2
Karte[x=0][y=1] =3 x = 3; y=3
Karte[x=1][y=1] =4 x = 4; y=4
Karte[x=2][y=1] =5 x = 5; y=5
Karte[x=0][y=2] =6 x = 6; y=6
Karte[x=1][y=2] =7 x = 7; y=7
Karte[x=2][y=2] =8 x = 8; y=8

wobei y ja immer nur einen Wert bekommt, also insgesamt 3 werte bis die äußere Bedingung erfüllt wurde, da der letzte zugewiesene Wert immer nur gültig ist:
y=2
y=5
y=8

Ich hoffe jemand versteht was ich meine nicht zu wissen und kann mir aus dieser Miesere helfe

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

08.06.2007, 21:01

Da hast du wohl grundsätzlich etwas falsch verstanden.
Die beiden Schleifen weisen jedem Feld genau einmal einen Wert zu.
Die äußere Schleife bestimmt die Zeile, die innere die Spalte.

Karte[0][0] = 0
Karte[0][1] = 1
Karte[0][2] = 2
Karte[1][0] = 3
Karte[1][1] = 4
Karte[1][2] = 5
Karte[2][0] = 6
Karte[2][1] = 7
Karte[2][2] = 8

Wie kommst du darauf, dass x und y Werte über 2 annehmen können?

3

08.06.2007, 21:14

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>

int main ()
{
    const unsigned short map_width  = 3;
    const unsigned short map_height = 3;

    int map[map_height][map_width];
    int count = 0;

    for (unsigned short y = 0; y < map_height; ++y) // von oben nach unten

        for (unsigned short x = 0; x < map_width; ++x) // bei jedem punkt (von oben nach unten) von links nach rechts gehen

            map[y][x] = count++; // der Karte an dem Punkt den Wert von count zuweisen und dann count erhöhen ...


    for (unsigned short y = 0; y < map_height; ++y)
    {
        for (unsigned short x = 0; x < map_width; ++x)
            std::cout << map[y][x];
        std::cout << std::endl;
    }
} 
...
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

4

08.06.2007, 21:21

Karte[0][0] = 0
Karte[0][1] = 1
Karte[0][2] = 2
Karte[1][0] = 3
Karte[1][1] = 4
Karte[1][2] = 5
Karte[2][0] = 6
Karte[2][1] = 7
Karte[2][2] = 8

Ja so hab ich das gemeint. Ich bin mir schon im klaren das die äußere Schleife für die Zeilen und die innere Zeile für die Spalten zuständig ist, da liegt ja nicht meinProblem, wobei es ja weniger ein Problem ist.

beim ersten druchlaufen der äußeren Schleife, hat y den Wert 0, und somit Karte Feldhoehe 0, dies ändert sich auch erst wenn die Bedingung der inneren Schleife erfüllt wurde, nämlich dann wird y inkrementier und es handelt sich nun um das HoeheFeld 1. Doch beim ersten druchlaufen der Schleife bekommt x und y jeweils drei Werte zugewiesen also für 0x=0; 0y=0, 1x=1; 0y=1, 2x=2; 0y=2 also haben die drei Felder der xBreite die Werte 0,1,2 und yHoehe nur den Wert 2 da dies der lezte Wert war den es zugewiesen hat bekommen. Als nächstes Folgt dann das zweite druchlaufen der Schleife, und dann das Dritte druchlaufen der Schleife.

Ich weiß es ist nicht leicht zu verstehen was ich meine nur, ich weiß net bei den leichtesten Sache tu ich mir immer schwer. Könntest du mir dies nochmal bitte erklären, vielleicht verstehe ich es dann.

5

08.06.2007, 22:28

ode (C++):
#include <iostream>

int main ()
{
const unsigned short map_width = 3;
const unsigned short map_height = 3;

int map[map_height][map_width];
int count = 0;

for (unsigned short y = 0; y < map_height; ++y) // von oben nach unten
for (unsigned short x = 0; x < map_width; ++x) // bei jedem punkt (von oben nach unten) von links nach rechts gehen
map[y][x] = count++; // der Karte an dem Punkt den Wert von count zuweisen und dann count erhöhen ...

for (unsigned short y = 0; y < map_height; ++y)
{
for (unsigned short x = 0; x < map_width; ++x)
std::cout << map[y][x];
std::cout << std::endl;
}
}
...

Danke schön.
Ich stand wohl "etwas" :roll: auf der Leitung
Danke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

08.06.2007, 22:57

gut wenns geht :)

fürs nächste mal ein tipp:
es gibt da diese code tags [code ] und [/code] bzw. [cpp ] und [/cpp]
wenn du deinen code da reintust, gewinnt er ungemein an leserlichkeit, was die motivation derer die dir helfen wollen ungemein steigert ;)

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
#include <iostream>

int main ()
{
  const unsigned short map_width = 3;
  const unsigned short map_height = 3;

  int map[map_height][map_width];
  int count = 0;

  for (unsigned short y = 0; y < map_height; ++y) // von oben nach unten

    for (unsigned short x = 0; x < map_width; ++x) // bei jedem punkt (von oben nach unten) von links nach rechts gehen

      map[y][x] = count++; // der Karte an dem Punkt den Wert von count zuweisen und dann count erhöhen ...


  for (unsigned short y = 0; y < map_height; ++y)
  {
    for (unsigned short x = 0; x < map_width; ++x)
      std::cout << map[y][x];
    std::cout << std::endl;
  }
}
... 

7

08.06.2007, 23:30

ja ... er hat ja auch nur meinen Code zitiert :D
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Viktor

Alter Hase

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

8

09.06.2007, 22:08

Wie ist das ueberhaupt mit 4-D-Arrays? Was bringen die einem? 2Dimensionale fuer 2D Spiele und 3Dimensionale fuer 3D Spiele, und 1D Arrays zum Daten speichern. Aber 4? Fuer die Zeit oder wie soll ich das verstehen?

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

09.06.2007, 22:36

4D Arrays sind nicht zum verstehen da, sondern zum ignorieren - dazu würde ich dir zumindest solange raten, bis du einen Grund findest, solche Monster zu verwenden -> also, nicht alles was die Sprache kann muss man auch tun.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

09.06.2007, 22:40

Zitat von »"Stier X"«

Wie ist das ueberhaupt mit 4-D-Arrays? Was bringen die einem? 2Dimensionale fuer 2D Spiele und 3Dimensionale fuer 3D Spiele, und 1D Arrays zum Daten speichern. Aber 4? Fuer die Zeit oder wie soll ich das verstehen?

Gehst du davon aus, dass C++ für Spiele gedacht ist? Das ist selbstverständlich nicht der Fall. In der Mathematik sind 4 oder mehr Dimensionen nichts Besonderes.
Übrigens kann man alles auf 1D-Arrays abbilden. Mehrdimensionale Arrays sind zwar ein nützliches Feature, aber wenn es fehlt, kann man es leicht nachbilden.

Werbeanzeige