функция как параметр функции в c
Функция как параметр функции
В языках Си и Си++ возможны только две операции с функциями: вызов и взятие адреса. Указатель, полученный с помощью последней операции, можно впоследствии использовать для вызова функции.
// одного параметра типа char*
fct = ≫// переменной fct присваиваем адрес
// функции gg (она подходит!)
(*efct)(«текст»);// вызов gg через указатель fct
Отметим, что формальные параметры в указателях на функцию описываются так же, как и в обычных функциях. При присваивании указателю на функцию требуется точное соответствие типа функции и типа присваиваемого значения.
void (*pf)(char*);// указатель на функцию void(char*)
// pf = &f2; // ошибка: неверный тип
// pf = &f3; // ошибка: несоответствие типов
// (*pf)(1); // ошибка: неверный тип параметра
// должен быть char*, не int
// int i = (*pf)(«текст»);// ошибка: void присваивается int
Зачастую бывает удобнее обозначить тип указателя на функцию отдельным именем (используя служебное слово typedef для определения нового пользовательского типа), чем все время использовать достаточно сложную запись. Например:
typedef int (*ptr)(int, double);
После того, как мы определили возможность создания такого типа как указатель на функцию, возникает закономерный вопрос: «А можно ли некоторую функцию передавать в качестве параметра в функцию?» Проиллюстрируем такую ситуацию следующим примером.
typedef double (*ptr)(int, int);// определили тип для
// функций, которые будут выполнять
// основные действия задачи
double Plus(int a, int b)
// предоставим читателю возможность самостоятельно
// определить функции разности и произведения:
double Minus(int a, int b)< /*. */>
double Mult(int a, int b)*.>
double Div(int a, int b)
c=(a*1.0)/b; // умножение на единицу нужно для того, чтобы
return c;// привести частное к вещественному числу
// функция степени (удобно организовать рекурсивной):
double ExpAB(int a, int b)
if(b>0)// если b>0, то соотношение
return ExpAB(a, b-1)*a;// вида ab=ab-1*a
return ExpAB(a, b+1)/a;// ab=ab+1/a
// функция ввода массива:
void InputMas(int* a, int n)
// функция вывода массива-результата:
void OutputMas(double* a, int n)
// подготовка к выполнению указанной пользователем
// выполнение действий по формированию массива-
Отметим, что функция Calculate, в которой осуществляются основные действия с массивами сама «не знает», какая операция будет выполнена. Она только получает адрес функции, выполняющей некоторую операцию, и обращается по этому адресу.
Как передать функцию в качестве параметра в C?
Я хочу создать функцию, которая выполняет функцию, передаваемую параметром в наборе данных. Как передать функцию в качестве параметра в C?
5 ответов
декларация
прототип функции, которая принимает параметр функции, выглядит следующим образом:
здесь указано, что параметр f будет указателем на функцию, которая имеет void тип возврата и который принимает один
этот вопрос уже имеет ответ для определения указателей функций, однако они могут быть очень грязными, особенно если вы собираетесь передавать их вокруг своего приложения. Чтобы избежать этой неприятности, я бы рекомендовал вам ввести указатель функции в нечто более читаемое. Например.
объявляет функцию, которая возвращает void и не принимает никаких аргументов. Чтобы создать указатель функции на этот тип, теперь вы можете сделать:
для a функция, которая возвращает int и принимает символ, который вы бы сделали
и использовать его
есть библиотеки, которые могут помочь с превращением указателей функций в приятные читаемые типы. The повысить функцию библиотека велика и стоит усилий!
намного лучше, чем выше.
С C++11 вы можете использовать функциональная библиотека сделать это в сжатой и общей форме. Синтаксис, например,
я включил пример программы ниже:
Иногда, однако, удобнее использовать функцию шаблона:
передать адрес функции в качестве параметра другой функции как показано ниже
Также мы можем передать функцию как параметр, используя указатель на функцию
до указатель на функцию. Синтаксис немного громоздкий, но он действительно мощный, как только вы познакомитесь с ним.
Как передать функцию в качестве параметра в C#?
можно ли передать функцию в качестве параметра в C#? Я могу сделать это с помощью классов Func или Action, но это заставляет меня объявлять всю сигнатуру функции сразу. Когда я пытаюсь использовать делегат, я получаю ошибку компиляции, говоря, что он не может преобразовать группу методов в делегат.
8 ответов:
преобразование группы методов, анонимного метода или лямбда-выражения в делегат требует, чтобы компилятор знал точный тип делегата. Однако вы можете потенциально использовать лямбда-выражения и захваченные переменные, чтобы сделать это проще:
это в основном задерживает вызов обычным способом, но путем обертывания фактического вызова в Add в простом Action делегат.
если это не соответствует вашим требованиям, возможно, вы можете рассказать нам немного больше о то, что вы действительно пытаетесь достичь.
сначала у вас должен быть делегат
затем он приобретает следующий вид:
нет необходимости для любого вызова для вызова.
как с бкость я не понимаю, зачем тебе параметры[] массив. Не могли бы Вы уточнить расширенное использование для параметров?
кроме того, мне придется исправить что-то в вашем вопросе, потому что это вызовет ошибку компиляции :p
пожалуйста, посмотрите на использование делегатов вот отличный пример
Почему вы используете отражение? будет ли когда-нибудь другое количество параметров? или вы знаете, что метод signture останется постоянным (также помните, что C# поддерживает ключевое слово params [])
посмотреть Серия Функционального Программирования по Justin Etheredge. Вы должны найти решение своей проблемы там.
что-то вроде это должно работать для вас:
Передача функции в качестве параметра
Может кто помочь объяснить следующую часть кода:
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Передача класса в качестве параметра
Возможно ли передать класс в качестве параметра определённой функции что бы она на базе этого.
Передача методу объекта в качестве параметра
Уважаемые знатоки, как понимать Передача методу объекта в качестве параметра?? То есть передаются.
Передача произвольной коллекции в качестве параметра
Добрый вечер! Объясните, пожалуйста, как можно передать коллекцию, реализующую тот или иной.
Решение
Добавлено через 1 минуту
но подобное лучше проводить с разными делегатам на мой взгляд, нежели объединять все в одну кучу.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Передача разных конкретных типов перечисления в один метод в качестве параметра
Поскольку прямая лобовая передача типа перечисления в метод в качестве параметра невозможна (?), то.
Написать программу для функции, которая будет получать в качестве параметра объект одного из классов
Нужно написать программу для функции, которая будет получать в качестве параметра объект одного из.
Передача массива как параметра функции
Привет. Подскажите пожалуйста как передать массив в функцию не как ссылку, а просто новый массив.
Хранение и передача метода в качестве параметра
Здравствуйте. Заранее прошу извинить, что создал одну и ту же тему в двух ветках (в том числе и.