将指向函数的指针作为参数传递给函数
Passing a pointer to a function as an argument to a function
只是想知道是否有人可以给我一些关于我这里哪里出错的建议。如果我按原样 运行 我的程序工作正常,但是一旦我将注释行与其下面的行交换,我就会出错。我的目标是能够使用注释行,因为我想创建一个程序,让我将指向一个函数的指针作为另一个函数的参数传递,但到目前为止我还没有运气。
#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' 中来使用它们。这可能是解决问题的一种奇怪方式 - 它用于作业,而且它们总是很奇怪。
谢谢 :)
韦德
你的问题出在第三个参数
arith_op(left, right, f[choice - 1](left, right));
f[i](left, right)
是调用函数给出一个双精度值,而不是将函数指针传递给 arith_op
。只需删除参数列表
arith_op(left, right, f[choice - 1]);
拍脑袋我现在觉得自己很傻。有用。太棒了,谢谢!
遗憾的是,我的程序实际上仍然没有得到满分,但那是因为我们必须使用自动在线评分系统提交它。因此,如果您的格式不完全正确,即使程序确实运行良好,您也会被扣分。
Post 脚本 - 根据分配说明,我还成功地将我的函数移动到一个单独的文件中。它告诉我我没有正确命名我的函数,但程序运行正常,这才是最重要的。
只是想知道是否有人可以给我一些关于我这里哪里出错的建议。如果我按原样 运行 我的程序工作正常,但是一旦我将注释行与其下面的行交换,我就会出错。我的目标是能够使用注释行,因为我想创建一个程序,让我将指向一个函数的指针作为另一个函数的参数传递,但到目前为止我还没有运气。
#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' 中来使用它们。这可能是解决问题的一种奇怪方式 - 它用于作业,而且它们总是很奇怪。
谢谢 :)
韦德
你的问题出在第三个参数
arith_op(left, right, f[choice - 1](left, right));
f[i](left, right)
是调用函数给出一个双精度值,而不是将函数指针传递给 arith_op
。只需删除参数列表
arith_op(left, right, f[choice - 1]);
拍脑袋我现在觉得自己很傻。有用。太棒了,谢谢!
遗憾的是,我的程序实际上仍然没有得到满分,但那是因为我们必须使用自动在线评分系统提交它。因此,如果您的格式不完全正确,即使程序确实运行良好,您也会被扣分。
Post 脚本 - 根据分配说明,我还成功地将我的函数移动到一个单独的文件中。它告诉我我没有正确命名我的函数,但程序运行正常,这才是最重要的。