C++ Ein paar Fragen zu C++

liegt es vlt auch daran das ich return 0; vergessen habe? ist mir gerade noch eingefallen

Der Returnwert in der Main dient zur Prozesskommunikation und ist nur für andere Prozesse interessant, welche den Prozess überwachen. Denn dadurch können sie feststellen, ob der Prozess das Ausführen erfolgreich beendet hat oder auf einen Fehler gestoßen ist.

Strg + F5 führt das Programm ohne Debuggerunterstützung aus.

Ah ok danke, kenne die Hotkeys von VS leider nicht so gut.
 
adeliiix schrieb:
Habe ich irgendwas falsch gemacht?

Der Tipp von asdfman mit dem Debugger ist gut. Wenn du Schritt für Schritt jeder Zeile durch gehst, dann siehst du genau welche Zeile Probleme macht und dann kannst du dir Gedanken darüber machen warum. Das es falsch ist und du das nicht machen solltest habe ich in meinem letzten Beitrag schon erwähnt. Kleiner Tipp: Es war weiter unten im Post.

Dort stand auch schon drin was das new int(1) macht, aber das hat dir Nai ja nochmal genauer erklärt.
 
ich habe das in meinem buch nicht genau gefunden.
& das benutze ich wenn ich die adresse wo die variable gespeichert ist ansprechen möchte oder?
und * und einfch nur pEnergie ohne was vor wann verwende ich die?
 
Genau, mit dem & bekommst du die Adresse der Variablen. Wenn du einen Zeiger hast ohne * hast du die Adresse. Wenn du den Dereferenzierungsoperator * (danach kannst du auch suchen) davor schreibst hast du den Wert.
 
von was die adresse ohne *?
Ergänzung ()

Das new gibt dir die oben beschriebene Speicheradresse zurück, wo dein Speicher anfängt. Somit hast du nun in der pEnergie nicht mehr 0 drin stehen sondern irgendeine Speicheradresse. Da steht aber nur drin wo dein Speicher anfängt, wo er endet weißt du über den typ.
das wurde zu diesem abschnitt geschrieben:
pEnergie = new int;

aber
Das new gibt dir die oben beschriebene Speicheradresse zurück, wo dein Speicher anfängt
wo bringt mir diese adresse was? muss ich wissen welche das ist?
Da steht aber nur drin wo dein Speicher anfängt, wo er endet weißt du über den typ.
was bringt mir das zu wissen wo der resservierte speicher anfäängt und wo er endet?
und wo endet der speicher? bie int ist das dann bei 4 byte?
 
Ich finde, du missbrauchst dieses Forum als deine persönliche Vorlesung. Wenn wir das für dich sein sollten, wäre eine angemessene Bezahlung angebracht.
 
Zumindest hab ich manchmal das Gefühl, dass du die Links und Quellen nicht liest oder nur einmal drüber scrollst, kA. Da ich es verbrochen habe versuch ich das nochmal aus der Welt zu räumen.

Guck dir doch den Link den ich dir schon einmal gepostet hatte (noch)mal an:

http://www.cplusplus.com/doc/tutorial/pointers/

Die ersten 2 Beispiele mit Bildern. Da siehst du was im Code steht und der Speicher ist in den Bildern gezeigt. Das erklärt auch deine Fragen.

- Grundsätzlich speichert ein Zeiger eine Adresse
- Diese kann von einer anderen Variablen sein, z.B. durch das &.
- Oder eine Adresse im Speicher sein, den du dir manuell geholt hast. Der einzige Unterschied ist der, dass du den Speicher wieder manuell freigeben musst.
- Zeiger, die du nicht verwendest, solltest du auf 0 setzen damit du das auch erkennen kannst. Du darfst aber den Wert erst abfragen wenn er auf eine Speicheradresse zeigt.

Das mit der dem Anfang und der Größe war vermutlich eher verwirrender als Hilfreich ..., das ist eher Hintergrundwissen. Du könntest auch sagen: new reserviert mir Speicher und gibt mir die Adresse zurück. Das ist auch nichts anderes als &. Da bekommst du auch einfach eine Adresse, nur das du dich bei new selber darum kümmern musst den Speicher auch wieder frei zu geben.
 
wo bringt mir diese adresse was? muss ich wissen welche das ist?
In dem meisten Fällen ist dir der Wert der Addresse auf die ein Zeiger zeigt (abgesehen es ist der NULL Zeiger) an sich egal. Also zum Beispiel brauchst du nicht zu Wissen ob dir new gerade den Wert 66666666 oder 12345679 als Adresse zurückgibt. Du musst nur Wissen, dass an dieser zurückgegebene Adresse der entsprechende Wert steht. Aber es gibt seltene Fälle wo die genaue Adresse doch "interessant" ist, wie zum Beispiel wenn man etwas an Cache Lines alignen will.


was bringt mir das zu wissen wo der resservierte speicher anfäängt und wo er endet?
und wo endet der speicher? bie int ist das dann bei 4 byte?

Ein gutes Beispiel hierfür ist eine Memcopyfunktion, die Speicher nach Adresse A nach Adresse B kopiert:

void * memcpy ( void * destination, const void * source, size_t num );

Diese Funktion benötigt einen Zeiger für die Zieladresse ( void * destination), für die Ursprungsadresse ( const void * source,) und die größe des Speicherbereichs (size_t num) der kopiert werden soll.
 
Zuletzt bearbeitet:
das eine beipsiel mit new habe ich jetzt verstanden aber warum wird das jetzt hier so komishc gemachtin zeile 69?
Code:
#include <iostream>

using namespace std;

// Klassen
//
class CSpieler
{
	private:

		// Membervariablen
		char m_Name[30];
		int  m_Energie;

	public:

		// Memberfunktionen
		void Init ();
		void ZeigeDaten ();
};

// Init
//
// Aufgabe: Spieler initialisieren
//
void CSpieler::Init ()
{
	// Abfrage des Namens
	cout << "Bitte Spielernamen eingeben: ";

	cin.ignore ();
	cin.get (m_Name, 29);

	// Volle Energie
	m_Energie = 1000;

} // Init

// ZeigeDaten
//
// Aufgabe: Spielerdaten anzeigen
//
void CSpieler::ZeigeDaten ()
{
	cout << "Name   : " << m_Name << endl;
	cout << "Energie: " << m_Energie << endl;
	cout << endl;

} // ZeigeDaten

// Hauptprogramm
//
int main ()
{
	// Variablen
	//
	CSpieler *pSpielerliste = NULL;
	int AnzahlSpieler = 0;

	// Anzahl der Spieler abfragen
	cout << "Wie viele Spieler: ";
	cin >> AnzahlSpieler;

	// Instanzen auf dem Heap erzeugen
	pSpielerliste = new CSpieler[AnzahlSpieler];

	// Namen aller Spieler abfragen
	for (int i=0; i<AnzahlSpieler; i++)
	{
		cout << "Spieler " << i+1 << endl;
		pSpielerliste[i].Init ();
		cout << endl;
	}

	// Liste der Spieler ausgeben
	cout << "Folgende Spieler sind mit von der Partie:" << endl;

	for (int j=0; j<AnzahlSpieler; j++)
	{
		cout << "Spieler " << j+1 << endl;
		pSpielerliste[j].ZeigeDaten ();
	}

	// Speicher freigeben
	delete[] pSpielerliste;
	pSpielerliste = NULL;

	return 0;
}
[/Spoiler]

also warum ist da nicht auch pAnzahlspieler = new int ?
 
Ich finde nicht das ich es missbrauche da das hier ein forum ist indem man fragen stellen soll.
Ja ich stelle mich vielleicht einbischen blöd and und deswegen artet der thread vlt ein bischne aus.
Aber bezahlen werde ich keinen, jedoch bin ich wirklich sehr dankbar für die tolle und hilfreiche antworten.
Du kanst wenn du nicht antworten möchtest dieses thema einfach ignorieren.

Wenn mann etwas kann kann man vlt nicht verstehen warum andere solche Probleme damit haben.
 
ja sry im buch was es zeile 69 weil oben immer noch einbischen text steht
Ergänzung ()

also zeile 65 meine ich
 
da wird nen Array angelegt.

ich gebe dem Thread noch höchstens 2 Wochen, dann wird dir niemand mehr antworten.
 
kann ich ehrlich gesagt verstehen, nur verstehe ich nicht warum alle auf einem so rumhakken nur weil man fragen hat...
Ergänzung ()

nai das versthe ich ja aber
pSpielerliste = new CSpieler[AnzahlSpieler];
ist CSpieler ein datentyp? weil man muss doch nach new den datentypen angeben
 
meinste c++ oder was ist cpp?
und ist in diesem beispiel pSpielerliste = new CSpieler[AnzahlSpieler];
mit dem hier [AnzahlSpieler] gemeint, dass der speicher für alle spieler reserviert wird?
weil eig müsste doch auch nur new CSpieler reichen oder?
 
Der Grund, warum hier einige langsam genervt sind ist, dass du eben immer wieder mit den absoluten Basics ankommst, die dir eigentlich jedes Buch erklären können sollte. Meine Erklärung (und anscheinend auch die vieler Anderer) ist, dass du dich einfach nicht sonderlich mit dem Thema beschäftigst bzw. dir keiner Mühe gibst. Anders kann ich mir nicht erklären, wieso du bei jeder kleinen Frage direkt das Forum hier bemühst.
Programmieren lernen bedeutet zu lernen, wie man ein Problem angehen kann. Daran solltest du definitv arbeiten.

Was haben denn bisher die eckigen Klammern immer bedeuted? Hatte das nicht etwas mit einem Array zu tun? Was passiert bei New, wenn ich es auf ein Array anwende? Ja es wird ein Array erzeugt. Wo wäre jetzt das Problem gewesen die 2min zu investieren und das einfach mal im Code auszuprobieren? Stattdessen hast du die 2min genutzt, um hier eine Frage zu stellen.

Hast du dir schonmal die Dateiendung von C++-Dateien angeguckt? Da steht cpp, weil C++ = C-Plus-Plus gesprochen wird und deshalb auch oft mit cpp abgekürzt wird.

Zeile 70 finde ich übrigens auch sehr ungünstig bzw. das, was in der aufgerufenen Klasse passiert. Daten und IO würde ich immer trennen.
 
ok vielen dank.
das mit dem array wurde leider nicht in meinem buch erklärt.
Wie kann man sowas denn im code ausprobieren?
mit dem debugger? irgendwie funktionioert der noch nicht so ganz bei mir.
muss ich am wochenende mal gucken
 
Zurück
Oben