【问题标题】:Why can't I use a function return value as a parameter?为什么我不能使用函数返回值作为参数?
【发布时间】:2016-10-26 00:37:40
【问题描述】:

这是我遇到问题的代码。

#include <stdio.h>

int getplayerone (void);
int getplayertwo (void);
void output (int getplayerone (), int getplayertwo ());

enum choice
{ r, p, s };
typedef enum choice Choice;

int
main (int argc, char *argv[])
{
  //getplayerone();
  // getplayertwo();
  output (getplayerone (), getplayertwo ());
  return 0;
}

int
getplayerone (void)
{
  char choice1;
  int choice1int;
  printf ("Player-1 it is your turn!\n");
  printf ("Please enter your choice (p)aper, (r)ock, ir (s)cissors: ");
  scanf (" %c", &choice1);
  if (choice1 == 'r' || choice1 == 'R')
    {
      choice1int = 0;
    }
  else if (choice1 == 'p' || choice1 == 'P')
    {
      choice1int = 1;
    }
  else if (choice1 == 's' || choice1 == 'S')
    {
      choice1int = 2;
    }
  if (choice1int == 0)
    {

    }

  return choice1int;
}

int
getplayertwo (void)
{
  char choice2;
  int choice2int;
  printf ("\nPlayer-2 it is your turn!\n");
  printf ("Please enter your choice (p)aper, (r)ock, ir (s)cissors: ");
  scanf (" %c", &choice2);
  if (choice2 == 'r' || choice2 == 'R')
    {
      choice2int = 0;
    }
  else if (choice2 == 'p' || choice2 == 'P')
    {
      choice2int = 1;
    }
  else if (choice2 == 's' || choice2 == 'S')
    {
      choice2int = 2;
    }

  return choice2int;
}

void
output (int getplayerone (), int getplayertwo ())
{

  Choice p1choice = getplayerone ();
  Choice p2choice = getplayertwo ();

  if (p1choice == r && p2choice == r)
    {
      printf ("Draw");
    }
  else if (p1choice == r && p2choice == p)
    {
      printf ("Player 2 wins");
    }
  else if (p1choice == r && p2choice == s)
    {
      printf ("Player 1 wins");
    }
  else if (p1choice == s && p2choice == r)
    {
      printf ("Player 2 wins");
    }
  else if (p1choice == s && p2choice == p)
    {
      printf ("Player 1 wins");
    }
  else if (p1choice == s && p2choice == s)
    {
      printf ("Draw");
    }
  else if (p1choice == p && p2choice == r)
    {
      printf ("Player 1 wins");
    }
  else if (p1choice == p && p2choice == p)
    {
      printf ("Draw");
    }
  else if (p1choice == p && p2choice == s)
    {
      printf ("Player 2 wins");
    }

  printf ("%d", p1choice);
}

我需要使用枚举类型来获取每个玩家的输入。 这是一个简单的石头剪刀布游戏。 我的输出函数类型有问题,并且在函数调用中以及在函数体中分配 Choice p1choice 时出现以下错误。

Incompatible integer to pointer conversion passing 'int' to parameter of type 'int (*)()'

Thread 1: EXC_BAD_ACCESS (code=1, address = 0x0)

感谢您的意见和帮助!

【问题讨论】:

  • 为了便于阅读和理解,请始终缩进代码。在每个左大括号 '{' 后缩进。在每个右大括号 '}' 之前取消缩进。
  • 这一行:output( getplayerone(), getplayertwo()); 可能会导致首先检索“playertwo”,因为标准中未定义参数评估的顺序,因此取决于实现
  • 发布的代码包含许多随机空行的实例。为了可读性,最好通过空行分隔代码块(for、if、else、while、do...while、switch、case、default),而不是在函数体中放置其他/随机空行
  • 如果通过switch() 语句而不是少量的if then else 语句来测试choice1 的内容会更加清晰和全面
  • 变量choice1int 未初始化,并且(例如)如果用户输入Q,当它从对getplayerone() 的调用返回时仍将未初始化,顺便说一句:最好是'lower camel case' 变量和函数名称,以提高可读性。这些相同的注意事项也适用于函数:getplayertwo()

标签: c function enums parameters


【解决方案1】:

你这样调用输出:

output( getplayerone(),  getplayertwo());

用函数本身调用它:

output( getplayerone,  getplayertwo);

【讨论】:

  • @sg7 在原代码中,output 函数调用传递给它的函数指针。如果进行了此答案中描述的更改,那将可以正常工作。
  • @M.M 感谢您的评论!是的,如果我们将原型从void output (int getplayerone (), int getplayertwo ()); 更改为void output (int (*f1)(),int (*f2)());,我们可以调用output( getplayerone, getplayertwo);
  • @sg7 这两个原型实际上是相同的。 * 对于函数参数列表中的函数指针是可选的,如果省略 *,则不需要多余的括号。
  • @M.M 你完全正确!很抱歉造成混乱!
【解决方案2】:

为什么不能使用函数返回值作为参数?

你可以。这是正确的调用:

output( getplayerone(),  getplayertwo());

如果

void output(int r1,int r2); // also `void output(int, int);`  would do
void output(int r1,int r2){
//...
}

由于您将函数 output 声明为:

void output(int getplayerone(),int getplayertwo());
void output(int getplayerone(),int getplayertwo()){
//...
}

您需要将函数指针作为参数传递:

   output(getplayerone, getplayertwo);

小例子程序:

#include <stdio.h>

int getplayerone (void);
int getplayertwo (void);

void output (int ret_getplayerone, int ret_getplayertwo);
void output1 (int (*f1)(), int (*f2)() );

int main (int argc, char *argv[])
{
    int r1, r2;
    // 1.
    output (r1=getplayerone(), r2=getplayertwo());// OK, but there is no need to do so 
    output ( getplayerone(),   getplayertwo() );  // OK!
    //output ( getplayerone,   getplayertwo );    // wrong!
    // 2.
    output1 ( getplayerone, getplayertwo );       // pass the function pointers

    return 0;
}

int getplayerone (void)
{
    return 1;
}

int getplayertwo (void)
{
    return 2;
}

void output (int ret_getplayerone, int ret_getplayertwo)
{
 printf ("Output()   %d , %d\n", ret_getplayerone, ret_getplayertwo );
}

void output1 (int (*f1)(), int (*f2)() )
{
 printf ("\nOutput1()  %d , %d\n", (*f1)(), (*f2)() );
}

输出:

Output()   1 , 2
Output()   1 , 2

Output1()  1 , 2

【讨论】:

    【解决方案3】:

    函数原型错了,应该是

    void output(int playerone, int playertwo);
    

    【讨论】:

    • 或者甚至只是void output(int, int);,但无论如何它是一个接受整数的函数,并且它被声明为一个接受函数指针的函数。
    • 当我进行此更改时,我在函数定义中收到错误消息“'输出'的类型冲突”。
    • @RyanAllen 您需要同时更改两者,
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    相关资源
    最近更新 更多