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

11

03.09.2014, 12:00

Naja, der Link handelt von Java und miesen Hacks. Dort wird beschrieben, wie man final-Variablen (ähnlich wie const-Variablen in C++, glaub ich ^^) ändern kann. Wie gesagt, du kannst den Bezeichner einer Variable nicht ändern, aber ihren Inhalt.

12

06.09.2014, 19:18

So, nach einigem rumprobieren sieht es jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    // structure to store score per Player and provide sort function

    struct Splayer
    {
        int score = 0;
        string name;

        bool compare(const Splayer& left, const Splayer& right)
        {
            return left.score < right.score;
        }
    };

    list<Splayer> playerlist;

    // vector to sort highscore list

    vector<Splayer> highscore; 


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        if (score > 0)
        {
            cout << "Willst Du Deinen Erfolg fuer die Nachwelt festhalten? j/n" << endl;
            cin >> chsave;

            if (chsave == 'j')
            {
                Splayer player;

                cout << "Gib Deinen Namen ein: ";
                cin.ignore();
                cin >> player.name;

                playerlist.push_back(player);

                sort(highscore.begin(), highscore.end(), player.compare);

                score = 0;
            }
        } 


Sieht das für Euch so weit richtig aus? Wie Ihr seht ist jetzt theoretisch auch eine Sortierung vorhanden. Allerdings habe ich die einfach aus einem gefundenen Beispiel angepasst und habe keinen Schimmer ob das so funktioniert. Denn zum überprüfen müsste ich die Liste dann auch noch ausgeben können. Und da hänge ich momentan noch fest. Zudem gibt der Compiler eine Fehlermeldung aus von wegen fehlender Argumentliste bei der sort-Funktion.

Also nächste Fragen: Was ist hier noch falsch und wie gebe ich die Liste nun auf dem Bildschirm aus?

13

06.09.2014, 22:00

Es muss Splayer::compare heißen. Vielleicht kannst du ja Splayer ja als Klasse deklarieren und getter und setter einfügen, die z.B. beim setzten des scores überprüfen, ob der score valid ist (nicht negativ). Alternativ kannst du auch eine Highscore Klasse anlegen, die das einfügen, auslesen und sortieren automatisch macht.
zum ausgeben kannst du einfach eine schleife verwenden:

C-/C++-Quelltext

1
2
3
4
5
for(std::size_t i=0;i<highscore.size;++i)
//for(auto &i : highscore) würde auch funktionieren
//for(std::vector<Splayer>::const_iterator i=highscore.begin();i!=highscore.end();++i) //genauso, aber wer will schon so viel schreiben ^^
{
}

14

14.09.2014, 17:36

So, bin mal ein wenig weiter gekommen. Allerdings bekomme ich immer noch einen Compiler Fehler mit folgendem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
    // structure to store score per player and provide sort function

    struct Splayer
    {
        int score = 0;
        string name;

    };

    // vector list to sort highscore list

    vector<Splayer> highscore;
    vector<Splayer>::iterator highscoreIterator;


C-/C++-Quelltext

1
2
3
4
5
            for (highscoreIterator = highscore.begin(); highscoreIterator != highscore.end(); highscoreIterator++)
            {
                cout << highscoreIterator->score;
                cout << highscoreIterator->name;
            }


Der Fehler den ich bekomme ist C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt

Und zwar in Zeile 3071 der eingebundenen algorithm. Ich interpretiere dass so dass ich mit algorithm was anstellen will was nicht geht. Aber was genau ist mir schleierhaft. Irgend jemand eine Idee?

15

14.09.2014, 23:04

Also ich sehe in deinem Code keine Stelle wo du auch nur ansatzweise algorithm nutzt.
Bitte poste doch mal ein compilierbares Beispiel.
Dann kann man dir auch eher helfen.

16

21.09.2014, 14:19

Ach ich Schlaumeier sollte halt auch allen relevanten Code posten :dash: In meinem Eifer nur das nötigste zu posten um es übersichtlich zu halten habe ich wohl ein paar Zeilen zu viel weggelassen :whistling:

Algorithm brauche ich für die sort-Funktion.

Nachfolgend nochmal der ganze Code der mit der Highscoreliste zu tun hat:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    char chsave;

    struct Splayer
    {
        int score = 0;
        string name;

        bool compare(const Splayer& left, const Splayer& right)
        {
            return left.score < right.score;
        }
    };

    vector<Splayer> highscore;
    vector<Splayer>::iterator highscoreIterator;


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
        if (score > 0)
        {
            cout << "Willst Du Deinen Erfolg fuer die Nachwelt festhalten? j/n" << endl;
            cin >> chsave;

            if (chsave == 'j')
            {
                Splayer player;

                cout << "Gib Deinen Namen ein: ";
                cin.ignore();
                cin >> player.name;

                player.score = score;

                highscore.push_back(player);

                sort(highscore.begin(), highscore.end(), &Splayer::compare);

                score = 0;
            }
        }


C-/C++-Quelltext

1
2
3
4
5
            for (highscoreIterator = highscore.begin(); highscoreIterator != highscore.end(); highscoreIterator++)
            {
                cout << highscoreIterator->score;
                cout << highscoreIterator->name;
            }


Kompilierbares Beispiel weiss ich grad nicht wie ich das machen soll. Höchstens wenn ich einem das Projekt maile oder als Download zu Verfügung stelle (was ich gerne mache, ist ja nur ein Übungsspiel). Aber da ich jetzt sicher den kompletten problematischen Code gepostet habe hoffe ich mal wir können das so lösen.

Das Problem liegt gemäss Compiler in Zeile 3071 der eingebundenen algorithm und verursacht wird es wohl von der sort-Funktion.

Fehler: C2064: Ausdruck ergibt keine Funktion, die 2 Argumente übernimmt

17

21.09.2014, 14:43

Das Problem mag da sein, weil die Argumente invalide sind. Hast du mal geguckt, was der Fehler C2064 gemäß MSDN überhaupt genau sagt?
Schaut man sich dann vielleicht noch std::sort an, ist man der Lösung eigentlich schon auf den Schlips getreten.
Du hats drei Optionen:
Entweder du änderst die Funktion SPlayer::Compare zu einem operator< und übergibst std::sort nichts als 3. Parameter
oder du machst die SPlayer::Compare Funktion zu einer statischen Funktion
oder du entfernst sie restlos und ersetzt den 3. Parameter von std::sort mit einem Funktor oder Lambda-Ausdruck.
Der Einfachheit halber schreib einfach ein static vor die Funktion und die Welt ist in Ordnung.
Du weißt, warum das so funktioniert und nicht so wie du es probiert hast?

MfG
Check

18

21.09.2014, 14:57


Du weißt, warum das so funktioniert und nicht so wie du es probiert hast?


Nö, ich hab' ehrlich gesagt keinen Schimmer. Diese Dinge sind im Buch noch nicht behandelt worden (bin in der Mitte von C++ für Spieleprogrammierer). Ich programmier momentan einfach ein bisschen drauf los und wenn ich was machen will was ich mit dem bisher gelernten nicht abdecken kann gehe ich erst mal googeln und komme dann hierher wenn ich nichts finde oder das gefundene nicht funktioniert.

Ob das die richtige Vorgehensweise ist kann man sicher diskutieren. Aber ich wollte einfach mal ein kleines Übungsspiel programmieren um mal ein bisschen Routine zu bekommen bevor ich mich mit der zweiten Buchhälfte auseinander setze. Ich könnte mich natürlich darauf beschränken nur Dinge aus dem 1. Teil des Buches zu verwenden, aber dann habe ich am Ende nur ein halbes Spiel, und das bringt mir dann irgendwie auch nichts. Zudem habe ich so schon ein paar zusätzliche Dinge gelernt die ganz nützlich sind :)

Das Spiel ist an sich eigentlich auch fast fertig (bis auf ein wenig Code-Kosmetik), nur diese bekloppte Highscoreliste macht mir noch Kopfschmerzen. Und dabei dachte ich dass sei was ganz einfaches :hmm:

Ich probier mal ein bisschen mit Deinen Vorschlägen rum. Mal schauen ob ich's damit hinkriege.

Volker_Neff

Treue Seele

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

19

21.09.2014, 15:37

Mach aus compare einen operator und lasse den letzten Paramter bei std::sort einfach weg.

20

21.09.2014, 15:54

Zitat

Ich probier mal ein bisschen mit Deinen Vorschlägen rum. Mal schauen ob ich's damit hinkriege.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
struct Splayer
 {
    int score = 0;
    string name;

    static bool compare(const Splayer& left, const Splayer& right)
    {
        return left.score < right.score;
    }
};

Was ist so schwer daran?

MfG
Check

Werbeanzeige