德州扑克胜率计算应用开发中,洗牌后断言校验重复卡片时的无效数据类型比较问题求助
解决德州扑克洗牌后重复卡片检查的断言错误
看起来你在检查洗牌后卡片是否重复时,遇到了C语言中结构体/指针比较的常见问题。让我们一步步拆解问题并解决它:
问题根源
你定义的card_t是一个结构体类型,C语言不允许直接使用==运算符比较两个结构体变量,也不能直接通过指针地址比较来判断卡片是否相同(除非你想检查两个指针是否指向同一张卡片对象,而不是卡片内容是否重复)。这就是你收到"无效数据类型比较"错误的核心原因。
解决方案
要正确判断两张卡片是否重复,你需要比较它们的成员变量——也就是value和suit。下面是具体的实现步骤:
1. 编写卡片比较辅助函数
先写一个工具函数来判断两张卡片的内容是否完全相同:
#include <stdbool.h> // 需要引入bool类型的头文件 bool cards_are_equal(const card_t *card1, const card_t *card2) { // 先检查指针是否有效(可选,但能让代码更健壮) if (card1 == NULL || card2 == NULL) { return false; } // 同时比较卡片的数值和花色,两者都相同才视为重复 return (card1->value == card2->value) && (card1->suit == card2->suit); }
2. 实现重复卡片检查的断言逻辑
使用双重循环遍历牌组中的每一张卡片,和后续卡片逐一比较,发现重复就触发断言:
#include <assert.h> void assert_deck_has_no_duplicates(const deck_t *deck) { // 先断言牌组基础参数合法,避免空指针或无效长度导致的崩溃 assert(deck != NULL); assert(deck->cards != NULL); assert(deck->n_cards > 0); for (size_t i = 0; i < deck->n_cards; i++) { for (size_t j = i + 1; j < deck->n_cards; j++) { // 使用辅助函数比较卡片内容,触发断言提示重复问题 assert(!cards_are_equal(deck->cards[i], deck->cards[j]) && "洗牌后牌组出现重复卡片"); } } }
额外注意事项
- 如果你尝试直接写
deck->cards[i] == deck->cards[j],这只是在比较两个指针的内存地址,只能判断是否指向同一张卡片对象,无法检测不同对象但内容完全相同的重复卡片。 - 虽然可以用
memcmp(card1, card2, sizeof(card_t))来比较结构体,但这种方式依赖于结构体没有内存填充(padding),不如逐个成员比较安全可靠,可读性也更强。
内容的提问来源于stack exchange,提问作者Nitya Patel
相关产品推荐
相关产品推荐

