Zeiger auf Struktur? Oder Funktionsparameter?



  • Hi Community!
    Ich habe eine frage bezüglich Zeiger.
    Das ist ein Beispiel aus dem Buch "C++ für Spieleprogrammierer".
    In dem Funktionsparameter von "NameAbfragen" richtet er doch einen
    Pointer auf S_Spieler, oder versteh ich das falsch?
    Wie schaut sowas außerhalb eines Funktionsparameters aus?
    Ich sehe hier nur den Zeiger "pSpieler"
    der nirgends vorkommt, außer in den Funktionsparameter und in der
    Funktion.
    Er ist nicht global deklariert oder so.. 😉
    Ich hoffe ihr versteht was ich versuche zu sagen.

    Bin einfach noch ein Anfänger, und versteh auf einmal gar nichts mehr,
    seit dem Beispiel 🙄

    Danke im Vorraus!

    // C++ für Spieleprogrammierer
    // Listing 6.6
    // Verbesserte Version von Listing 6.1
    //
    #include <iostream>
    
    using namespace std;
    
    // Strukturen
    //
    struct S_Spieler
    {
    	int Energie;
    	int Punkte;
    	int xPosition;
    	int yPosition;
    	char Name[30];
    };
    
    // Prototypen
    //
    void NameAbfragen (S_Spieler *pSpieler);
    
    // Hauptprogramm
    //
    int main ()
    {
    	// Variablen
    	//
    	S_Spieler Spieler1;
    
    	// Spieler initialisieren
    	Spieler1.Energie = 1000;
    	Spieler1.Punkte = 0;
    	Spieler1.xPosition = 0;
    	Spieler1.yPosition = 0;
    	Spieler1.Name[0] = '\0';
    
    	// Name des Spielers abfragen
    	NameAbfragen (&Spieler1);
    	cout << "Neuer Spieler: " << Spieler1.Name << endl;
    
    	return 0;
    }
    
    // NameAbfragen
    //
    // Aufgabe: Name des Spielers abfragen
    //
    void NameAbfragen (S_Spieler *pSpieler)
    {
    	// Name abfragen
    	cout << "Name des Spielers: ";
    	cin.get (pSpieler->Name, 29);
    
    } // NameAbfragen
    


  • Falsches Forum - hier ist C++/CLI, dein Code ist C++.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • void NameAbfragen (S_Spieler *pSpieler);
    

    ist eine Funktionsdeklaration.
    Die Funktion erwartet als Parameter einen Zeiger auf ein Objekt des Typs S_Spieler. Der Name des parameters, pSpieler, ist nur zur Besseren Lesbarkeit da. Der Compiler ignoriert diesen.

    Die Funktion muss noch definiert werden, das ist der Teil unterhalb der main().

    void NameAbfragen (S_Spieler *pSpieler) 
    { 
        // Name abfragen 
        cout << "Name des Spielers: "; 
        cin.get (pSpieler->Name, 29); 
    
    } // NameAbfragen
    

    hier hat der Zeiger den gleichen Namen wie in der Deklaration, er könnte aber auch einen anderen haben. Um das übergebene Objekt zu nutzen, wie hier den Zeiger MUSS der Name in der Definition vorhanden sein.

    Übrigens ist das Beispiel glaube ich nicht korrekt.
    Ich denke,

    cin.get(char* p, streamsize n)
    

    liest bis zu n-1 zeichen ein, um noch ein '\0' anhängen zu können.
    Das heißt also, du füllst, angenommen, der Name des Spielers ist wirklich so lang, das Chararray bis 27 (Name[0] - Name[n - 2])
    mit der Null (Name[28]) ist dann noch ein Zeichen frei.

    es müsste also eigentlich heißen:

    cin.get(pSpieler->Name,30);
    

    p.s. nimm lieber std::string!

    Edit: Hab ich vergessen:

    Wie schaut sowas außerhalb eines Funktionsparameters aus?

    eigentlich nicht groß anders:

    // ...
    S_Spieler einSpieler;                // Objekt anlegen
    S_Spieler* pSpieler = &einSpieler;    // Zeiger auf Objekt
    


  • @Hyde++
    Dir fehlt ein '*' in der letzten Zeile.



  • danke!



  • Wow Danke!
    War wirklich verwirrt.
    Jetzt versteh ichs 😃

    Danke Hyde++ und Caligulaminus!!



  • Auch wenn der Thread schon alt ist passt er zu meinem Problem. Ich hätte zu dem Fall mal eine Verständnis Frage.

    Übergibt der Pointer hier alle Werte der Struktur? das wird im Buch nämlich nicht wirklich geklärt.

    Es wird ja der Pointer für Spieler1 in Zeile 40 übergeben aber das ist doch eine ganze Gruppe von Variablen. Der Pointer bezieht sich also nicht spezifisch auf Spieler1.Name. Könnte ich jetzt also in der Funktion jede der 5 Variablen über den Pointer verändern?



  • Hättest du doch auch nen eigenen Thread starten können statt so ein 5 Jahre alten Thread wieder auszugraben... Zu deiner Frage: Ein Pointer übergibt nichts, sondern zeigt auf etwas. In diesem Fall auf auf eine Struktur S_Spieler. Man kann also wie du schon vermutet hast auf alle Variablen in dieser Struktur zugreifen und diese auch verändern.



  • Danke, dann hab ich das ja doch bisher alles richtig verstanden 🙂


Anmelden zum Antworten