Seite 1 von 1

[solved] Verbund in einen Stack packen?

Verfasst: 17. November 2011 10:06
von Nalid
Hallo erst ma...

Ich arbeite an einem Poker spiel und habe da ne kleine frage was QStack und ein struckt angeht...
Ich will in einen Stack den gesammten Verbund rein pushen. Doch ich weiss nicht ob es die Daten verfälscht, oder ob es überhaupt geht... Der Stack ist ebenfalls vom Typ des struktes..

Der Code für den Struckt (im h File) :

Code: Alles auswählen

    
struct cards{
        int suite;
        int face;
    };
Der Code für deck (array aus verbünden) :

Code: Alles auswählen

cards deck[53]; // ist im h File der Rest nicht
    for(int x=0;x<=51;x++){
        z++;
        if(x%13==0){
            s++;
            z=1;}
        deck[x].face = z;
       deck[x].suite = s;
    }
Und hier für den Stack :

Code: Alles auswählen

QStack<cards> cardsused; //ist im h File der Rest nicht

    for(int i = 0; i<=8;i++){
        int r = (rand()%52 + 1);
        cardsused.push(deck[r]);
}

Ich hab gedacht so würd ich es dann auch ausgeben :

Code: Alles auswählen

        cards ausgabe = cardsused.pop();
        qDebug()<<ausgabe.face;

Re: Verbund in einen Stack packen?

Verfasst: 17. November 2011 13:21
von franzf
In den Stack kommen Kopien, eine Kopie verfälscht das Original nicht (außer es wird explizit so implementiert, siehe z.B. std::unique_ptr). Hat aber nichts direkt mit Qt zu tun.
Dein Algo im vorletzten Codeschnippsel kann übrigens durchaus Duplikate im Stack erzeugen, da rand()%52 bei 9 Aufrufen durchaus bis zu 9x das gleiche Ergebnis liefern kann.

Re: Verbund in einen Stack packen?

Verfasst: 17. November 2011 14:27
von Nalid
Also funktionieren würde es... nun ist die Frage nur noch wie fange ich das ab^^ An das hab ich nicht mal gedacht, danke für den Hinweis.

Re: Verbund in einen Stack packen?

Verfasst: 18. November 2011 15:29
von franzf
Nalid hat geschrieben:nun ist die Frage nur noch wie fange ich das ab^^ An das hab ich nicht mal gedacht, danke für den Hinweis.
Entweder frägst du direkt, ob deck[index] schon im stack liegt (QStack::contains()), oder du führst eine Liste (temporär in der Methode, die deinen Stack füllt), die die berechneten Indizes aufnimmt. In deinem Fall sollte es egal sein, weil Erstellen und Vergleichen von card-Objekten billig sind.

Re: [solved] Verbund in einen Stack packen?

Verfasst: 18. November 2011 17:20
von franzf
Die nachprüfende Schleife war die falsche ;) Der Rumpf wird IMMER ausgeführt, danach geprüft. Somit verhinderst du ein doppeltes Einfügen leider nicht ;)
Vor allem wirst du am Ende mehr Karten im Stack haben als gewünscht.

Re: [solved] Verbund in einen Stack packen?

Verfasst: 19. November 2011 09:31
von Nalid
An sich brauch ich ne Do-While Schleife die mir überprüft ob es schon drin ist, und wenn nicht legt er sie rein. Wenn ich contains benützte zeigt er mir QVector::contains() an?


Ich hab einfach mal versucht das auszugeben, damit ich weiss wie ich damit umzugehen habe :

Code: Alles auswählen

qDebug()<<cardsused.contains(deck[r]);

Was dabei rauskam war sehr ernüchternd... :
C:\Users\Can\Poker-build-desktop\..\..\..\QtSDK\Desktop\Qt\4.7.3\mingw\include\QtCore\qvector.h:708: Fehler:no match for 'operator==' in '* -- i == t'

Re: [solved] Verbund in einen Stack packen?

Verfasst: 19. November 2011 14:05
von almboa
Der vector weiß halt nicht, wie er cards vergleichen soll (kein ==operator), das musst du schon selber festlegen (==operator implementieren) mit eigenen Datentypen.

Re: [solved] Verbund in einen Stack packen?

Verfasst: 19. November 2011 20:49
von Nalid
Ich soll einen Operator überladen Oo? Interesannt.. hab ich aber noch nie gemacht -.-

Re: [solved] Verbund in einen Stack packen?

Verfasst: 20. November 2011 18:22
von franzf
Nalid hat geschrieben:Ich soll einen Operator überladen Oo? Interesannt.. hab ich aber noch nie gemacht -.-
operatoren sind ganz normale Funktionen/Methoden, mit etwas speziellem Namen. Sie gehören zum Interface deines Typen.
Hier schaut er so aus:

Code: Alles auswählen

bool operator==(cards const& left, cards const& right)
Das ganze als freie Funktion, da beide Operanden gleichwertig sind.
Die Implementierung überlass ich die, sollte aber klar sein, wie es läuft.
(Kleine Hilfe: es wird true zurückgegeben, wenn Gleichheit besteht, andernfalls false)

Re: [solved] Verbund in einen Stack packen?

Verfasst: 22. November 2011 10:16
von Nalid
Danke sehr ;)