[solved] Verbund in einen Stack packen?

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

[solved] Verbund in einen Stack packen?

Beitrag 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;
Zuletzt geändert von Nalid am 17. November 2011 23:17, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Verbund in einen Stack packen?

Beitrag 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.
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: Verbund in einen Stack packen?

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Verbund in einen Stack packen?

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: [solved] Verbund in einen Stack packen?

Beitrag 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.
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: [solved] Verbund in einen Stack packen?

Beitrag 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'
almboa
Beiträge: 21
Registriert: 27. September 2009 11:52

Re: [solved] Verbund in einen Stack packen?

Beitrag 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.
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: [solved] Verbund in einen Stack packen?

Beitrag von Nalid »

Ich soll einen Operator überladen Oo? Interesannt.. hab ich aber noch nie gemacht -.-
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: [solved] Verbund in einen Stack packen?

Beitrag 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)
Nalid
Beiträge: 26
Registriert: 21. Februar 2011 23:49

Re: [solved] Verbund in einen Stack packen?

Beitrag von Nalid »

Danke sehr ;)
Antworten