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

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

1

14.02.2008, 12:42

Zeiger auf Char Array an Funktion übergeben zur Änderung

Hallo,

mal wieder ne noobie Frage von mir.

Nachdem ich gestern Kapitel 9 abgeschlossen habe möchte ich zur Festigung ein kleines minispiel schreiben.

Da ich mit Kapitel 5 (Arrays) und 6 (Zeiger) die größten Schwierigkeiten bisher hatte möchte ich natürlich hier den Schwerpunkt legen.

Grundsätzlich will ich ein zweidimensionales Array mit konstanter Breite und Höhe erstellen, dies aber über Zeiger zur Änderung an eine Funktion geben, so dass ich in verschiedenen Funktionen verschiedene Bereiche des Spielfelds "ändern" kann.

Dies war mein naiver Einstieg an die Problematik:


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

using namespace std;

// Prototypen


void Spielfeldzeichnen (char *pSpielfeld);

int main()
{

// Variablen


const int Breite = 55;
const int Hoehe = 20;

char Spielfeld[Breite] [Hoehe];
char *pSpielfeld = NULL; // Zeiger auf das Array deklarieren

pSpielfeld = &Spielfeld; // Zeiger initialisieren




Spielfeldzeichnen (&Spielfeld[Breite][Hoehe]);

return 0;


}


void Spielfeldzeichnen (char *pSpielfeld)
{

cout << "Aufruf hat geklappt" << endl;

}



ich hab das Listing zwar soweit bekommen das der Funktionsaufruf klappt...

aber das Array lässt sich irgendwie trotzdem nicht ansprechen.

ich hatte das irgendwie so versucht:

C-/C++-Quelltext

1
*pSpielfeld [1][1] = ('A');


Das ging aber voll daneben.
Jetzt gucke ich etwas ratlos aus der Wäsche weil ich total unsicher bin, ob und wie ich die const int Breite und const int Hoehe an die Funktion geben muß. Bzw. gehen mir die ideen aus, wie ich das Array (also einzelne Felder) dann in der Funktion ansprechen muß zur Änderung.
Hat jemand Mitleid und gibt mir Hilfe?

Danke!

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

14.02.2008, 13:27

Ich hatte am Anfang mal das gleiche Problem.

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6575

Lies mal das, ist sehr gut erklärt. Wenn du noch Fragen hast,kannst sie ja dann schreiben.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

14.02.2008, 13:34

Einfach:

C-/C++-Quelltext

1
Spielfeld[ 1 ][ 1 ] = 'A';
@D13_Dreinig

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

14.02.2008, 13:56

Hmm..

Zitat

C-/C++-Quelltext

1
2
3
pSpielfeld = &Spielfeld; // Zeiger initialisieren 

...
Spielfeldzeichnen (&Spielfeld[Breite][Hoehe]);


Wenn ich das richtig sehe ist das "falsch" oder erzeugt nicht das gewünschte Ergebnis. Aber lies ruhig mal den Link durch, dann sollte dir auch klar werden, warum das falsch ist.

Nelrim

Frischling

  • »Nelrim« ist der Autor dieses Themas

Beiträge: 33

Beruf: Entwicklungskonstrukteur

  • Private Nachricht senden

5

14.02.2008, 18:56

Zitat von »"drakon"«

Ich hatte am Anfang mal das gleiche Problem.

https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=6575

Lies mal das, ist sehr gut erklärt. Wenn du noch Fragen hast,kannst sie ja dann schreiben.


ok vielen dank erstmal :)

also ich habs gelesen - aber verstanden wohl nicht ganz...

immerhin habe ich jetzt ein Listing das mal Anfängt das zu tun was ich gerne will:

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> 

using namespace std; 

void ZeichneSpielfeld(char Spielfeld[4][5]); 

int main() 
{ 
   char Spielfeld[4][5]; 
   int Ende;
   ZeichneSpielfeld(Spielfeld); 
    
   cout << Spielfeld[3][3] << endl; 
   cin >> Ende;
   return 0; 
} 

void ZeichneSpielfeld(char Spielfeld[4][5]) 
{ 
   Spielfeld[3][3] = ('A'); 
}


Da Arrays Zeiger sind, braucht man sich also keine Gedanken über Stack und hin und herschaufeln zu machen... wie praktisch.

Jetzt bekomm ich aber folgendes nicht hin:

ich will ja keine Zahl ins Array schreiben sondern eben [Breite] [Hoehe] und diese seperat als const int deklarieren und initialisieren.

Also dachte ich: ist ja einfach, schreib ich einfach überall wo 4 steht Breite hin und überall wo 5 steht Hoehe... dann schreib ich noch hin das Breite ein const int 55 und Hoehe ein const int 20 sein soll.

Das bekomm ich aber nur zum Laufen wenn ich die Breite und Hoehe global deklariere... und globale Variablen sind doch böse!

Wie bekomm ich das so hin, das ich zwar den Funktionsprototypen draussen, die Variablen aber drinnen deklarieren kann?

Hier das Listing wie es geht, mit den globalen Variablen Breite und Hoehe:

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

using namespace std; 
   const unsigned int Breite = 55;
   const unsigned int Hoehe = 20;
void ZeichneSpielfeld(char Spielfeld[Breite][Hoehe]); 

int main() 
{ 

   char Spielfeld[Breite][Hoehe]; 
   int Ende;
   ZeichneSpielfeld(Spielfeld); 
    
   cout << Spielfeld[3][3] << endl; 
   cin >> Ende;
   return 0; 
} 

void ZeichneSpielfeld(char Spielfeld[Breite][Hoehe]) 
{ 
   Spielfeld[3][3] = '5'; 
}


schonmal danke für die Antworten!

Nelrim
Auch der längste Weg beginnt mit einem ersten Schritt.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

6

14.02.2008, 19:05

"Globale Variablen sind böse!"

Es mag sein, dass globale Variablen nicht immer sinnvoll sind. Diese jedoch halte ich für einigermaßen tragbar. Bevor hier irgendjemand sagt: "Pack die Variablen in einen Namespace oder in eine Klasse oder struktur."
Ich denke hier kannst du die globalen Variablen durchaus verwenden, weil die Werte einfach global sind und überall und immer vorhanden sein müssen, wenn das Spielfeld verwendet wird.

Eine andere meiner Meinung nach sinnvollere Möglichkeit wäre das Nutzen von Makros.

C-/C++-Quelltext

1
2
#define BREITE 55
#define HOEHE 55


Dann wir deinfach jedes BREITE, das in deinem Code steht mir 55 ersetzt.

7

14.02.2008, 19:16

Konstante Variablen kann man ruhig global halten, wenn man auf die schnelle keine Lösung findet. Man kann sie von ausen ja nicht verändern, nur darauf zugreifen. Also würde ich mich darüber kein kopf machen.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

14.02.2008, 20:00

Zitat von »"raXor"«

Konstante Variablen...


Eben, es sind Konstanten (anmk. keine konstanten Variablen ;)) die, wie raXor bereits richtig erwähnte, nicht änderbar sind. Deshalb ist es eigentlich ganz egal ob sie global sind oder sonstwo untergebracht.
Allerdings finde ich die zweite Lösung von raXor ebenfalls schöner.
@D13_Dreinig

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

9

14.02.2008, 20:26

@Fred man sollte auch soweit möglich auf Makros verzichten, da sie meist kaum zu debuggen sind.

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

10

14.02.2008, 20:47

Ich weiß, aber in dem Fall bevorzuge ich ein Makro, weil die Wahrscheinlichkeit, dass ein Fehler in diesem Makro lieg ist äußerst gering ;)

Mir gefällt ein solches Makro von der Optik besser :)

Werbeanzeige