Какая стандартная альтернатива вложенным функциям в C? Как дать одной функции область действия другой? Я действительно не хочу передавать дополнительные параметры, такие как структура, использовать ввод переменной длины или использовать расширение gcc, если нет другого пути.
Для моей конкретной проблемы у меня есть эта функция:
double findroot(double (*fp)(double), double start, double end);
Он находит корень функции f (x) одной переменной с указателем функции в качестве аргумента.
Я хочу передать функцию нескольких переменных, в которой все, кроме одной, фиксированы. Например, f (x, a, b, c), где a, b и c - все переданные константы, а x - единственная переменная, которая изменяется. Как мне найти f (0, a, b, c), сохранив при этом функцию findroot такой же, чтобы функция findroot была многоразовой и универсальной, а не специфичной для этого случая?
Спасибо.
void*
и заставляю обратный вызов принимать этот указатель в качестве своего первого параметра. Это продвигает хорошие принципы разработки программного обеспечения, позволяя функциям быть реентерабельными; В частности, это позволяет избежать использования внеполосных данных, считываемых через глобальные объекты. Например:typedef double (*SINGLEVARFN)(void* ctx, double x); double findRoot(SINGLEVARFN fn, void* ctx, double start, double end);
- person Iwillnotexist Idonotexist   schedule 26.11.2014pthread_create()
? Это модель того, как это делается правильно. - person Iwillnotexist Idonotexist   schedule 26.11.2014findroot
на это с самого начала. Если его среда сбрасывается / повторно инициализируется с каждым набором корней, это может не иметь смысла. - person David C. Rankin   schedule 26.11.2014pthread_create()
- это функция, которая порождает поток в Unix. Его аргументы - это указатели на объекты атрибутовpthread_t
иpthread_attr_t
, указатель на обратный вызовvoid* (*) (void*)
и указатель аргументаvoid*
для обратного вызова. Когда создается новый поток, он вызывает обратный вызов с аргументомvoid*
, предоставленнымpthread_create()
. Обратный вызов спроектирован так, что он принимает именно этот аргумент, и, таким образом, порождение потока не требует какого-либо глобального состояния или вложенных функций. - person Iwillnotexist Idonotexist   schedule 26.11.2014