【问题标题】:C++ object member integer has ridiculous value (WTF)C++ 对象成员整数具有荒谬的值 (WTF)
【发布时间】:2011-03-06 12:41:38
【问题描述】:

这是一个扑克游戏,我在 PokerTable.h 中定义了 PokerTable 类

#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.numPlayers 的随机值高达 400 万。

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

然后这是我的观察列表中的扑克桌:

-       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;
    }

【问题讨论】:

  • 也许这只是一个调试器问题?手动打印值时会发生什么?
  • 您需要向我们展示代码中存在错误的部分。您需要重新考虑如何命名您的成员和参数。
  • @dauphic 他正在调用设置了 9 个参数的构造函数。
  • @David Heffernan,它只设置了8个变量,虽然总共有9个;一个 int 未初始化。然而,这并不是他所说的错误。这里有些奇怪。
  • players[x] = *(new PokerPlayer(... :这不是理智的 C++。我相信您正在思考 Java 并在您的驱动代码中犯了一些类似的错误(我猜它在 main 函数中)。可以发一下这些部分吗?还有你到底在哪里停止了你的调试器?

标签: c++ class object


【解决方案1】:

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

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

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

【讨论】:

  • 4 字节移位的出色拾取。没有PokerTable.cpp,只有Form1.h 中包含的PokerTable.h。我已经重建,但没有帮助,而且我似乎无法在 numPlayers 之前找到额外的成员。我应该创建一个 PokerTable.cpp 文件吗?
  • 没有。我不知道是什么导致了偏移。如果您希望有人查看,请将项目复制到文件共享服务中。
【解决方案2】:

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

【讨论】:

  • @David:不,他们当然不会。
  • @Max 我编译和调试了你的代码,直到PokerTable aPokerTable(9,9,1,20,30,false,false,false); 之后所有参数都被正确分配,除了 betSize。这是有道理的,因为您没有通过构造函数对其进行初始化。您确定在构建后立即读取变量的值吗?如果是,那么您使用的是什么编译器?可能是编译器或调试器的问题
  • @Max 我自己用 VS2010 调试过它。使用 Microsoft VS 我真的非常怀疑这是一个编译器问题。不知道对不起!
  • @David He 说他调试并读取了这些值直到PokerTable aPokerTable(9,9,1,20,30,false,false,false); 之后,有趣的值出现在上一行代码之后。我在编译器中复制并粘贴了相同的代码,它给出了预期的结果。知道没有其他线程,还有什么其他事情会影响这些值?有许多开源编译器可能是错误的,你不怀疑吗?还是我应该对这种可能性闭嘴,因为您先生可能认为这很疯狂?我在这里待了很短的时间,但男人们在这里有很大的自负
  • @Max 我不认为 MS VC++ 是这种情况。鉴于您在帖子中提到的内容,它应该可以正常工作。我们根本不知道这就是我们战斗的原因:))
【解决方案3】:

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

【讨论】:

  • 我应该如何取消引用指针?我认为使用构造函数会自动取消引用变量。
  • 不是在谈论构造函数,而是在谈论您的打印方法
【解决方案4】:

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

那是内存泄漏。你可能想要的是:

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

【讨论】:

  • 谢谢。我拼凑了这个以摆脱正确的操作数错误的数据类型错误。我认为主要问题是我对 C++ 不够了解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2017-11-11
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多