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

valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

1

13.02.2011, 21:26

Zeuger auf mehrdimensionales Array an member einer Klasse übergeben

Moin. bzw. Abend ;)

Tut mir leid, dass ich schonwieder hier mit so nem Problem ankomm', aber i-wie steh' ich völlig auf dem Schlauch.
Folgendes:

Ich hab' ne Map die in nem 2d Array gespeichert ist. (map[25][20]). Aus dieser Map heraus werden die beweglichen Objekte, Member der Klasse mo_stone erstellt. Ich will nun, dass diese Member mitbekommen, wenn ein anderer Member aus ihrer Klasse die Position wechselt. (Um z.B. herunterzufallen). Dies will ich realisieren, indem ich einen Zeiger auf ein Array mit allen Positionen der Steine an die Member übergeben. Mein Ansatz sieht so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Code innerhalb "stone.h"
void stein(int cpos_arr[100][2], int cpos);

int pos_arr[100][20];

//Code innerhalb "stone.cpp"

void mo_stone::stein(int cpos_arr[100][2], int cpos)
{
    pos_arr=cpos_arr;
    pos=cpos;
}


Die benötigten Variablen sind alle vorhanden, allerdings funktioniert die Übergabe des Arrays an die Klasse nicht so richtig...

Könnte ich das oben beschriebene auch schlauer lösen, bzw. wie übergebe ich ein Array (Welches ja als Zeiger angesehen wird) an eine Funktion/Klasse?

Valentin
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.02.2011, 23:21

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
//Code innerhalb "stone.h"
void stein(int **cpos_arr, int cpos);

int **pos_array;//hier muss irgendwo das array initialisiert und mit werten gefüllt werden

//Code innerhalb "stone.cpp"

void mo_stone::stein(int **cpos_arr, int cpos)
{
    pos_arr=cpos_arr;
    pos=cpos;
}

Kannst das ganze natürlich auch mit ner Referenz lösen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

14.02.2011, 17:59

Absicht das oben pos_array 100*20, cpos_array 100*2 ist?
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

valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

4

14.02.2011, 19:42

Absicht das oben pos_array 100*20, cpos_array 100*2 ist?
Nö, das war n Fehler beim übernehmen.

@Schorsch/all: Ich hab' jetzt also das was gesagt wurde übernommen. Wie initialisiere ich das ganze jetzt aber? Wie ein normales Array wird das ja nicht initialisiert...
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

5

14.02.2011, 19:58

Was heißt das funktioniert nicht so richtig? Davon mal abgesehen das der Threadtitel nicht ganz mit deinem Code übereinstimmt.

Schorsch's Version ist nur ne andere Möglichkeit das zu lösen ... kannst auch nen eindimensionales array draus machen ... (größe: width * height; zugriff: y * width + x). Ändert aber nix an deinem Ausgangsproblem ;)

google.de hilft notfalls auch ...
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

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Deviloper« (14.02.2011, 20:04)


valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

6

14.02.2011, 20:30

Joa, mittlerweile frag' ich mich eher, wie int **move_pos; intialisiert wird (bzw. warum folgender Fehler erscheint, wenn ja anscheinend fehlerlos übergeben wird). Denn nun wird zwar normal kompiliert, auch move_pos (welches in der zwischenzeit mit werten gefüllt wurde) wird an den Member übergeben. Sobald aber versucht wird, einen der Werte zu benutzen wird der Error "Unbehandelte Ausnahme bei ... in .... Zugriffsverletzung bei lesen an Position 0x00000000."

Btw. Dass google hilft, weiss ich auch, und ich hab' auch zu diesem Thema einige Zeit gesucht. Scheinbar bin ich aber untalentiert in der Wahl des Suchbegriffes ;), denn ich hab' zu diesem Thema beim besten Willen nichts gefunden...
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

14.02.2011, 23:08

http://www.willemer.de/informatik/cpp/dynamic.htm

Da wäre so ein Beispiel;)
http://www.tutorials.de/c-c/137994-c-meh…ales-array.html

Beim zweiten Link findest du was zu mehrdimensionalen Arrays. Du musst dir einfach überlegen, dass nen Array eigentlich nichts anderes als nen Zeiger ist. Das Array an sich kennt die Startposition(den Zeiger auf die Speicheradresse) und den Typ(zB Int). Wenn du jetzt auf das zweite Element gehen willst guckt dein Code automatisch welche Adresse dein Array hat und welche Größe dein Typ hat und berechnet damit dann die Position des gewünschten Indexes. Beim Index 1(zweite Position im Array) wäre das dann Speicherstelle vom Array+ Größe von Int. Bei der dritten Stelle wäre das dann Speicherstelle vom Array + Größe von Int*2 und so weiter. Halt nur drauf achten, dass wenn du es über Zeiger löst, du den Speicher auch selbst wieder freigeben musst. Wenn du ein Array erzeugst, so wie du es oben gemacht hast, musst du das nicht.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

valentin

Treue Seele

  • »valentin« ist der Autor dieses Themas

Beiträge: 212

Wohnort: Schweiz

Beruf: Schüler

  • Private Nachricht senden

8

15.02.2011, 16:08

Danke für die ausführliche Antwort. ;)

Gestern Abend habe ich aber noch ein bisschen rumprobiert, und bin dann (malwieder) darauf gestossen, dass ich das Array ganz normal übergeben kann, da Arrays ja, (wie schon erwähnt) eigentlich nichts anderes als Zeiger sind. Deswegen übergebe ich das Array jetzt ganz normal (void klasse::name(int array[100][2], int pos){}) Jetzt ist mein Problem, dass ich die Position des Arrays auch speichern will...

//edit: Hab's geschafft, es zu lösen: Nun wird der Speicherort dort gespeichert: (int (*pos_array)[2];)
visit me on deviantArt!
http://v-alentin.deviantart.com/

There is no programming language, no matter how structured, that will prevent programmers from making bad programs. //Larry Flon

Werbeanzeige