уменьшение количества аргументов в функциях в C

Я хочу выполнить численное интегрирование функции f с помощью функции qtrap, определенной в «Численных рецептах в C».

double qtrap(double (*func)(double), double a, double b);

Как показано, это одномерное интегрирование переменной типа double.

Но функция, которую я хочу интегрировать, имеет дополнительный параметр a:

double f(double x, int a)
{
    return a + x * x;
}

Теперь я ищу способ интегрировать f для разных значений a.

Моя идея до сих пор:

typedef double (*fctp1_t)(double);       //function pointer type for 1 arg
typedef double (*fctp2_t)(double, int);  //function pointer type for 2 args

int a = 10;
fctp1_t = f1d;
f1d = reduceArgument(f, a);

qtrap(f1d, 0, 1);

с reduceArgument примерно так:

fctp1_t reduceArgument(fctp2_t f2d, int ia)
{
    return f2d(x, ia);
}    

Этот код приводит к ошибке: «x» не объявлен.

Спасибо за любые предложения.


person Daniel    schedule 06.03.2019    source источник
comment
Включите предупреждения компилятора и следите за предупреждениями.   -  person pmg    schedule 06.03.2019
comment
Ну, с -Wall я не получаю предупреждений компилятора.   -  person Daniel    schedule 06.03.2019
comment
У вас есть случайная переменная x в вашем коде. Очевидно, что компилятор не знает, что с ним делать, но и мы тоже.   -  person SergeyA    schedule 06.03.2019
comment
x — переменная интегрирования функции f. Я вижу, что компилятор не может обработать x; вот почему я застрял; вот почему я задаю вопрос. Я надеюсь, что проблема ясна для человеческого разума.   -  person Daniel    schedule 06.03.2019
comment
stackoverflow .com/questions/4393716/   -  person Antti Haapala    schedule 06.03.2019
comment
Ну... в fctp1_t = f1d; вы пытаетесь присвоить что-то (я предположил, что это что-то определено) типу. Я не тестировал ни одного компилятора, но предположил, что любой хотя бы приличный будет жаловаться.   -  person pmg    schedule 06.03.2019
comment
Можете ли вы разветвить qtrap() на что-то вроде double qtrap2(double (*func)(double, int), double a, double b);?   -  person pmg    schedule 06.03.2019


Ответы (1)


C не позволяет построить такую ​​​​функцию. У вас есть два способа решить вашу проблему:

  • изменить qtrap, чтобы он мог обрабатывать параметризованную функцию;

  • используйте глобальную переменную для неявной передачи параметра.

person AProgrammer    schedule 06.03.2019