Передача указателя на функцию в качестве аргумента функции - PullRequest
0 голосов
/ 27 марта 2019

Просто интересно, может ли кто-нибудь дать мне какой-нибудь совет относительно того, где я здесь ошибаюсь.Моя программа работает нормально, если я запускаю ее как есть, но как только я заменяю закомментированную строку на строку ниже, я получаю ошибки.Моя цель - использовать закомментированную строку, потому что я хочу создать программу, которая позволяет мне передавать указатель на функцию в качестве аргумента другой функции, но пока мне не повезло.

#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'.Это может быть странным способом решения проблемы - это для задания, а они всегда странные.

Спасибо :)

Wade

Ответы [ 2 ]

3 голосов
/ 27 марта 2019

Ваша проблема в 3-м аргументе здесь

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

f[i](left, right) вызывает функцию для получения двойного значения вместо передачи указателя функции на arith_op. Просто удалите список параметров

arith_op(left, right, f[choice - 1]);
0 голосов
/ 27 марта 2019

хлопает головой Теперь я чувствую себя глупо.Оно работает.Блестяще, спасибо!

К сожалению, моя программа все еще не дает мне полную оценку, но это потому, что мы должны представить ее с помощью автоматизированной системы онлайн-маркировки.Так что, если ваш формат не совсем правильный, вы потеряете оценки, даже если программа на самом деле работает нормально.

Постскриптум - я также успешно переместил свои функции в отдельный файл согласно инструкциям назначения.Это говорит мне, что я не правильно назвал свои функции, но программа работает, и это важно.

...