2015-05-06 226 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

或者只是像其他人一樣說「數組」...... –