死循环,取不到值
Infinite loop, cannot get values
我实际上花了 3 个小时试图让这段代码工作,但是每当我尝试时,我都会陷入循环并且控制台不断循环。我已经尝试了一切 - 我创建了一个 returns 只是我并重新分配值的函数,但它似乎不起作用。
出于某种原因,每当我尝试使用逻辑运算符时,它都不想对我起作用。 mes->hand[x] 的值类似于 "2D,4D,3C,5C,6H,7H" 等等,而花色是 "H", "C" , "D", "S" 参考卡片。
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
while(x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if(i>= 58){
return y;
}
return i;
}
x++;
continue;
}
if(i >= 57) {
y = determine_letter(i);
}
i ++;
x = 0;
continue;
}
return 0;
}
我有以下观察:
您的 continue
语句是多余的。您已经处于循环的底部。 (虽然没有坏处。)
你的数字50
等都是指ASCII字符。添加对此的评论。
我能找到的唯一错误是:
if(i >= 57) {
y = determine_letter(i);
}
这应该是 if (i>=58)
,因为 57 ASCII 是 9
。可能 determine_letter
在收到 57 时感到困惑(该函数显然将高于 9 的卡片映射到您的卡片编码方案中,您没有完全提供)。因此,该函数可以 return return y;
中的无效值,调用函数无法理解该值并导致您的控制台循环。
另外这个语句应该放在while (x < len)
之前,所以你先映射字符然后比较它,在循环结束时递增i
下一个字符(卡值)到比较。
应用这些观察得出:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
if (i >= 58) {
y = determine_letter(i);
}
while (x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if (i >= 58) {
return y;
}
return i;
}
x++;
}
i++;
x = 0;
}
return 0;
}
没有调用者、子函数和卡片编码方案的所有细节,我无法提供更多建议。希望对您有所帮助。
注意:考虑功能,该功能只是 return 给定花色的第一张牌的值。这意味着比较牌值的外循环似乎毫无用处:首先找到第一套花色,然后获取它的值更有效:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0;
while (x < len) {
if (mes->hand[x] == suit)){
return(mes->hand[x-1]);
}
x++;
}
return 0;
}
作为 MWE,这将 "calling determine letter" 打印到控制台 6 次:
#include <stdio.h>
#include <string.h>
int newtrick_value(char* hand, int suit) {
int len = strlen(hand);
int x = 0, i = 50, y = 0;
while (i < 63)
{
x = 0;
while(x < len)
{
printf("i%d, y%d, suit %d, hand[x] %d, hand[x+1] %d\n", i, y, suit, hand[x], hand[x+1]);
if (((hand[x] == i || hand[x] == y) && hand[x+1] == suit))
{
if(i>= 58)
{
return y;
}
return i;
}
x++;
}
if(i >= 57)
{
printf("Calling determine letter\n");
//y = determine_letter(i);
}
i++;
}
return 0;
}
int main(void)
{
newtrick_value("2H,3H", (int)"H");
return 0;
}
据我所知,我没有更改任何逻辑(只是一些格式)。它不应该给出这种行为,因为花色和价值应该匹配。
奇怪的是,指纹如下:
i50, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i50, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i50, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i50, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i50, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i51, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i51, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i51, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i51, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i51, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i52, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i52, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i52, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i52, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i52, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i53, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i53, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i53, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i53, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i53, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i54, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i54, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i54, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i54, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i54, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i55, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i55, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i55, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i55, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i55, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i56, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i56, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i56, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i56, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i56, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i57, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i57, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i57, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i57, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i57, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i58, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i58, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i58, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i58, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i58, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i59, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i59, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i59, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i59, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i59, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i60, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i60, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i60, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i60, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i60, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i61, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i61, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i61, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i61, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i61, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i62, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i62, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i62, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i62, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i62, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
因此将"H"转换为整数给出的花色值看起来特别古怪。
我已经假设了您在结构中如何表示 mes->hand
,但希望这仍然成立。不过我确实注意到一件事,就是为什么您将诉讼作为 int
而不是 char
传递?这似乎是一件更合乎逻辑的事情。
因此,如果您进入无限循环,我怀疑 mes->hand
可能不是空终止的,这意味着 strlen(mes->hand)
将 return 一些未知值,这意味着 while(x < len)
似乎永远不会终止。您能否检查 mes->hand
以确保它是有效的(预期的)字符串?
我实际上花了 3 个小时试图让这段代码工作,但是每当我尝试时,我都会陷入循环并且控制台不断循环。我已经尝试了一切 - 我创建了一个 returns 只是我并重新分配值的函数,但它似乎不起作用。
出于某种原因,每当我尝试使用逻辑运算符时,它都不想对我起作用。 mes->hand[x] 的值类似于 "2D,4D,3C,5C,6H,7H" 等等,而花色是 "H", "C" , "D", "S" 参考卡片。
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
while(x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if(i>= 58){
return y;
}
return i;
}
x++;
continue;
}
if(i >= 57) {
y = determine_letter(i);
}
i ++;
x = 0;
continue;
}
return 0;
}
我有以下观察:
您的
continue
语句是多余的。您已经处于循环的底部。 (虽然没有坏处。)你的数字
50
等都是指ASCII字符。添加对此的评论。我能找到的唯一错误是:
if(i >= 57) { y = determine_letter(i); }
这应该是 if (i>=58)
,因为 57 ASCII 是 9
。可能 determine_letter
在收到 57 时感到困惑(该函数显然将高于 9 的卡片映射到您的卡片编码方案中,您没有完全提供)。因此,该函数可以 return return y;
中的无效值,调用函数无法理解该值并导致您的控制台循环。
另外这个语句应该放在while (x < len)
之前,所以你先映射字符然后比较它,在循环结束时递增i
下一个字符(卡值)到比较。
应用这些观察得出:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0, i = 50, y = 0;
while (i < 63) {
if (i >= 58) {
y = determine_letter(i);
}
while (x < len) {
if (((mes->hand[x] == i || mes->hand[x] == y) && mes->hand[x+1] == suit)){
if (i >= 58) {
return y;
}
return i;
}
x++;
}
i++;
x = 0;
}
return 0;
}
没有调用者、子函数和卡片编码方案的所有细节,我无法提供更多建议。希望对您有所帮助。
注意:考虑功能,该功能只是 return 给定花色的第一张牌的值。这意味着比较牌值的外循环似乎毫无用处:首先找到第一套花色,然后获取它的值更有效:
int newtrick_value(struct Message *mes, int suit) {
int len = strlen(mes->hand);
int x = 0;
while (x < len) {
if (mes->hand[x] == suit)){
return(mes->hand[x-1]);
}
x++;
}
return 0;
}
作为 MWE,这将 "calling determine letter" 打印到控制台 6 次:
#include <stdio.h>
#include <string.h>
int newtrick_value(char* hand, int suit) {
int len = strlen(hand);
int x = 0, i = 50, y = 0;
while (i < 63)
{
x = 0;
while(x < len)
{
printf("i%d, y%d, suit %d, hand[x] %d, hand[x+1] %d\n", i, y, suit, hand[x], hand[x+1]);
if (((hand[x] == i || hand[x] == y) && hand[x+1] == suit))
{
if(i>= 58)
{
return y;
}
return i;
}
x++;
}
if(i >= 57)
{
printf("Calling determine letter\n");
//y = determine_letter(i);
}
i++;
}
return 0;
}
int main(void)
{
newtrick_value("2H,3H", (int)"H");
return 0;
}
据我所知,我没有更改任何逻辑(只是一些格式)。它不应该给出这种行为,因为花色和价值应该匹配。
奇怪的是,指纹如下:
i50, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i50, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i50, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i50, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i50, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i51, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i51, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i51, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i51, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i51, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i52, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i52, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i52, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i52, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i52, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i53, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i53, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i53, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i53, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i53, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i54, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i54, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i54, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i54, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i54, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i55, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i55, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i55, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i55, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i55, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i56, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i56, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i56, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i56, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i56, y0, suit 134514349, hand[x] 72, hand[x+1] 0
i57, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i57, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i57, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i57, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i57, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i58, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i58, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i58, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i58, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i58, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i59, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i59, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i59, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i59, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i59, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i60, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i60, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i60, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i60, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i60, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i61, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i61, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i61, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i61, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i61, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
i62, y0, suit 134514349, hand[x] 50, hand[x+1] 72
i62, y0, suit 134514349, hand[x] 72, hand[x+1] 44
i62, y0, suit 134514349, hand[x] 44, hand[x+1] 51
i62, y0, suit 134514349, hand[x] 51, hand[x+1] 72
i62, y0, suit 134514349, hand[x] 72, hand[x+1] 0
Calling determine letter
因此将"H"转换为整数给出的花色值看起来特别古怪。
我已经假设了您在结构中如何表示 mes->hand
,但希望这仍然成立。不过我确实注意到一件事,就是为什么您将诉讼作为 int
而不是 char
传递?这似乎是一件更合乎逻辑的事情。
因此,如果您进入无限循环,我怀疑 mes->hand
可能不是空终止的,这意味着 strlen(mes->hand)
将 return 一些未知值,这意味着 while(x < len)
似乎永远不会终止。您能否检查 mes->hand
以确保它是有效的(预期的)字符串?