C++ 设置结构数组中的元素 = NULL
C++ Setting Element in Struct Array = NULL
所以我的代码现在做的是使用模拟堆栈创建一副纸牌(因为我不知道如何在 C++ 中实现真正的堆栈)。然后洗牌,然后洗牌被分成两半并传递给两个玩家,p1
和 p2
。然后允许用户查看 p1
编号为 1 到 26 的牌,用户可以 select 从 1 到 26 的数字来选择那张牌并将其投入游戏。
我基本上必须有代码来检查 p1
的牌,看看你选择的牌是否等于 p1
的牌堆中的一张牌,如果它们相等,那么我需要将该元素设置为 NULL。
唯一的问题是 p1
的数组由字符和整数组成,因为它是一个结构数组。否则,设置为 NULL 也不是问题。
在我得到你选择的等于 NULL 的特定元素后,我必须将所有元素推到 NULL 元素之后,一个 space 向前,所以像
p1[x] = p1[x+1];
这是我的代码的开头,struct 所在的位置和 main 所在的位置:
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){
^
这部分:
if(p1[y].suit = NULL)
你应该比较,而不是赋值:
if(p1[y].suit == NULL)
现在,关于作业,来自 C++98 文档:
A null-pointer constant is an integral constant expression that
evaluates to zero (such as 0 or 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;
作为奖励,您可以节省一些内存!您可以将花色的字符串指针分配给卡片,瞧,一切正常。
你这里有一些问题。让我们从您的 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
我没有仔细看你的代码,有无效选项甚至可能没有意义。 enum
for Suit
绝对是正确的选择。
所以我的代码现在做的是使用模拟堆栈创建一副纸牌(因为我不知道如何在 C++ 中实现真正的堆栈)。然后洗牌,然后洗牌被分成两半并传递给两个玩家,p1
和 p2
。然后允许用户查看 p1
编号为 1 到 26 的牌,用户可以 select 从 1 到 26 的数字来选择那张牌并将其投入游戏。
我基本上必须有代码来检查 p1
的牌,看看你选择的牌是否等于 p1
的牌堆中的一张牌,如果它们相等,那么我需要将该元素设置为 NULL。
唯一的问题是 p1
的数组由字符和整数组成,因为它是一个结构数组。否则,设置为 NULL 也不是问题。
在我得到你选择的等于 NULL 的特定元素后,我必须将所有元素推到 NULL 元素之后,一个 space 向前,所以像
p1[x] = p1[x+1];
这是我的代码的开头,struct 所在的位置和 main 所在的位置:
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){
^
这部分:
if(p1[y].suit = NULL)
你应该比较,而不是赋值:
if(p1[y].suit == NULL)
现在,关于作业,来自 C++98 文档:
A null-pointer constant is an integral constant expression that evaluates to zero (such as 0 or 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;
作为奖励,您可以节省一些内存!您可以将花色的字符串指针分配给卡片,瞧,一切正常。
你这里有一些问题。让我们从您的 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
我没有仔细看你的代码,有无效选项甚至可能没有意义。 enum
for Suit
绝对是正确的选择。