将指向函数的指针作为函数的参数传递

时间:2019-03-26 23:28:01

标签: c++ parameter-passing function-pointers extern-c

只是想知道是否有人可以给我一些有关我在哪里出错的建议。如果按原样运行,我的程序就可以正常运行,但是只要将注释行与下面的注释行交换,就会出现错误。我的目标是能够使用注释行,因为我想创建一个程序,让我将指向函数的指针作为另一个函数的参数传递,但是到目前为止,我还没有运气。

#include <iostream>
using namespace std;

double arith_op(double left, double right, double (*f)(double, double));
double addition(double left, double right);
double subtraction(double left, double right);
double multiplication(double left, double right);

int main()
{
  double left, right;
  int choice;
  double (*f[3])(double, double) = { addition, subtraction, multiplication };
  
  cout << "Enter 1 for addition, 2 for subtraction, 3 for multiplication "
       << "(-1 to end): " << endl;
  cin >> choice;

  while (choice != -1) {

    cout << "Enter a floating-point number: " << endl;
    cin >> left;

    cout << "Enter another floating-point number: " << endl;
    cin >> right;

    // double* result = arith_op(left, right, f[choice - 1](left, right));
     double result = f[choice - 1](left, right);

    if (choice == 1) {
      cout << left << " + " << right << " = " << result;
    }
    else if (choice == 2) {
      cout << left << " - " << right << " = " << result;    
    }
    else {
      cout << left << " * " << right << " = " << result;    
    }
    cout << endl;

    cout << "Enter 1 for addition, 2 for subtraction, 3 for multiplication "
     << "(-1 to end): " << endl;
    cin >> choice;
  }
}

double arith_op(double left, double right, double (*f)(double, double))
{
  return (*f)(left, right);
}

double addition(double left, double right)
{
  return left + right;
}
double subtraction(double left, double right)
{
  return left - right;
}

double multiplication(double left, double right)
{
  return left * right;
}

我应该补充一点,我的最终目标是将arith_op函数和其他函数打包在单独的文件中,然后通过将其原型包含在'extern'中来使用它们。这可能是解决问题的一种奇怪方法-用于分配作业,而且它们总是很奇怪。

谢谢:)

韦德

2 个答案:

答案 0 :(得分:3)

您的问题在这里的第3个论点

arith_op(left, right, f[choice - 1](left, right));

f[i](left, right)正在调用该函数以提供双精度,而不是将函数指针传递到arith_op中。只需删除参数列表

arith_op(left, right, f[choice - 1]);

答案 1 :(得分:0)

s头我现在觉得很蠢。有用。太好了,谢谢!

可悲的是,我的程序实际上并没有获得满分,这是因为我们必须使用自动在线标记系统来提交它。因此,如果您的格式不完全正确,那么即使程序运行正常,您也会失去分数。

后脚本-根据分配说明,我还成功地将函数移到了单独的文件中。它告诉我我的函数名称不正确,但是程序有效,这很重要。