2015-05-06 197 views
1

所以我现在的代码是使用模拟堆栈创建一副牌(因为我不知道如何在C++中实现一个真正的堆栈)。洗牌,然后甲板被分成两半,并传递给两名球员,p1p2。然后用户可以看到p1的卡片,其编号从1到26,用户可以选择1到26之间的一个数字来选择该卡片并将其投入使用。C++在Struct中设置元素Array = NULL

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

后,我拿到您选择等于NULL特定的元素,然后我要推所有的元素是空元素之后,一个空格前进,所以像

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

这里是开始我的代码,其中的结构是何主要是:

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

而现在的问题是代码,我throwCard功能:

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

这里是我收到确切的错误:

EgyptianRatScrew3.cpp: In function 'void throwCard(Card*, Card*, Card*, Card*)': 
EgyptianRatScrew3.cpp:54:33: error: invalid array assignment 
      if(p1[cardNumber].suit = p1[x].suit){ 
           ^
EgyptianRatScrew3.cpp:55:35: warning: converting to non-pointer type 'int' from NULL [-Wconversion-null] 
      p1[cardNumber].number = NULL; 
           ^
EgyptianRatScrew3.cpp:56:33: error: incompatible types in assignment of 'long long int' to 'char [10]' 
      p1[cardNumber].suit = NULL; 
           ^
EgyptianRatScrew3.cpp:58:32: warning: converting to non-pointer type 'int' from NULL [-Wconversion-null] 
       if(p1[y].number = NULL){ 
           ^
EgyptianRatScrew3.cpp:59:33: error: incompatible types in assignment of 'long long int' to 'char [10]' 
        if(p1[y].suit = NULL){ 
           ^
+1

对于一个你正在做的任务,如果你应该做一个比较 – dwcanillas

+2

你试图分配NULL时,你应该只分配'0'。 “NULL”用于指针,“0”用于数值。如果你声明了一个变量'int i = 0',但是'int * i = NULL'。 另外,如果你需要一个现成的堆栈实现,你可以使用'std :: stack'来使用C++。 http://www.cplusplus.com/reference/stack/stack/ – antipattern

+0

使用像矢量一样的标准容器,一旦你发现卡片从矢量中删除它。 – NathanOliver

回答

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的宏,如果您有C++ 11,则应该使用nullptr

在我看来,理想的解决办法是改变你的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 

我没有在你的代码仔细看,而且可能无意义的选择无效。对于Suit而言,enum绝对是最好的选择。

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; 

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

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

这将成为有效:

p1[cardNumber].suit = NULL; 

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

+0

几乎正确,但你有一些误解和术语问题。首先,C++中的“矢量”被很好地定义为意味着别的东西。 –

+0

事实上,不要把'std :: vector'弄错了,这是一个定义良好的,与语言无关的向量。 – gbuzogany

+0

或者只是像其他人一样说“数组”...... –