是的,我知道这听起来很傻但我不知道我做错了什么!
该功能是扑克游戏的一部分,其中有10个功能,每个功能都会检查特定的扑克牌。如果激活,该功能打印线#34;播放器1有一个满堂红!"或者无论手是什么。但是,我还需要增加p1的值,其中p1是一个全局变量,它保持p1的总分。
打印线条效果很好,但是当我想要将值10分配给p1时,它根本就不会分配。
在下面的示例中,printfs应该可以正常工作,但px不会分配。我甚至在每个函数后立即打印了px的值,它仍然打印0。
void checkForPoker(int j, int px) //j is the player's number, px is the player's scoreholder
{
if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
px = 8;
}
if (c5==c2 && c2==c3 && c3==c4)
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
px = 8;
}
}
答案 0 :(得分:3)
您通过参考" 传递参数"按值" 而不是"?这意味着,一旦您将px
传递给函数,您就会在函数内部对其进行复制,因此函数内部的任何修改都不会影响原始px
。
试试这个(参见我们现在将参数作为指针传递给函数):
void checkForPoker(int j, int* px) //j is the player's number, px is the player's scoreholder
{
if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
*px = 8;
}
if (c5==c2 && c2==c3 && c3==c4)
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
*px = 8;
}
}
这也意味着调用代码的变化。您不必传递整数,而是必须将地址传递给整数,例如:
而不是
int a = 2;
checkForPoker(2, a);
您必须执行以下操作:
int a = 2;
checkForPoker(2, &a);
正如SO用户(Charlon)所建议的那样,您可以选择另一种方法,避免使用指针:您可以使用px
作为函数的返回值:
int checkForPoker(int j) //j is the player's number
{
int px = 0;
if ((c1==c2 && c2==c3 && c3==c4) || (c1==c2 && c2==c3 && c3==c5) || (c1==c2 && c2==c4 && c4==c5) || (c1==c3 && c3==c4 && c4==c5))
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c1));
px = 8;
}
if (c5==c2 && c2==c3 && c3==c4)
{
printf("\n\nEl Jugador %d tiene un poker de %ss!", j, traducirCarta(c2));
px = 8;
}
return px;
}
然后你可以像这样指定玩家的得分者:
player->scoreholder = checkForPoker(int j) //j is the player's number
请注意我出于性能原因坚持第一种方法(第二种方法中的多余副本)。