Функция как параметр функции в c

Как передать функцию в качестве параметра в C?

Я хочу создать функцию, которая выполняет функцию, передаваемую параметром в наборе данных. Как передать функцию в качестве параметра в C?

5 ответов

декларация

прототип функции, которая принимает параметр функции, выглядит следующим образом:

здесь указано, что параметр f будет указателем на функцию, которая имеет void тип возврата и который принимает один

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

объявляет функцию, которая возвращает void и не принимает никаких аргументов. Чтобы создать указатель функции на этот тип, теперь вы можете сделать:

для a функция, которая возвращает int и принимает символ, который вы бы сделали

и использовать его

есть библиотеки, которые могут помочь с превращением указателей функций в приятные читаемые типы. The повысить функцию библиотека велика и стоит усилий!

намного лучше, чем выше.

С C++11 вы можете использовать функциональная библиотека сделать это в сжатой и общей форме. Синтаксис, например,

я включил пример программы ниже:

Иногда, однако, удобнее использовать функцию шаблона:

передать адрес функции в качестве параметра другой функции как показано ниже

Также мы можем передать функцию как параметр, используя указатель на функцию

до указатель на функцию. Синтаксис немного громоздкий, но он действительно мощный, как только вы познакомитесь с ним.

Источник

Как передать функцию в качестве параметра в C#?

можно ли передать функцию в качестве параметра в C#? Я могу сделать это с помощью классов Func или Action, но это заставляет меня объявлять всю сигнатуру функции сразу. Когда я пытаюсь использовать делегат, я получаю ошибку компиляции, говоря, что он не может преобразовать группу методов в делегат.

8 ответов:

преобразование группы методов, анонимного метода или лямбда-выражения в делегат требует, чтобы компилятор знал точный тип делегата. Однако вы можете потенциально использовать лямбда-выражения и захваченные переменные, чтобы сделать это проще:

это в основном задерживает вызов обычным способом, но путем обертывания фактического вызова в Add в простом Action делегат.

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

сначала у вас должен быть делегат

затем он приобретает следующий вид:

нет необходимости для любого вызова для вызова.

как с бкость я не понимаю, зачем тебе параметры[] массив. Не могли бы Вы уточнить расширенное использование для параметров?

кроме того, мне придется исправить что-то в вашем вопросе, потому что это вызовет ошибку компиляции :p

пожалуйста, посмотрите на использование делегатов вот отличный пример

Почему вы используете отражение? будет ли когда-нибудь другое количество параметров? или вы знаете, что метод signture останется постоянным (также помните, что C# поддерживает ключевое слово params [])

посмотреть Серия Функционального Программирования по Justin Etheredge. Вы должны найти решение своей проблемы там.

что-то вроде это должно работать для вас:

Источник

Функции (C++)

Функцию можно вызывать или вызывать из любого числа мест в программе. Значения, передаваемые в функцию, являются аргументами, типы которых должны быть совместимы с типами параметров в определении функции.

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

Функции, определенные в области видимости класса, называются функциями-членами. В C++, в отличие от других языков, функции можно также определять в области видимости пространства имен (включая неявное глобальное пространство имен). Такие функции называются бесплатными функциями или функциями, не являющимися членами. Они широко используются в стандартной библиотеке.

Функции могут быть перегружены, а это значит, что разные версии функции могут совместно использовать одно и то же имя, если они отличаются числом и (или) типом формальных параметров. Дополнительные сведения см. в разделе перегрузка функций.

Части объявления функции

Минимальное объявление функции состоит из возвращаемого типа, имени функции и списка параметров (который может быть пустым) вместе с дополнительными ключевыми словами, которые предоставляют компилятору дополнительные инструкции. В следующем примере показано объявление функции:

Определение функции состоит из объявления, а также тела, который является кодом между фигурными скобками:

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

При объявлении функции необходимо указать:

Возвращаемый тип, указывающий тип значения, возвращаемого функцией, или void значение, если значения не возвращаются. В C++ 11 auto является допустимым возвращаемым типом, который указывает компилятору вывести тип из оператора return. В C++ 14 decltype(auto) также разрешено. Дополнительные сведения см. в подразделе «Выведение возвращаемых типов» ниже.

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

Список параметров, заключенный в скобки. В этом списке через запятую указывается нужное (возможно, нулевое) число параметров, задающих тип и, при необходимости, локальное имя, по которому к значениям можно получить доступ в теле функции.

Необязательные элементы объявления функции:

Дополнительные сведения см. в разделе Преобразование единиц и компоновки.

Дополнительные сведения см. в разделе встроенные функции.

(только функции-члены) static применение к функции-члену означает, что функция не связана ни с одним экземпляром объекта класса.

(Только функции-члены, не являющиеся статическими) Квалификатор ref, указывающий компилятору, какую перегрузку функции следует выбрать, когда неявный параметр объекта ( *this ) является ссылкой rvalue или ссылкой lvalue. Дополнительные сведения см. в разделе перегрузка функций.

На следующем рисунке показаны компоненты определения функции. Затененная область является телом функции.

Функция как параметр функции в c
Части определения функции

Определения функций

Определение функции состоит из объявления и тела функции, заключенной в фигурные скобки, которые содержат объявления переменных, инструкции и выражения. В следующем примере показано полное определение функции:

Переменные, объявленные в теле функции, называются локальными. Они исчезают из области видимости при выходе из функции, поэтому функция никогда не должна возвращать ссылку на локальную переменную.

функции const и constexpr

Шаблоны функций

Шаблоны функций подобны шаблонам классов. Их задача заключается в создании конкретных функций на основе аргументов шаблонов. Во многих случаях шаблоны могут определять типы аргументов, поэтому их не требуется явно указывать.

Параметры и аргументы функций

У функции имеется список параметров, в котором через запятую перечислено необходимое (возможно, нулевое) число типов. Каждому параметру присваивается имя, по которому к нему можно получить доступ в теле функции. В шаблоне функции могут указываться дополнительные типы или значения параметров. Вызывающий объект передает аргументы, представляющие собой конкретные значения, типы которых совместимы со списком параметров.

По умолчанию аргументы передаются функции по значению, то есть функция получает копию передаваемого объекта. Копирование крупных объектов может быть ресурсозатратным и неоправданным. Чтобы аргументы передавались по ссылке (в частности в ссылке lvalue), добавьте в параметр квантификатор ссылки.

Если функция изменяет аргумент, передаваемый по ссылке, изменяется исходный объект, а не его локальная копия. Чтобы предотвратить изменение такого аргумента функцией, укажите для параметра значение const&:

C++ 11: Чтобы явно отреагировать на аргументы, передаваемые по ссылке rvalue или lvalue-Reference, используйте двойной амперсанд для параметра, чтобы указать универсальную ссылку:

Функция, объявленная с ключевым словом Single void в списке объявлений параметров, не принимает аргументов, если ключевое слово void является первым и единственным членом списка объявлений аргумента. Аргументы типа void в любом расположении в списке выдают ошибки. Пример:

Обратите внимание, что, хотя недопустимо указывать void аргумент, за исключением описанного здесь, типы, производные от типа void (например, указатели на void и массивы void ), могут отображаться в любом месте списка объявлений аргумента.

Аргументы по умолчанию

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

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

типов возвращаемых функциями значений;

Завершающие возвращаемые типы

«Обычные» возвращаемые типы расположены слева от сигнатуры функции. Завершающий возвращаемый тип расположен в правой части сигнатуры и предшествует -> оператору. Завершающие возвращаемые типы особенно полезны в шаблонах функций, когда тип возвращаемого значения зависит от параметров шаблона.

Если auto используется в сочетании с завершающим возвращаемым типом, он просто выступает в качестве заполнителя для любого результата выражения decltype и не выполняет выведение типов.

Локальные переменные функции

Вычисление типов в возвращаемых типах (C++ 14)

В этом примере auto будет выведена как неконстантная копия значения суммы LHS и RHS.

Обратите внимание, что не auto сохраняет константу-rvalue характеристики типа, который он выводит. Для функций перенаправления, возвращаемое значение которых должно сохранять аргументы const-rvalue характеристики или ref-rvalue характеристики из своих аргументов, можно использовать decltype(auto) ключевое слово, которое использует decltype правила вывода типа и сохраняет все сведения о типе. decltype(auto) может использоваться как обычное возвращаемое значение в левой части или как завершающее возвращаемое значение.

В следующем примере (на основе кода из N3493) показано, как decltype(auto) использовать, чтобы обеспечить точную пересылку аргументов функции в возвращаемый тип, который не известен до создания экземпляра шаблона.

Возврат нескольких значений из функции

Существует несколько способов вернуть более одного значения из функции:

Инкапсулирует значения в именованном классе или объекте структуры. Требует, чтобы определение класса или структуры было видимым для вызывающего объекта:

Возвращает объект «канал» std:: Tuple или std::p Air:

Visual Studio 2017 версии 15,3 и более поздних версий (доступно в /std:c++17 ): используйте структурированные привязки. Преимущество структурированных привязок заключается в том, что переменные, хранящие возвращаемые значения, инициализируются одновременно с объявлением, что в некоторых случаях может быть значительно более эффективным. В операторе auto[x, y, z] = f(); скобки представляют и инициализируют имена, которые находятся в области действия для всего блока Function.

Помимо использования возвращаемого значения, можно «возвращать» значения, определив любое количество параметров для использования передачи по ссылке, чтобы функция могла изменять или инициализировать значения объектов, предоставляемых вызывающим объектом. Дополнительные сведения см. в разделе аргументы функции ссылочного типа.

Указатели функций

Как и в C, в C++ поддерживаются указатели на функции. Однако более типобезопасной альтернативой обычно служит использование объекта-функции.

Рекомендуется typedef использовать для объявления псевдонима для типа указателя функции при объявлении функции, возвращающей тип указателя функции. Например.

Если оно не используется, то правильный синтаксис объявления функции можно вывести из синтаксиса декларатора для указателя на функцию, заменив идентификатор (в приведенном выше примере — fp ) на имя функции и список аргументов, как показано выше:

Предыдущее объявление эквивалентно объявлению, typedef приведенному выше.

Источник

Передача функции в качестве параметра

Может кто помочь объяснить следующую часть кода:

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Передача методу объекта в качестве параметра
Уважаемые знатоки, как понимать Передача методу объекта в качестве параметра?? То есть передаются.

Функция как параметр функции в cПередача произвольной коллекции в качестве параметра
Добрый вечер! Объясните, пожалуйста, как можно передать коллекцию, реализующую тот или иной.

Решение

Добавлено через 1 минуту
но подобное лучше проводить с разными делегатам на мой взгляд, нежели объединять все в одну кучу.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Передача разных конкретных типов перечисления в один метод в качестве параметра
Поскольку прямая лобовая передача типа перечисления в метод в качестве параметра невозможна (?), то.

Функция как параметр функции в cНаписать программу для функции, которая будет получать в качестве параметра объект одного из классов
Нужно написать программу для функции, которая будет получать в качестве параметра объект одного из.

Передача массива как параметра функции
Привет. Подскажите пожалуйста как передать массив в функцию не как ссылку, а просто новый массив.

Хранение и передача метода в качестве параметра
Здравствуйте. Заранее прошу извинить, что создал одну и ту же тему в двух ветках (в том числе и.

Источник

Функции

Введение

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

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

Функция – это именованная часть программы, которая может быть многократно вызвана из другого участка программы (в котором эта функция видна). Функция может принимать фиксированное либо переменное число аргументов, а может не иметь аргументов. Функция может как возвращать значение, так и быть пустой (void) и ничего не возвращать.

Мы уже знакомы с многими функциями и знаем, как их вызывать – это функции библиотек stdio, stdlib, string, conio и пр. Более того, main – это тоже функция. Она отличается от остальных только тем, что является точкой входа при запуске приложения.
Функция в си определяется в глобальном контексте. Синтаксис функции:

Самый простой пример – функция, которая принимает число типа float и возвращает квадрат этого числа

Внутри функции sqr мы создали локальную переменную, которой присвоили значение аргумента. В качестве аргумента функции передали число 9,3. Служебное слово return возвращает значение переменной tmp. Можно переписать функцию следующим образом:

В данном случае сначала будет выполнено умножение, а после этого возврат значения. В том случае, если функция ничего не возвращает, типом возвращаемого значения будет void. Например, функция, которая печатает квадрат числа:

в данном случа return означает выход из функции. Если функция ничего не возвращает, то return можно не писать. Тогда функция доработает до конца и произойдёт возврат управления вызывающей функции.

Если функция не принимает аргументов, то скобки оставляют пустыми. Можно также написать слово void:

Формальные и фактические параметры

П ри объявлении функции указываются формальные параметры, которые потом используются внутри самой функции. При вызове функции мы используем фактические параметры. Фактическими параметрами могут быть переменные любого подходящего типа или константы.

Например, пусть есть функция, которая возвращает квадрат числа и функция, которая суммирует два числа.

Обращаю внимание, что приведение типов просиходит неявно и только тогда, когда это возможно. Если функция получает число в качестве аргумента, то нельзя ей передать переменную строку, например «20» и т.д. Вообще, лучше всегда использовать верный тип или явно приводить тип к нужному.
Если функция возвращает значение, то оно не обязательно должно быть сохранено. Например, мы пользуемся функцией getch, которая считывает символ и возвращает его.

Передача аргументов

При передаче аргументов происходит их копирование. Это значит, что любые изменения, которые функция производит над переменными, имеют место быть только внутри функции. Например

Программы выведет
200
100
200
Понятно почему. Внутри функции мы работаем с переменной x, которая является копией переменной d. Мы изменяем локальную копию, но сама переменная d при этом не меняется. После выхода из функции локальная переменная будет уничтожена. Переменная d при этом никак не изменится.
Каким образом тогда можно изменить переменную? Для этого нужно передать адрес этой переменной. Перепишем функцию, чтобы она принимала указатель типа int

Вот теперь программа выводит
200
100
100
Здесь также была создана локальная переменная, но так как передан был адрес, то мы изменили значение переменной d, используя её адрес в оперативной памяти.

В программировании первый способ передачи параметров называют передачей по значению, второй – передачей по указателю. Запомните простое правило: если вы хотите изменить переменную, необходимо передавать функции указатель на эту переменную. Следовательно, чтобы изменить указатель, необходимо передавать указатель на указатель и т.д. Например, напишем функцию, которая будет принимать размер массива типа int и создавать его. С первого взгляда, функция должна выглядеть как-то так:

Но эта функция выведет ERROR. Мы передали адрес переменной. Внутри функции init была создана локальная переменная a, которая хранит адрес массива. После выхода из функции эта локальная переменная была уничтожена. Кроме того, что мы не смогли добиться нужного результата, у нас обнаружилась утечка памяти: была выделена память на куче, но уже не существует переменной, которая бы хранила адрес этого участка.

Для изменения объекта необходимо передавать указатель на него, в данном случае – указатель на указатель.

Вот теперь всё работает как надо.
Ещё подобный пример. Напишем функцию, которая принимает в качестве аргумента строку и возвращает указатель на область памяти, в которую скопирована эта строка.

В этом примере утечки памяти не происходит. Мы выделили память с помощью функции malloc, скопировали туда строку, а после этого вернули указатель. Локальные переменные были удалены, но переменная test хранит адрес участка памяти на куче, поэтому можно его удалить с помощью функции free.

Объявление функции и определение функции. Создание собственной библиотеки

В си можно объявить функцию до её определения. Объявление функции, её прототип, состоит из возвращаемого значения, имени функции и типа аргументов. Имена аргументов можно не писать. Например

Это смешанная рекурсия – функция odd возвращает 1, если число нечётное и 0, если чётное.

Содержимое файла исходного кода File1.c

Рассмотрим особенности каждого файла. Наш файл, который содержит функцию main, подключает необходимые ему библиотеки а также заголовочный файл File1.h. Теперь компилятору известны прототипы функций, то есть он знает возвращаемый тип, количество и тип аргументов и имена функций.

Заголовочный файл, как и оговаривалось ранее, содержит прототип функций. Также здесь могут быть подключены используемые библиотеки. Макрозащита #define _FILE1_H_ и т.д. используется для предотвращения повторного копирования кода библиотеки при компиляции. Эти строчки можно заменить одной

Файл File1.c исходного кода подключает свой заголовочный файл. Всё как обычно логично и просто. В заголовочные файлах принято кроме прототипов функций выносить константы, макроподстановки и определять новые типы данных. Кроме того, именно в заголовочных файлах можно обширно комментировать код и писать примеры его использования.

Передача массива в качестве аргумента

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

В этом примере функция может иметь следующий вид

Также напомню, что правило подмены массива на указатель не рекурсивное. Это значит, что необходимо указывать размерность двумерного массива при передаче

Если двумерный массив создан динамически, то можно передавать указатель на указатель. Например функция, которая получает массив слов и возвращает массив целых, равных длине каждого слова:

Можно вместо того, чтобы возвращать указатель на массив, передавать массив, который необходимо заполнить

На этом первое знакомство с функциями заканчивается: тема очень большая и разбита на несколько статей.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *