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

11.09.2009, 21:09

Newbie-Frage: char-array als Referenz übergeben?

Guten Abend zusammen,

ich bräuchte kurz einmal eure Hilfe. Ich schreibe gerade ein simples kleines Konsolenspiel, in dem der Standort der Spielfiguren als Zeichen in einem char-Array gespeichert wird. Das Zeichnen des Spielfelds übernimmt die Funktion DrawScreen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const int XRange=50, YRange=24;

void DrawScreen(char Spielfeld[XRange][YRange]);

int main(){

char Spielfeld[XRange][YRange];
//Spielfeld mit Zeichen füllen, 

//dann anzeigen

DrawScreen(Spielfeld);
//weiterer Code

return 0;
}

void DrawScreen(char Spielfeld[XRange][YRange]){
//Indizes durchlaufen und per cout ausgeben

}


Meine Frage wäre jetzt, ob es auch möglich ist, das Array nicht als Kopie über den Stack zu übergeben, sondern als Referenz? Bei der geringen Größe ist es zwar noch ziemlich unerheblich, in welcher Form man das Array übergibt, aber aus Prinzip würde ich es gerne als Referenz machen - bin bisher jedoch nicht erfolgreich gewesen.
Für Hilfe wäre ich dankbar!

Viele Grüße,
PPretzel

2

11.09.2009, 21:12

So wie du es gerade machst, wird das eh als Zeiger übergeben, was genau so effizient wie eine Referenz wäre.
Du könntest allerdings die Benutzung von std::vector in Betracht ziehen, die sind schon sehr viel komfortabler.
Lieber dumm fragen, als dumm bleiben!

3

11.09.2009, 21:25

Ok... Vielen Dank für die Antwort! Stillschweigend einfach ein Zeiger draus gemacht. Aber wieso brauch ich dann keinen Derefenzierungsoperator, wenn ich den Array auslesen will?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

11.09.2009, 21:49

Die Dereferenzierung ist im Zugriff über [] schon "enthalten" ;)

5

11.09.2009, 22:54

Zum Thema Vektoren als Funktionsparameter hätte ich gleich die nächste Frage :? :

Ich habe einige Instanzen meiner Klasse CRobot in einem Vektor innerhalb von main(). Jetzt möchte ich, dass die Funktion NewGame bei sämtlichen CRobot-Instanzen die Funktion CRobot::Place aufruft.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CRobot
{
public:
void Place(){bla}
}

int main (){
vector<CRobot> Robot(5);
vector<CRobot>::iterator i;
NewGame();
}

void NewGame()
{
for (i=Robot.begin(); i<Robot.end(); i++)
{
i->Place();
}
}


Wie mache ich NewGame() jetzt klar, was ich mit i meine?
Vielen Dank für eure Hilfe!
PPretzel

6

11.09.2009, 23:49

Hm?
i ist doch einfach nur ein vector<CRobot>::iterator. Ansonsten kennt NewGame ja im Moment Robot gar nicht. Eleganter könnte man das freilich lösen, wenn Robot ein Element einer Game Klasse wäre und innerhalb derer dann eine Memberfunktion NewGame() existieren würde.
Die Schleife über alle Objekte im Vektor kann man auch mit Boost Foreach eleganter machen.
Lieber dumm fragen, als dumm bleiben!

7

12.09.2009, 00:00

Vielleicht war das von mir unklar ausgedrückt. Bis jetzt weiß NewGame weder von Robot noch von i irgendwas.
Und genau deshalb wollte ich hier fragen, auf welche Weise ich das jetzt NewGame am besten mitteile, so dass ich dann innerhalb von NewGame über i->Place() die Memberfunktion aufrufen kann und NewGame weiß, was gemeint ist.

Und wegen dem sinnvollen Anlegen von Klassen: Gibt es da Tutorials oder Artikel, in denen man darüber mehr lernen könnte?

8

12.09.2009, 00:22

Zitat von »"ppretzel"«


Und wegen dem sinnvollen Anlegen von Klassen: Gibt es da Tutorials oder Artikel, in denen man darüber mehr lernen könnte?

Das meiste macht da die Erfahrung, irgendwelche guten Texte über OOD kann ich grade nicht nennen.

Den Iterator solltest du in der Funktion einfach neu erstellen und naja, den Vector könnte man als Parameter übergeben, aber ich fände es eigentlich schöner wenn er ein Klassenmember einer Game Klasse wäre.
Lieber dumm fragen, als dumm bleiben!

9

12.09.2009, 12:52

Tut mir Leid, ich steh schon wieder vorm Berg. Bin bisher mit Vektoren nur durch das Buch von Heiko Kalista "vertraut", und dort werden nur vector<int>-Beispiele gebracht, keine Klassen.

Hab deinen Rat befolgt und eine Klasse CGame geschrieben, die einen Vektor mit Robot-Instanzen enthält und möchte nun, dass der Konstruktor die Anzahl Roboter-Instanzen erstellt, die er per Parameter bekommt und gleich anschließend für die erstellte Instanz die Funktion CRobot::PlaceRandomly() aufruft.

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
class CRobot
{
public:
void PlaceRandomly();
}

class CGame
{
vector<CRobot> vRobot;
vector<CRobot>::iterator i;

public:
CGame(int Robots)
{
//wie bringe ich dem Konstruktor jetzt bei, die als Parameter übergebene Anzahl an CRobot-Instanzen zu erzeugen und die Funktion aufzurufen?

}

int main()
{
int Robots;
cin >> Robots;
CGame Game(Robots);
}
[/cpp]

Ich schaffe es gerade irgendwie nicht. Habe schon verschiedene Ansätze versucht, die aber alle an Compiler-Fehlern gescheitert sind. Bevor ich das jetzt lang beschreibe, ist es wahrscheinlich geschickter, wenn mir jemand kurz den passenden Code postet... Vielen Dank!
PPretzel

10

12.09.2009, 13:06

Als erstes: Mach den iterator bitte nicht zu einem Klassenmember, erstelle den lokal, wo du den brauchst. Ich habe früher einmal das selbe gemacht, mit dem Ergebnis, dass eine Memberfunktion für alle Objekte eine andere Funktion aufgerufen hat, die irgendwie den iterator auch benutzt hat, wodurch er von 2 Stellen gleichzeitig benutzt wurde, was zu enorm merkwürdigen Ergebnissen führte. Als ich den Fehler nach Stunden fand, beschloss ich nie wieder Iteratoren zu Klassenmembern zu machen ;-)

Zu deinem Code:

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
class CRobot
{
public:
   void PlaceRandomly();
}

class CGame
{
    vector<CRobot> vRobot;
    //Iteraotr entfernen


public:
    CGame(int Robots)
    {
        //Lösung:

       vRobot.resize(Robots);
       for(unsigned int i=0, i<Robots.size(); ++i)//für vectoren brauch man nicht unbedingt iteratoren

            vRobots[i].PlaceRandomly;
      
        
    }
};//Schließende Klammer und Semikolon vergessen!


int main()
{
int Robots;
cin >> Robots;
CGame Game(Robots);
}
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige