结构数组中的C ++设置元素= NULL

时间:2015-05-06 14:28:30

标签: c++ arrays function struct null

所以我的代码现在做的是它使用模拟堆栈创建一副牌(因为我无法弄清楚如何在c ++中实现真正的堆栈)。然后洗牌,然后拆分牌组一半,并传递给两个球员,ax.outline_patch.set_visible(False) ax.background_patch.set_visible(False) p1。然后允许用户查看p2的卡片,其编号从1到26,并且用户可以选择1到26的数字来选择该卡并将其用于播放。

我基本上必须拥有通过p1卡的代码,看看你选择的卡是否等于p1的卡片中的卡片,如果它们相等,那么我需要将该元素设置为NULL。 唯一的问题是p1的数组由字符和整数组成,因为它是一个结构数组。否则,将事物设置为NULL不会有问题。

在我得到你选择的特定元素等于NULL之后,我必须将所有元素推到那个NULL元素之后,一个空格向前,所以像

p1

以下是我的代码的开头,其中struct是main,其中main是:

p1[x] = p1[x+1]; 

这是问题代码,我的throwCard函数:

struct Card{
  char suit[10];
  int number;
};

void playGame(Card p1[], Card p2[]);
void fillDeck(Card *deck);
void fillPlayerDeck(Card deck[], Card p1[], Card p2[]);
void printDeck(Card deck[], Card p1[], Card p2[]);
void shuffleDeck(Card *deck);
void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]);
//string toString(Card p1[], Card p2[], Card p1New[], Card p2New[]);

int main (int argc, char *argv[]){
   Card deck[52];
   Card p1[26];
   Card p2[26];
   //Card p1New[26];
   //Card p2New[26];
   Card p1cardsThrown[26];
   Card p2cardsThrown[26];
   fillDeck(deck);
   shuffleDeck(deck);
   fillPlayerDeck(deck, p1, p2);
   printDeck(deck, p1, p2);
   throwCard(p1, p2, p1cardsThrown, p2cardsThrown);
   //playGame(p1, p2, p1cardsThrown, p2cardsThrown);  
}

以下是我收到的确切错误:

void throwCard(Card p1[], Card p2[], Card p1cardsThrown[], Card p2cardsThrown[]){
   printf("\nWhich of your cards would you like to play?\n");
   int i = 0;
   for(i; i < 26; i++){
      printf("%d: %d of %s\n", i, p1[i].number, p1[i].suit);
   }
   int cardNumber;
   cin >> cardNumber;
   printf("You chose %d: the %d of %s!", cardNumber, p1[cardNumber].number, p1[cardNumber].suit);


   //HERE IS WHERE THE PROBLEM IS ACTUALLY HAPPENING
   //check which card was thrown, then move that card out of array
   for(int x = 0; x<26; x++){
      if(p1[cardNumber].number = p1[x].number){
         if(p1[cardNumber].suit = p1[x].suit){
            p1[cardNumber].number = NULL;
            p1[cardNumber].suit = NULL;
            for(int y = x; y < 26; y++){
               if(p1[y].number = NULL){
                  if(p1[y].suit = NULL){
                     p1[y] = p1[y + 1];
                     printf("This is P1's new deck");
                     printf("%d: %d of %s\n", x, p1[x].number, p1[x].suit);
                  }   
               }
            }
         }
      }
   }
}

2 个答案:

答案 0 :(得分:2)

这里有一些问题。让我们从if语句开始:

if(p1[cardNumber].number = p1[x].number)

if(p1[cardNumber].suit = p1[x].suit)

if(p1[y].number = NULL)

if(p1[y].suit = NULL)

这些都是作业。您想使用==来比较值,而不是=,它们会分配给它们:

if(p1[cardNumber].number == p1[x].number)

if(p1[cardNumber].suit == p1[x].suit)

if(p1[y].number == NULL)

if(p1[y].suit == NULL)

NULL用于指针。 char[10]int都是非指针,因此为NULL分配NULL并不是有效的,也没有意义。 0也只是nullptr的一个宏,如果你有C ++ 11,Card就是你应该使用的。

在我看来,理想的解决方案是改变你的enum class Suit //declare an enum to represent suit type { Invalid, Spades, Hearts, Clubs, Diamonds } struct Card { Suit suit_value; int card_value; Card() : suit_value(Suit::Invalid), card_value(0) {} }; 结构,如果稍微检查一下:

if(p1[y].number == 0)// have -1 or 0 be an invalid number

if(p1[y].suit = Suit::Invalid)// check for invalid suit

enum

我没有仔细查看您的代码,而且有无效选项甚至没有意义。 Suit的{​​{1}}绝对是可行的方法。

答案 1 :(得分:0)

在这一部分:

if(p1[y].suit = NULL)

您应该比较,而不是分配:

if(p1[y].suit == NULL)

现在,关于作业,来自C ++ 98文档:

  

空指针常量是一个整数常量表达式   评估为零(例如0或0L)。

默认情况下它是一个指针(void*),但如果需要,可以转换为int。像:

p1[cardNumber].number = (int) NULL;

与分配给0相同:

p1[cardNumber].number = 0;

现在这个,根本没有意义:

p1[cardNumber].suit = NULL;

您正在为字符向量(char suit[10])分配NULL。您可以将每个向量位置分配给0(或者如前所述,使用强制转换为NULL),或者使用指针,并根据需要进行分配。如果您使用:

struct Card{
  char *suit;
  int number;
};

这变得有效:

p1[cardNumber].suit = NULL;

作为奖励,你节省了一些记忆!你可以将套装的字符串指针分配给卡片,瞧,一切正常。