C++ Aufgabe Pointer und Referenzen in Verbindung mit Funktionen

Status
Für weitere Antworten geschlossen.

1337hAx'

Lt. Junior Grade
Registriert
Juli 2012
Beiträge
338
Code:
#include <iostream>
using namespace std;

//Prototypen:
void ladeLevel(const int Level);
void berechnePunkte(int &Punkte);
void zeigeSpieler(int &Energie, int &Punkte, int &Level);

int main ()
{
	//Struktur:
	struct S_Spieler
	{
		int Energie;
		int Punkte;
		int Team;
	};

	//Variablen:
	S_Spieler Spieler1;
	int Level = 1;
	Spieler1.Punkte = 275;
	Spieler1.Energie = 15;
	Spieler1.Team = 1;


	//Pointer
	int *pPunkte = NULL;
	pPunkte = Spieler1.Punkte;

	//Referenzen:
	int &rPunkte = Spieler1.Punkte;
	int &rEnergie = Spieler1.Energie;
	int &rTeam = Spieler1.Team;


	void ladeLevel(const int &Level);
	void berechnePunkte(int &Punkte);
	void zeigeSpieler(int &Energie, int &Punkte, int &Level);

	return 0;
}

void ladeLevel(const int Level)
{
	cout << "Level: " << Level << endl;
}

void berechnePunkte (int &Punkte)
{
	Punkte += 500;
	cout << Punkte;
}

void zeigeSpieler (int &Energie, int &Punkte, int &Level)
{
	cout << "Spieler1: \n\n";
	cout << "Level: " << ladeLevel << endl;
	cout << "Punkte: " << Punkte << endl;
	cout << "Energie: " << Energie << endl;
};

Ich verstehe grade nicht so ganz, was ich falsch gemacht habe.
Ich glaube da habe ich ein paar Sachen mit Funktionen/Zeigern/Referenzen vertauscht, aber das Thema war irgendwie unverständlich beim ersten mal lesen, eigentlich dachte ich, dass ich alles richtig gemacht hätte...
 
Zuletzt bearbeitet:
1. was willst du eigentlich machen
2. probier mal die ganzen warnings im code wegzubringen, oder hast du nichtmal probiert das zu kompilieren

3. gleich mal eine Korrektur...
//Pointer
int *pPunkte = NULL;
pPunkte = &Spieler1.Punkte;
 
1. Ich will 3 Funktionen erstellen und aufrufen, die einerseits über Pointer die Punkte berechnen sollen und andererseits über Referenzen die Daten von Spieler1 ausgeben sollen. Die Funktion ladeLevel soll eigentlich nur das Level ausgeben, also ganz ohne Zeiger oder Referenzen, weil der Rechenaufwand ja eigentlich der gleiche ist, oder?
2. Habe ich vorhin die ganze Zeit, da wurden auch keine angezeigt. Danach habe ich n bisschen was verändert ->
Code:
EDIT: Fehler behoben, trotzdem nicht das gewünschte Resultat. Jetzt wird wirklich kein Fehler angezeigt.

[CODE]
// C++ für Spieleprogrammierer
// Listing 6.9
// Lösungsvorschlag zur Aufgabe in Kapitel 6
//
#include <iostream>

using namespace std;

// Strukturen
//
struct Spieler
{
	int Energie;
	int Punkte;
	int Team;
};

// Prototypen
//
void BerechnePunkte (Spieler *pSpielerTemp, const int Bonus);
void ZeigeSpieler (const Spieler &SpielerTemp);
void LadeLevel (const int NeuesLevel);

// Hauptprogramm
//
int main ()
{
	// Variablen
	//
	Spieler Spieler1;
	int Level = 1;

	// Spieler initialisieren
	Spieler1.Energie = 1000;
	Spieler1.Punkte = 0;
	Spieler1.Team = 1;

	LadeLevel (Level);
	ZeigeSpieler (Spieler1);
	BerechnePunkte (&Spieler1, 550);
	ZeigeSpieler (Spieler1);

	return 0;
}

// BerechnePunkte
//
// Punkte des Spielers mit Bonus verrechnen
//
void BerechnePunkte (Spieler *pSpielerTemp, const int Bonus)
{
	// Bonus zu den Punkten des Spielers hinzuzählen
	cout << "Es gibt " << Bonus << " Bonuspunkte" << endl;
	cout << endl;

	pSpielerTemp->Punkte += Bonus;

} // BerechnePunkte

// ZeigeSpieler
//
// Spielerdaten anzeigen
//
void ZeigeSpieler (const Spieler &SpielerTemp)
{
	// Alle Werte des Spielers auf dem Bildschirm ausgeben.
	//
	// Spielerwerte können hier nicht verändert werden.
	//
	cout << "Daten des Spielers:" << endl;
	cout << "Energie: " << SpielerTemp.Energie << endl;
	cout << "Punkte: " << SpielerTemp.Punkte << endl;
	cout << "Team: " << SpielerTemp.Team << endl;
	cout << endl;

} // ZeigeSpieler

// LadeLevel
//
// Neuen Level laden
//
void LadeLevel (const int NeuesLevel)
{
	// An dieser Stelle würde ein Level geladen,
	// was hier einfach durch einen Text angezeigt wird.
	//
	cout << "Level " << NeuesLevel << " geladen" << endl;
	cout << endl;

} // LadeLevel

Das ist anscheinend die Musterlösung dazu, aber ich blick' die nicht ganz..
Hat der jetzt nen Zeiger im Funktionskopf deklariert oder was? Und woher kommt jetzt die Variable Bonus? Als ich das erstmal selber 1 zu 1 abgetippt habe, hat's nicht funktioniert. Und warum nennt er den Pointer *pxyzTemp?
 
Zuletzt bearbeitet:
Ja, in BerechnePunkte hat er einen Zeiger aufn Spieler. In der main wird dann die Adresse des Spieler1 mit dem Adressoperator geholt und an diese Funktion übergeben.

Und das mit dem Temp soll wohl akademisch ganz besonders wertvoll erscheinen, um zu zeigen, dass die Variable selber nur in der Funktion gueltig ist. 'p' schreiben manche Programmierer an den Anfang ihrer Bezeichner, um zu verdeutlichen, dass es ein Zeiger(Pointer) ist, genauso wie manche Menschen h an den Anfang von Handles schreiben.

Und gewöhn dir lieber direkt an, Variablenbezeichner klein zu schreiben, machen die meisten so.
 
Zuletzt bearbeitet:
Meinst du den ersten Buchstaben? Habe ich mir eigentlich auch so angeeignet, aber ich wollte das mal eins zu eins abtippen, und das ist dabei rausgekommen..
Kann ich mir irgendwo nochmal in einfacher Sprache das Thema Pointer/References durchlesen? Das Prinzip habe ich absolut verstanden, nur schleichen sich da immer noch Syntax fehler ein.
 
Hmm, wenn du irgendwo an Vorlesungsunterlagen rankommst, dann da reinschauen. Ansonsten lesen und vor allem: programmieren, programmieren, programmieren. Das Verständnis kommt auch durch Erfahrung.

Ich habs damals am besten gelernt, indem ich mir vergegenwärtigt habe, dass ein Zeiger nichts weiter als ne Speicheradresse ist und man sich mit *zeiger anschaut, was denn an dieser Stelle eigentlich im Speicher lauert.

Und nochn Tipp ausm Nähkästchen, der hiermit nicht direkt was zu tun hat: Zeiger immer von hinten lesen, das vereinfacht das Raffen von constness ungemein.

int const * const variable = "(lautspr: ) "variable" isn konstanter Zeiger aufn konstanten int"
 
Womit fängt man eigentlich am besten bei einem Programm an? Also systematisch. Ich mache das nämlich immer ein bisschen verplant, so nach dem Motto. Hier ne Funktion, dann oben den Prototypen, dann in der Mitte wieder ne Variable, dann hier ne Struktur. Gibt da doch nen besseren Weg, oder?

Ich werde gleich nochmal sowas ähnliches Schreiben, damit ich die Übung drinne habe.
Wie ist das jetzt:
Zeiger deklarieren:
*NAME = NULL (bspw)
dann zuordnen? NAME = &ZIEL
und kann ich dann einfach, z.B. bei
int ZIEL = 50;
NAME += 50;
cout << *NAME;
und es müsste 100 rauskommen? Das ist mir nämlich noch nicht so ganz klar. Das & symbolisiert ja die Adresse im Speicher, aber nicht den Inhalt. Kann man den Inhalt über das * bearbeiten?

Und bei Referenzen:
int ETWAS = 20
&REFERENZ = ETWAS;
REFERENZ += 50;
cout << ETWAS;
kommt dann 70 raus?

Und wie ist das dann mit den Datentypen? Wann müssen sie angegeben werden, wann nicht?
 
1337hAx' schrieb:
Ich werde gleich nochmal sowas ähnliches Schreiben, damit ich die Übung drinne habe.
Wie ist das jetzt:
Zeiger deklarieren:
*NAME = NULL (bspw)
dann zuordnen? NAME = &ZIEL

Wenn es möglich ist, würde ich in einem Schritt deklarieren und gleich den Wert zuweisen (also das mit NULL-Vorbelegen einsparen). Beispiel:

Code:
int ziel = 12345;
int* zeiger = &ziel; /* <-- Wozu erst auf NULL zeigen lassen, wenn du den Pointer auch gleich auf sein Ziel zeigen lassen kannst? */

1337hAx' schrieb:
und kann ich dann einfach, z.B. bei
int ZIEL = 50;
NAME += 50;
cout << *NAME;
und es müsste 100 rauskommen? Das ist mir nämlich noch nicht so ganz klar. Das & symbolisiert ja die Adresse im Speicher, aber nicht den Inhalt. Kann man den Inhalt über das * bearbeiten?

Wenn deine NAME-Variable ein Zeiger sein sollte, dann inkrementiert der Ausdruck

Code:
NAME += 50;

nicht den Wert der Variablen, auf die der Pointer NAME zeigt, sondern den Zeiger selbst. Wenn du den referenzierten Wert selbst lesen oder schreiben möchtest, mußt du den Pointer mit dem Dereferenzierungs-Operator (also dem *) dereferenzieren:

Code:
*NAME += 50;


1337hAx' schrieb:
Und bei Referenzen:
int ETWAS = 20
&REFERENZ = ETWAS;
REFERENZ += 50;
cout << ETWAS;
kommt dann 70 raus?

Ja, wobei den Code natürlich so syntaktisch nicht ganz korrekt ist (aber ich nehme an, das sollte eh nur Pseudo-Code sein).

1337hAx' schrieb:
Und wie ist das dann mit den Datentypen? Wann müssen sie angegeben werden, wann nicht?

Nur bei der Deklaration. Damit sagst du dem Compiler einmalig "Schau her, hiermit führe ich eine Variable blubbersuelz ein. Sie soll vom Typ so und so sein."
Taucht die Variable später wieder auf, weiß der Compiler an Hand der bereits erfolgten Deklaration ja bereits, von welchem Typ sie ist.
 
Zuletzt bearbeitet:
Dann mache ich mich nochmal an ein ähnliches Programm, danke!

Code:
#include <iostream>
using namespace std;

//Protos
void berechnePunkte (Spieler *berechnung, const int Bonus);
void zeigeSpieler(const Spieler &referenz);
void ladeLevel(const int Level);

//Struktur
struct Spieler
	{
		int Energie;
		int Punkte;
		int Team;
	};

int main ()
{
	//Variablen:

	Spieler Spieler1;
	Spieler1.Energie = 500;
	Spieler1.Punkte = 1000;
	Spieler1.Team = 1;
	int Level = 1;

	cout << "hi" << endl;

	ladeLevel (Level);
	zeigeSpieler (Spieler1);
	berechnePunkte (&Spieler1, 550);
	zeigeSpieler (Spieler1);


	return 0;
}

void ladeLevel(const int Level)
{
	cout << "Level: " << Level << endl;
}

void berechnePunkte (Spieler *berechnung, const int Bonus)
{
	berechnung->Punkte += Bonus;
	cout << "So viel Bonus: " << Bonus << endl;
}

void zeigeSpieler (const Spieler &referenz)
{
	cout << "Spielerdaten: \n\n" << endl;
	cout << "Energie: " << referenz.Energie;
	cout << "Punkte: " << referenz.Punkte;
	cout << "Team: " << referenz.Team;
}

Wo ist der Fehler Q_Q

Fehlermeldungen:
Code:
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(5): error C2065: 'Spieler': nichtdeklarierter Bezeichner
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(5): error C2065: 'berechnung': nichtdeklarierter Bezeichner
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(5): error C2059: Syntaxfehler: 'const'
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(6): error C2143: Syntaxfehler: Es fehlt ',' vor '&'
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(30): error C2664: 'zeigeSpieler': Konvertierung des Parameters 1 von 'Spieler' in 'const int' nicht möglich
1>          Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(31): error C3861: "berechnePunkte": Bezeichner wurde nicht gefunden.
1>c:\users\NAME\desktop\c++\projekte\consoleapplication14\quelle.cpp(32): error C2664: 'zeigeSpieler': Konvertierung des Parameters 1 von 'Spieler' in 'const int' nicht möglich
1>          Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht aufgerufen werden
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
Zurück
Oben