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

时间:2014-12-05 16:18:33

标签: c variables pass-by-value

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

该功能是扑克游戏的一部分,其中有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;
    }
}

1 个答案:

答案 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

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

进一步阅读

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