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

03.11.2006, 17:05

Zeiger auf 2D Array übergeben

hi

ich hab ein Problem mit der Übergabe von Zeigern (auf ein 2D Array) zu Funktionen.

Ich hab mir 2 Variablen erstellt, dazu ein 2D Feld und einen Zeiger darauf:

C-/C++-Quelltext

1
2
3
4
5
const int Hoehe = 40;
const int Breite = 50;

char MAP[Hoehe][Breite]; //MAP Array definieren

char *pMAP = &MAP[Hoehe][Breite]; //Zeiger auf das MAP Array


Da man ja sein Projekt auf mehrere Dateien schreiben soll, habe ich nun 2 weitere Dateien: MapInit.hpp und MapInit.cpp

Ich will nun also das 2D Feld (den Zeiger) der Datei MapInit.cpp geben um dort mein Feld zu initialisieren :)
Doch das will nicht klappen :(

Mein funktionsaufruf sieht momentan so aus:

C-/C++-Quelltext

1
MapInit (Hoehe, Breite, pMAP);


und der Prototyp in der MapInit.hpp so:

C-/C++-Quelltext

1
int MapInit (const int Hoehe, const int Breite, char *pMAP[Hoehe][Breite]);


aber das klappt nicht, und ich kann in der CPP Datei MapInit.cpp nicht auf den Zeiger pMap zugreifen

:oops:
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

03.11.2006, 17:20

Hab mich anscheinend geirrt... folgendes bitte nicht beachten (ich lass es nur für die Postingabfolge vom Treat drin)

dir sollte klar sein, dass Arrays (bis auf minimale interne Unterschiede) das Selbe wie Pointer sind:

C-/C++-Quelltext

1
2
3
4
const int Hoehe = 40;
const int Breite = 50;

char MAP[Hoehe][Breite]; // MAP hat den Typ char** da es ein 2D-Array ist

Du kannst dir als Grundregel merken, dass für jede Arraydimension eigentlich eine Pointerdimension dazu kommt. Um also auf MAP in einer Funktion zuzugreifen brauchst du einen Doppelpointer:

C-/C++-Quelltext

1
2
3
4
int MapInit (const int Hoehe, const int Breite, char **pMAP);

// Zugriff:

MapInit(Hoehe, Breite, MAP);

Aus pMAP kannst du in der Funktion jetzt genauso wie auf MAP zugreifen:

C-/C++-Quelltext

1
2
3
4
5
for (int i=0; i<Hoehe; ++i)
for (int j=0; j<Breite; ++j)
{
  pMAP[i][j]=0;
}

3

03.11.2006, 17:30

achso, dass mit Doppelpointern kannte ich nicht :)

klappt aber immernoch nicht richtig^^

Zitat

cannot convert `char (*)[50]' to `char**' for argument `3' to `int MapInit(int, int, char**)'

in der Zeile mit dem zugriff

C-/C++-Quelltext

1
2
     //Map Initialisieren

     MapInit (Hoehe, Breite, MAP);


:?:
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

03.11.2006, 17:51

Zitat von »"grek40"«

Du kannst dir als Grundregel merken, dass für jede Arraydimension eigentlich eine Pointerdimension dazu kommt. Um also auf MAP in einer Funktion zuzugreifen brauchst du einen Doppelpointer

Das stimmt nicht!
2D-Arrays sind einfache Zeiger. Die Elemente liegen alle hintereinander im Speicher.
Das kannst du anhand dieses simplen Programms überprüfen:

C-/C++-Quelltext

1
2
3
int test[2][2] = {1, 2, 3, 4};
int* p = reinterpret_cast<int*>(test);
for(int i = 0; i < 4; i++) printf("%d ", p[i]);


Folgendes Programm hingegen schmiert ab:

C-/C++-Quelltext

1
2
3
int test[2][2] = {1, 2, 3, 4};
int** p = reinterpret_cast<int**>(test);
for(int i = 0; i < 2; i++) for(int j = 0; j < 2; j++) printf("%d ", p[i][j]);

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

5

03.11.2006, 17:59

Oops... is mir jetzt leicht peinlich (hab ma als Fehler markiert)

Muss das mit Konstruktionen von dynamischen Arrays verwechselt haben.

6

03.11.2006, 18:07

ich bekomm das Array immernoch nicht richtig übergeben :P

auch nicht wenn ich aus dem char **pMAP ein char *pMAP mache ^^
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

03.11.2006, 18:09

Dann caste es, so wie ich im Beispiel ...

8

03.11.2006, 19:31

ok, langsam wirds peinlich ^^
wenn ich auf den Zeiger zugreifen will bekomm ich

Zitat

MapInit.cpp invalid types `char[int]' for array subscript


code sieht jetzt so aus:

MapInit.hpp:

C-/C++-Quelltext

1
2
3
//Prototypen

//

int MapInit (const int Hoehe, const int Breite, char *pMAP);


Spielen.cpp:

C-/C++-Quelltext

1
2
3
4
5
     char MAP[Hoehe][Breite]; //MAP Array definieren

     char *pMAP = reinterpret_cast<char*>(MAP); //casten

     
     //Map Initialisieren

     MapInit (Hoehe, Breite, pMAP);


und dann MapInit.cpp, in welcher ich den Fehler bekomme:

C-/C++-Quelltext

1
2
3
4
5
6
int MapInit (const int Hoehe, const int Breite, char *pMAP)
{

    //Map mit Spielfeld füllen

    pMAP[5][5] = 'A';  //Fehler: " invalid types `char[int]' for array subscript"

}


:oops:
C++ für Spieleprogrammierer durch, zu Weihnachten ist 3D Spieleprogrammierung mit DirectX9 dran :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

03.11.2006, 20:04

Das geht nicht. Woher soll er denn wissen, wie groß das Array ist, wenn es ja nur ein Zeiger ist? Du musst den Index selber berechnen (2D => 1D: z.B. y * Breite +x).

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

10

04.11.2006, 08:21

Schau auch mal ins FAQ, dazu ist es ja da. :)
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Werbeanzeige