调用者看不到函数的变量?

是的,我知道这听起来很傻但我不知道我做错了什么!

该function是扑克游戏的一部分,其中有10个function,每个function都检查特定的扑克牌。 如果激活,该function将打印“玩家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; } } 

您传递参数“按值”而不是“按引用” 。 这意味着一旦你将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 

请注意 ,出于性能原因,我会坚持使用第一种方法(第二种方法中的多余副本)。

进一步阅读

有关该主题的扩展阅读,您可以找到有用的这些链接: [1] [2]