C++对象成员整数具有荒谬的值(WTF)

发布于 2024-10-20 16:22:09 字数 8137 浏览 1 评论 0原文

这是针对扑克游戏的,

#include <iostream>
using namespace std;
class PokerTable
{
private:
 int numPlayers;
 int numPlaying;
 int dealerPos;
 int bigBlind;
 int potSize;
 int betSize;
 bool flop;
 bool turn;
 bool river;

 public:
 //constructors
 PokerTable();
 PokerTable(int,int,int,int,int,bool,bool,bool);

 //getters
 int getNumPlayers(){return numPlayers;};
 int getDealerPos(){return dealerPos;};
 int getBigBlind(){return bigBlind;};
 int getNumPlaying(){return numPlaying;};
 int getPotSize(){return potSize;};
 int getBetSize(){return betSize;};
 bool getFlop(){return flop;};
 bool getTurn(){return turn;};
 bool getRiver(){return river;};
 //void buttonShow(int);


 //setters
 void setBetSize(int inBetSize){betSize = inBetSize;};
 void setBigBlind(int inBigBlind){bigBlind = inBigBlind;};
 void setNumPlaying(int inNumPlaying){numPlaying = inNumPlaying;};
 void setPotSize(int inPotSize){potSize = inPotSize;};
 void setFlop(bool inFlop){flop = inFlop;};
 void setTurn(bool inTurn){turn = inTurn;};
 void setRiver(bool inRiver){river = inRiver;};
 void setNumPlayers(int inPlayers){numPlayers = inPlayers;};
 void setDealerPos(int inDealerPos){dealerPos = inDealerPos;};
};
PokerTable::PokerTable()
{
 numPlayers = 9;
 numPlaying = 9;
 dealerPos = 1;
 bigBlind = 20;
 flop = false;
 turn = false;
 river = false;
}
PokerTable::PokerTable(int playerNum, int playingCount, int posDealer, int blindBig,int inPotSize, bool inFlop,bool inTurn,bool inRiver)
{
 numPlayers = playerNum;
 numPlaying = playingCount;
 dealerPos = posDealer;
 potSize = inPotSize;
 bigBlind = blindBig;
 flop = inFlop;
 turn = inTurn;
 river = inRiver;
}

在我执行下一行代码之前,我在 PokerTable.h 中定义了 PokerTable 类。在我的观察列表中,pokerTable.numPlayers 的随机值高达 400 万。

PokerTable aPokerTable(9,9,1,20,30,false,false,false);

然后这是我的观察列表中的 pokerTable:

-       aPokerTable { numPlayers=2990892 numPlaying=9 dealerPos=9 ...}  PokerTable
        betSize 30  int
        bigBlind    1   int
        dealerPos   9   int
        flop    false   bool
        numPlayers  2990892 int
        numPlaying  9   int
        potSize 20  int
        river   false   bool
        turn    false   bool

谁能告诉我为什么所有的值都不是我声明的那样??!?!! 我该如何解决这个问题?

这是 Form1.h

#pragma once
#include "PokerTable.h"
#include "Card.h"
#include <time.h>
#include "PokerPlayer.h"
#include <fstream>
#include <string>
#include <sstream>

//global variables
//TODO make players start from 0
int firstPlayer;
int deck[52];
int nextCard=0;
PokerTable aPokerTable(9,9,1,20,30,false,false,false);
PokerPlayer players[9]; //however many players
ofstream gameLog;
/*
void setTable()
{
    aPokerTable.setNumPlayers(9);
    aPokerTable.setNumPlaying(9);
    aPokerTable.setDealerPos(1);
    aPokerTable.setBigBlind(20);
    aPokerTable.setPotSize(30);
    aPokerTable.setBetSize(20);
    aPokerTable.setFlop(false);
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);

}
*/
string convertInt(int number) //convert to string
{
   stringstream ss;//create a stringstream
   ss << number;//add number to the stream
   return ss.str();//return a string with the contents of the stream
}

void createPlayers()
{
//  aPokerTable.setNumPlayers(9);
    for(int x=0;x<=(aPokerTable.getNumPlayers()-1);x++)
    {
        players[x] = *(new PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1));//1000 chips, position i+1, not folded
    }
}



void playRound()
{
    int action;
    for(int playerTurn = firstPlayer; playerTurn <= aPokerTable.getNumPlayers()+firstPlayer;  playerTurn++)
    {
        if(players[playerTurn].getFold() == false)
        {
            if(aPokerTable.getNumPlaying() == 1)
            {
                players[playerTurn].setChipStack(players[playerTurn].getChipStack() + aPokerTable.getPotSize()); //player wins pot
            }
            else //there is more than one person playing
                {
                action = players[playerTurn].action(); //0 is check/fold, value is call/bet/raise,
                if(action > aPokerTable.getBetSize())
                {
                    aPokerTable.setBetSize(action);
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                    playerTurn = playerTurn - aPokerTable.getNumPlayers();
                }
                else if (action == aPokerTable.getBetSize()) //call
                {
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                }
                else //action < aPokerTable.betSize
                {
                    players[playerTurn].setFold(true);
                    aPokerTable.setNumPlaying(aPokerTable.getNumPlaying()-1); //removes player from playing tally
                }
            }
        }
    }
}


void randomDeck()
{
    int random_integer;
    int tempCard;
    //srand((unsigned)time(0));
    for(int j=0;j<=51;j++)
    {
        deck[j] = j;
    } 

    for(int i=51; i>=1; i--)
    {
        random_integer = rand()%(i); //a random number between 0 and i
        tempCard = deck[i];
        deck[i] = deck[random_integer]; //put the random card from unshuffled deck into slot i of the deck
        deck[random_integer] = tempCard; //put whatever was at slot i into the random slot
    }

}

void dealCards()
{
    for(int j=1;j<=aPokerTable.getNumPlayers();j++)
    { 
        players[j].setCard1(deck[nextCard]);
        nextCard++;
        players[j].setCard2(deck[nextCard]);
        nextCard++;
    }
}

void playPreFlop()
{
    aPokerTable.setBetSize(aPokerTable.getBigBlind());
    aPokerTable.setFlop(false); //it is before the flop
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);
    randomDeck(); //shuffle cards
    dealCards();
    firstPlayer = (aPokerTable.getDealerPos() + 3)%(aPokerTable.getNumPlayers()); // first player is left of blinds between 0 and numplayers
    playRound();
}


void playFlop()
{
    aPokerTable.setFlop(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playTurn()
{
    aPokerTable.setTurn(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playRiver()
{
    aPokerTable.setRiver(true);
    firstPlayer = (aPokerTable.getDealerPos())%(aPokerTable.getNumPlayers()); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
    if(aPokerTable.getNumPlaying() >=2)
        {
        //showDown();
        }
}
/*
void showDown()
{

}
*/

这是 pokerPlayer.h

using namespace std;
    class PokerPlayer
    {
    private:
        int chipStack,position;
        bool fold;
        int card1,card2;
    public:
        //constructors
        PokerPlayer();
        PokerPlayer(int,int,bool,int,int);

        //getters
        int getChipStack() {return chipStack;}
        int getPosition() {return position;}
        int getCard1(){return card1;}
        int getCard2(){return card2;}
        bool getFold(){return fold;}

        //setters
        void setChipStack(int inChips){chipStack = inChips;}
        void setPosition(int inPos){position = inPos;}
        void setCard1(int inCard1){card1 = inCard1;}
        void setCard2(int inCard2){card2 = inCard2;}
        void setFold(bool inFold){fold = inFold;}

        int action();
    };

    PokerPlayer::PokerPlayer()
    {
        chipStack = 1000;
        position = 0;
        fold=false;
        card1 = 0;
        card2 = 1;
    }
    PokerPlayer::PokerPlayer(int inChipStack,int inPos, bool inFold, int inCard1, int inCard2)
    {
        chipStack = inChipStack;
        position = inPos;
        fold = inFold;
        card1 = inCard1;
        card2 = inCard2;
    }
    int PokerPlayer::action()
    {
        return 0;
    }

This is for a poker game and I have class PokerTable defined in PokerTable.h

#include <iostream>
using namespace std;
class PokerTable
{
private:
 int numPlayers;
 int numPlaying;
 int dealerPos;
 int bigBlind;
 int potSize;
 int betSize;
 bool flop;
 bool turn;
 bool river;

 public:
 //constructors
 PokerTable();
 PokerTable(int,int,int,int,int,bool,bool,bool);

 //getters
 int getNumPlayers(){return numPlayers;};
 int getDealerPos(){return dealerPos;};
 int getBigBlind(){return bigBlind;};
 int getNumPlaying(){return numPlaying;};
 int getPotSize(){return potSize;};
 int getBetSize(){return betSize;};
 bool getFlop(){return flop;};
 bool getTurn(){return turn;};
 bool getRiver(){return river;};
 //void buttonShow(int);


 //setters
 void setBetSize(int inBetSize){betSize = inBetSize;};
 void setBigBlind(int inBigBlind){bigBlind = inBigBlind;};
 void setNumPlaying(int inNumPlaying){numPlaying = inNumPlaying;};
 void setPotSize(int inPotSize){potSize = inPotSize;};
 void setFlop(bool inFlop){flop = inFlop;};
 void setTurn(bool inTurn){turn = inTurn;};
 void setRiver(bool inRiver){river = inRiver;};
 void setNumPlayers(int inPlayers){numPlayers = inPlayers;};
 void setDealerPos(int inDealerPos){dealerPos = inDealerPos;};
};
PokerTable::PokerTable()
{
 numPlayers = 9;
 numPlaying = 9;
 dealerPos = 1;
 bigBlind = 20;
 flop = false;
 turn = false;
 river = false;
}
PokerTable::PokerTable(int playerNum, int playingCount, int posDealer, int blindBig,int inPotSize, bool inFlop,bool inTurn,bool inRiver)
{
 numPlayers = playerNum;
 numPlaying = playingCount;
 dealerPos = posDealer;
 potSize = inPotSize;
 bigBlind = blindBig;
 flop = inFlop;
 turn = inTurn;
 river = inRiver;
}

In my watch list pokerTable.numPlayers has a random value up to 4 million before I even execute this next line of code.

PokerTable aPokerTable(9,9,1,20,30,false,false,false);

and afterwards here is pokerTable in my watch list:

-       aPokerTable { numPlayers=2990892 numPlaying=9 dealerPos=9 ...}  PokerTable
        betSize 30  int
        bigBlind    1   int
        dealerPos   9   int
        flop    false   bool
        numPlayers  2990892 int
        numPlaying  9   int
        potSize 20  int
        river   false   bool
        turn    false   bool

Can anyone tell me why all the values are not what I declared them to be??!?!!
And how I can fix this?

This is Form1.h

#pragma once
#include "PokerTable.h"
#include "Card.h"
#include <time.h>
#include "PokerPlayer.h"
#include <fstream>
#include <string>
#include <sstream>

//global variables
//TODO make players start from 0
int firstPlayer;
int deck[52];
int nextCard=0;
PokerTable aPokerTable(9,9,1,20,30,false,false,false);
PokerPlayer players[9]; //however many players
ofstream gameLog;
/*
void setTable()
{
    aPokerTable.setNumPlayers(9);
    aPokerTable.setNumPlaying(9);
    aPokerTable.setDealerPos(1);
    aPokerTable.setBigBlind(20);
    aPokerTable.setPotSize(30);
    aPokerTable.setBetSize(20);
    aPokerTable.setFlop(false);
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);

}
*/
string convertInt(int number) //convert to string
{
   stringstream ss;//create a stringstream
   ss << number;//add number to the stream
   return ss.str();//return a string with the contents of the stream
}

void createPlayers()
{
//  aPokerTable.setNumPlayers(9);
    for(int x=0;x<=(aPokerTable.getNumPlayers()-1);x++)
    {
        players[x] = *(new PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1));//1000 chips, position i+1, not folded
    }
}



void playRound()
{
    int action;
    for(int playerTurn = firstPlayer; playerTurn <= aPokerTable.getNumPlayers()+firstPlayer;  playerTurn++)
    {
        if(players[playerTurn].getFold() == false)
        {
            if(aPokerTable.getNumPlaying() == 1)
            {
                players[playerTurn].setChipStack(players[playerTurn].getChipStack() + aPokerTable.getPotSize()); //player wins pot
            }
            else //there is more than one person playing
                {
                action = players[playerTurn].action(); //0 is check/fold, value is call/bet/raise,
                if(action > aPokerTable.getBetSize())
                {
                    aPokerTable.setBetSize(action);
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                    playerTurn = playerTurn - aPokerTable.getNumPlayers();
                }
                else if (action == aPokerTable.getBetSize()) //call
                {
                    aPokerTable.setPotSize(aPokerTable.getPotSize() + action);
                }
                else //action < aPokerTable.betSize
                {
                    players[playerTurn].setFold(true);
                    aPokerTable.setNumPlaying(aPokerTable.getNumPlaying()-1); //removes player from playing tally
                }
            }
        }
    }
}


void randomDeck()
{
    int random_integer;
    int tempCard;
    //srand((unsigned)time(0));
    for(int j=0;j<=51;j++)
    {
        deck[j] = j;
    } 

    for(int i=51; i>=1; i--)
    {
        random_integer = rand()%(i); //a random number between 0 and i
        tempCard = deck[i];
        deck[i] = deck[random_integer]; //put the random card from unshuffled deck into slot i of the deck
        deck[random_integer] = tempCard; //put whatever was at slot i into the random slot
    }

}

void dealCards()
{
    for(int j=1;j<=aPokerTable.getNumPlayers();j++)
    { 
        players[j].setCard1(deck[nextCard]);
        nextCard++;
        players[j].setCard2(deck[nextCard]);
        nextCard++;
    }
}

void playPreFlop()
{
    aPokerTable.setBetSize(aPokerTable.getBigBlind());
    aPokerTable.setFlop(false); //it is before the flop
    aPokerTable.setTurn(false);
    aPokerTable.setRiver(false);
    randomDeck(); //shuffle cards
    dealCards();
    firstPlayer = (aPokerTable.getDealerPos() + 3)%(aPokerTable.getNumPlayers()); // first player is left of blinds between 0 and numplayers
    playRound();
}


void playFlop()
{
    aPokerTable.setFlop(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playTurn()
{
    aPokerTable.setTurn(true);
    firstPlayer = (aPokerTable.getDealerPos())%aPokerTable.getNumPlayers(); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
}
void playRiver()
{
    aPokerTable.setRiver(true);
    firstPlayer = (aPokerTable.getDealerPos())%(aPokerTable.getNumPlayers()); // first player is left of dealer between 0 and numplayers
    aPokerTable.setBetSize(0);
    playRound();
    if(aPokerTable.getNumPlaying() >=2)
        {
        //showDown();
        }
}
/*
void showDown()
{

}
*/

This is pokerPlayer.h

using namespace std;
    class PokerPlayer
    {
    private:
        int chipStack,position;
        bool fold;
        int card1,card2;
    public:
        //constructors
        PokerPlayer();
        PokerPlayer(int,int,bool,int,int);

        //getters
        int getChipStack() {return chipStack;}
        int getPosition() {return position;}
        int getCard1(){return card1;}
        int getCard2(){return card2;}
        bool getFold(){return fold;}

        //setters
        void setChipStack(int inChips){chipStack = inChips;}
        void setPosition(int inPos){position = inPos;}
        void setCard1(int inCard1){card1 = inCard1;}
        void setCard2(int inCard2){card2 = inCard2;}
        void setFold(bool inFold){fold = inFold;}

        int action();
    };

    PokerPlayer::PokerPlayer()
    {
        chipStack = 1000;
        position = 0;
        fold=false;
        card1 = 0;
        card2 = 1;
    }
    PokerPlayer::PokerPlayer(int inChipStack,int inPos, bool inFold, int inCard1, int inCard2)
    {
        chipStack = inChipStack;
        position = inPos;
        fold = inFold;
        card1 = inCard1;
        card2 = inCard2;
    }
    int PokerPlayer::action()
    {
        return 0;
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

深陷 2024-10-27 16:22:09

aPokerTable { numPlayers=2990892 numPlaying=9 DealerPos=9 ...}

请注意,dealerPos 被分配了值 9,这也是错误的。如果仔细观察,您会发现所有内容都移动了 4 个字节。

两个可能的原因。调试器可能为 aPokerTable 选择了错误的地址,即实际地址减去 4。这是不可能的。或者 pokertable.cpp 所看到的 PokerTable 类的定义与 #include pokertable.h 包含文件的其他 .cpp 文件之间存在不匹配。其中 pokertable.cpp 在 numPlayers 成员之前看到了一个额外的成员。也许您编辑了标头并删除了该成员,但由于某种神秘的原因最终没有重新编译 pokertable.cpp。构建+重建来修复。如果这真的有效,请稍微恐慌一下。

aPokerTable { numPlayers=2990892 numPlaying=9 dealerPos=9 ...}

Note that dealerPos got assigned the value 9, that's wrong as well. If you look closely, you'll see that everything is shifted by 4 bytes.

Two possible reasons. The debugger could have picked the wrong address for aPokerTable, the actual address minus 4. That's unlikely. Or there's a mismatch between the definition of the PokerTable class as seen by pokertable.cpp and the other .cpp files that #include the pokertable.h include file. Where pokertable.cpp saw an extra member before the numPlayers member. Maybe you edited the header and deleted that member but ended up not recompiling pokertable.cpp for some mysterious reason. Build + Rebuild to fix. Do panic a bit if this actually works.

自由如风 2024-10-27 16:22:09

这是因为在 C++ 中,在调用构造函数之前,变量使用它已包含在其内存位置中的值,即“随机”值

It's because in C++ before the constructor is called, variable uses the value that it already contains in its memory location that is a "random" value

菩提树下叶撕阳。 2024-10-27 16:22:09

我无法重建它,因为我没有完整的代码。然而,接近 400 万的随机值听起来像一个指针。当您存储或检索成员变量时,可能没有取消引用指针。请发布其余的代码,以便我们检查是否是这种情况。

I cannot reconstruct it because i dont have the full code. However, a random value near 4 million sounds like a pointer. When you store or retrieve a member variable maybe you did not de-reference the pointer. Please post the rest of the code so we can check if that's the case.

无所谓啦 2024-10-27 16:22:09

players[x] = *(new PokerPlayer(...));

这是内存泄漏。您可能想要的是:

players[x] = PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1);

players[x] = *(new PokerPlayer(...));

That is a memory leak. What you probably want is:

players[x] = PokerPlayer(1000,(aPokerTable.getDealerPos())+1,false,0,1);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文