Habe ein Problem mit dem Zeiger in C++



  • @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:

    das was du kopiert hast ist bei mir der richtig geschriebene Code!

    BerechnePunkte

    Is klar



  • ich will hir niemanden verappeln ich meins ernst



  • @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:

    ich will hir niemanden verappeln ich meins ernst

    Jaja.

    Auch aus deinem Code kopiert: Berechnepunkte (&Punkte, Bonuspunkte);

    Und auch:

    struct S_Spieler { int Energie, *pPunkte, Team; };
    (...)
    S_Spieler Spieler1;
    Spieler1.Punkte = 400;
    

    Dabei hat die Struct gar keine Punkte. Das kompiliert nicht.

    Verarschen kann ich mich alleine.



  • @wob sagte in Habe ein Problem mit dem Zeiger in C++:

    @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:

    ich will hir niemanden verappeln ich meins ernst

    Jaja.

    Auch aus deinem Code kopiert: Berechnepunkte (&Punkte, Bonuspunkte);

    Und auch:

    struct S_Spieler { int Energie, *pPunkte, Team; };
    (...)
    S_Spieler Spieler1;
    Spieler1.Punkte = 400;
    

    Dabei hat die Struct gar keine Punkte. Das kompiliert nicht.

    Verarschen kann ich mich alleine.

    tut mir leid, ich hab denn PC neugestartet und hab das Projekt von vorhin mit dem gleichen Code geöffnet, jetzt wurde mir aber angezeigt das bei BerechnePunkte die Funktionsdefinition nicht gefunden wurde und es lässt sich auch nicht kompilieren, obwohl das vorher funktionierte und nichts angezeigt wurde kp. Muss mit dem Virenscanner zusammenhängen, ich schreib einfach denn code komplett neu aber langsam hab ich keinen Bock mehr, ich hab geschaut ich bin mir absolut sicher das BerechnePunkte überall richtig geschrieben wurde, was solls vielen dank für eure Hilfe.

    Edit.: Ich hab jetzt noch nen Screenshot online gestellt, der zeigt das der Code denn ihr kopiert habt richtig geschrieben ist. https://ibb.co/SfNdV3V

    und noch einen denn manni66 sein post zeigt: https://ibb.co/xfX1wQP

    Vielleicht ists ja doch mein Fehler und ich bin einfach nur zu blöd es zu sehen und kapieren, ich weiss es auch nicht aber gute n8



  • @DasViereck
    Der Code, den Du zuletzt gezeigt hast:

    #include <iostream>
    
    using namespace std;
    
    void Berechnepunkte(int *pPunkte, int Bonuspunkte);
    struct S_Spieler { int Energie, *pPunkte, Team; };
    
    int main()
    
    {
    
    S_Spieler Spieler1;
    
    Spieler1.Punkte = 400;
    Spieler1.pPunkte = &Punkte
    Spieler1.Energie = 100;
    Spieler1.Team = 1;
    
    int Bonuspunkte = 150;
    
    Berechnepunkte (&Punkte, Bonuspunkte);
    
    cout << "Punkteausgabe: ";
    cout << Spieler1.pPunkte << endl;
    return 0;
    
    }
    
    void BerechnePunkte(int *pPunkte, int Bonuspunkte)
    {
    *pPunkte += Bonuspunkte;
    
    }
    

    Die Funktionsdeklaration in Zeile 5 lautet Berechnepunkte, die Definition in Zeile 29 aber BerechnePunkte, so kompiliert das nicht.

    Dein eigentliches Problem ist aber wohl der Umgang mit einem Zeiger, aber bei Deinem Vorhaben ist kein Zeiger erforderlich und Du solltest auch gar keinen benutzen!



  • @Belli sagte in Habe ein Problem mit dem Zeiger in C++:

    @DasViereck
    Der Code, den Du zuletzt gezeigt hast:

    #include <iostream>
    
    using namespace std;
    
    void Berechnepunkte(int *pPunkte, int Bonuspunkte);
    struct S_Spieler { int Energie, *pPunkte, Team; };
    
    int main()
    
    {
    
    S_Spieler Spieler1;
    
    Spieler1.Punkte = 400;
    Spieler1.pPunkte = &Punkte
    Spieler1.Energie = 100;
    Spieler1.Team = 1;
    
    int Bonuspunkte = 150;
    
    Berechnepunkte (&Punkte, Bonuspunkte);
    
    cout << "Punkteausgabe: ";
    cout << Spieler1.pPunkte << endl;
    return 0;
    
    }
    
    void BerechnePunkte(int *pPunkte, int Bonuspunkte)
    {
    *pPunkte += Bonuspunkte;
    
    }
    

    Die Funktionsdeklaration in Zeile 5 lautet Berechnepunkte, die Definition in Zeile 29 aber BerechnePunkte, so kompiliert das nicht.

    Dein eigentliches Problem ist aber wohl der Umgang mit einem Zeiger, aber bei Deinem Vorhaben ist kein Zeiger erforderlich und Du solltest auch gar keinen benutzen!

    Danke, ja es stimmt ich habe Berechnepunkte und BerechnePunkte geschrieben das ist der Fehler! hab nur geschaut weil einer geschrieben hat ich hätte BerechnePunke geschrieben^^

    Es müsste doch ein Fehler beim kompilieren auftreten, bei mir tat es das aber nicht! Erst nach dem neustart des PCs zeigte er einen Fehler an, bitdefender hat die Datei des Quellcodes schreibgeschützt könnte das die Ursache sein das zuerst kein Fehler beim Kompilieren auftrat?

    Und ich verwende denn Zeiger nur weil einer ausdrücklich bei der Aufgabe in meinem Buch verwendet werden soll.



  • @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:
    Dann vielleicht eher so:

    struct S_Spieler { int Energie, Punkte, Team; };
    

    ...

    S_Spieler Spieler1;
    
    Spieler1.Punkte = 400;
    Spieler1.Energie = 100;
    Spieler1.Team = 1;
    

    ...

    Berechnepunkte (&Spieler1.Punkte, Bonuspunkte);
    

    ...

    cout << Spieler1.Punkte << endl;
    

    Ansonsten muss doch vorher auch der Umgang mit Zeigern vermittelt worden sein?



  • Ja, es ist nur ein Kapitel das ich noch nicht verstehe, aber ich will es verstehen, so hab denn Code neu geschrieben, es wird nur ein Fehler bei += angezeigt. "kein Operator stimmt mit diesen Operanden überrein"

    #include <iostream>

    using namespace std;

    struct S_Spieler { int Energie; int Punkte; int Team;};
    void BerechnePunkte(S_Spieler * pSpieler, int Bonus);

    int main()

    {

    S_Spieler * pSpieler = 0;
    S_Spieler Spieler1;
    //Spieler initialisieren
    Spieler1.Energie = 100;
    Spieler1.Punkte = 400;
    Spieler1.Team = 1;
    int Bonus = 150;
    pSpieler = &Spieler1;
    
    BerechnePunkte(&Spieler1, Bonus);
    
    return 0;
    

    }

    void BerechnePunkte(S_Spieler* pSpieler,int Bonus)
    {
    *pSpieler += Bonus;
    }

    edit: möchte nur das in der Funktion 400 mit dem Bonus von 150 addiert wird



  • Ein Spieler ist ja auch ein Spieler und keine Zahl. Du willst vermutlich auf den Member BonusPunkte des Spielers zugreifen, also musst du pSpieler->BonuspSpieler->Punkte benutzen. Das Einkommen eines Fußballprofis wird ja auch auf dessen Bankkonto überwiesen und nicht auf den Spieler selbst.

    Edit: Punkte statt Bonus



  • @DocShoe sagte in Habe ein Problem mit dem Zeiger in C++:

    Ein Spieler ist ja auch ein Spieler und keine Zahl. Du willst vermutlich auf den Member Bonus des Spielers zugreifen, also musst du pSpieler->Bonus benutzen.

    Bonus ist eine eigene Integer Variable und nicht in der Struktur enthalten.

    Edit: Sag mal könntest du so nett sein und denn Code richtigstellen, so das ein Zeiger in der Funktion verwendet wird und in der Funktion einfach 400 mit 150 addiert wird?

    Im Buch sind ja ein paar Beispiele, aber bei denn meisten werden Referenzen verwendet, bei dieser Aufgabe soll ich aber einen Zeiger verwenden, ich kapiers einfach nicht wie man denn Code schreiben muss das ich dass kriege was ich ´will 😕



  • ich les mir grade die Grundlagen zu Zeiger online durch, denke das Prinzip kapier ich, ich will jetzt in der Funktion auf die gespeicherte Variable Punkte des Zeigers *pSpieler zugreifen und denn Wert mit der Variable Bonus addieren, wie müsste das richtig ausschauen?



  • @DasViereck pSpieler->Punkte += Bonus

    Punkte ist ein Member von S_Spieler und somit auch von *pSpieler

    Die Schreibweise mit -> ist identisch mit (*pSpieler).Punkte += Bonus



  • Einfach

    void BerechnePunkte(S_Spieler* pSpieler, int Bonus)
    {
        pSpieler->Punkte += Bonus;
    }
    

    Oder alternativ: (*pSpieler).Punkte += Bonus;



  • JA ICH HABS XD

    hatte nur noch einen kleinen Fehler bei meinem Code, habe geschrieben *pSpieler->Punkte += Bonus
    das * war Falsch, man schreibt es ohne, DANKE

    Warum darf das Sternchen nicht vorangestellt werden, könnt ihr mir das noch sagen?/Warum muss wenn man es macht, es in Klammern stellen?

    War ja ne schwere Geburt, danke für eure Hilfe, wusste einfach nicht wie man denn Befehl genau schreibt^^



  • @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:

    Warum darf das Sternchen nicht vorangestellt werden, könnt ihr mir das noch sagen?/Warum muss wenn man es macht, es in Klammern stellen?

    Es darf, es bedeutet dann halt etwas anderes. Die Rangfolge des vorangestellten *-Operators ist niedriger als die des .-Operators (vereinfacht gesagt), so dass *p.a immer *(p.a) bedeutet. Wenn man (*p).a meint, muss man zwingend die Klammern schreiben, oder den -> Operator benutzen.



  • In deinem Originalcode muß das Sternchen verwendet werden, weil du ja dort Punkte als Zeiger deklariert hattest (dieser aber nicht korrekt initialisiert wurde).

    Und bei (*pSpieler).Punkte (mit dem neuen Code, wo Punkte als intdeklariert ist) muß man so klammern, weil ohne die Klammern der Punktoperator (sowie auch der Zeigeroperator) eine höher Priorität hat und somit dann als *(pSpieler.Punkte) += Bonus; interpretiert wird (und das dann einen Fehler erzeugt, da der Ausdruck pSpieler.Punkte ungültig ist, da pSpieler einen Zeiger darstellt und kein Klassen- bzw. Strukturobjekt).



  • @DasViereck sagte in Habe ein Problem mit dem Zeiger in C++:

    Warum darf das Sternchen nicht vorangestellt werden, könnt ihr mir das noch sagen?/Warum muss wenn man es macht, es in Klammern stellen?

    Weil C Zeiger nicht in die Hände von C++lern gehören.


Anmelden zum Antworten