@Theobeliks

Ошибка: «Отсутствует аргумент, соответствующий требуемому формальному параметру», в чем причина?

Написан код для передачи функций в качестве параметров:
using System;

namespace Lab12
{
    delegate double F1(double a);
    class Program
    {
        public void input(double[] x, ref string q)
        {
            string s;
            for (int i = 0; i < x.Length; i++)
            {
                Console.WriteLine("Enter {0}[{1}]=", q, i);
                s = Console.ReadLine();
                x[i] = Convert.ToDouble(s);
            }
        }
        public void sum(double[] x, F1 f1, F1 f2, F1 f3, F1 f4, out double A, out double B, out double C, out double s, out double p, out double D, out double E, out double F)
        {
            A = B = C = D = E = F = s = 0;
            p = 1;
            for (int i = 0; i < x.Length; i++)
            {
                s += x[i];
                p *= x[i];
                A += s * x[i] * f1(x[i]);
                B += p * x[i] * f2(x[i]);
                C += (s + p) * x[i] * f3(x[i]);
                D += s * x[i] * f3(x[i]);
                E += p * x[i] * f4(x[i]);
                F += (s + p) * x[i] * f2(x[i]);
            }
        }
        static void Main(string[] args)
        {
            Program q = new Program();
            string w;
            int n, m;
            Console.WriteLine("Enter n=");
            w = Console.ReadLine();
            n = Convert.ToInt32(w);
            Console.WriteLine("Enter m=");
            w = Console.ReadLine();
            m = Convert.ToInt32(w);
            string name1 = "alfa";
            string name2 = "beta";
            double[] alfa = new double[n];
            double[] beta = new double[m];
            double A, B, C, D, E, F, s, p, denominator, gamma;
            q.input(alfa, ref name1);
            q.input(beta, ref name2);
            q.sum(alfa, Math.Sin, Math.Cos, Math.Tan, out A, out B, out C, out s, out p);
            q.sum(beta, Math.Tan, Math.Exp, Math.Sin, out D, out E, out F, out s, out p);
            denominator = D * E * Math.Sin(F);
            if (denominator != 0)
            {
                gamma = (A + B * Math.Cos(C)) / (D + E * Math.Sin(F));
            }
            else
                Console.WriteLine("Division by zero!");
        }
    }
}

Но выдает ошибку "Отсутствует аргумент, соответствующий требуемому формальному параметру "p" из "Program.sum(double[], F1, F1, F1, F1, out double, out double, out double, out double, out double, out double, out double, out double)"
В чем может быть причина?
  • Вопрос задан
  • 1352 просмотра
Решения вопроса 1
@cicatrix
было бы большой ошибкой думать
Вы передаёте мета-описания функций, а не их реализации.
Делегат - это указатель на место в памяти процесса, по которому расположен тот или иной метод, который можно вызвать, если соблюдать соглашения, предписанные делегатом - количество и типы аргументов и возвращаемое значение.
В вашем случае реализаций мат. функций в памяти нет. Машина не знает, по какому адресу сделать вызов.
Вы должны написать реализации синуса, косинуса и пр. Только тогда вы сможете передавать функции для выполнения другому методу через делегат.

Вот простенький пример (реализация функций может быть и в отдельных методах):
delegate double mathfunc(double arg);
static void Main()
{
        mathfunc sin = arg => Math.Sin(arg);  // реализация синуса
        mathfunc cos = arg => Math.Cos(arg);  // реализация косинуса
        var result_sin = DoMath(sin, Math.PI / 2);  // передача адреса на реализацию синуса методу DoMath
        var result_cos = DoMath(cos, Math.PI / 2);
}

// Метод, который выполняет вызов функции через делегат
static double DoMath(mathfunc function, double argument) 
{
    return function(argument);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы