[C] как функцией вернуть функцию?
double GetFunctions(unsigned char fn) (double, double)Эээ... во-первых, что означает "(double,double)"?
А во-вторых - наверное, ей не нравится факт того, что ты возвращаешь какую-то функцию, когда она должна возвращать double...
double (*GetFunctions(unsigned char fn (double,double)
{
return f2;
}
Где f2 есть
double f2 (double, double);
Уже не помню, где читал - но там такие вещи делались с помощью typedef функции с данными типами аргументов и возвращаемых значений - а потом просто писалась обычная функция, с аргументами или с возвращаемым значением этого типа...
typedef double (*PFundouble, double);
PFun GetFunction(int k)
{
...
}
так сделан signal, например. он возвращает тип signal_t и принимает аргумент такого типа..
Пробовал typedef double * (double,double) PFun, но ничего не вышло, и я забил.
hint: Синтаксис typedef такой же как объявление переменной.
просто объект, который объявляется при помощи typedef становится не переменной, а типом.
еще больше запутал своим "большим" хинтом лучше бы не писал
А я всё понял... что я делаю не так
Си это не Лисп, там функции - второсортные объекты и с ними ничего интересного нельзя сделать
boost::lambda
указатель можно, функцию - нет. возврат функции возможет только в языках с lazy evaluation (нестрогих функциональных, например). в остальных функция вычисляется сразу, как только встречается, поэтому вернуть её никак не получится.
Гы, это-то понятно, но как заковыристо ты выразился =)
а в чем разница ?
C не ведает «::»
в чём разница между функционалом и оператором над некоторым пространством?
да вроде нет
в чём разница между функционалом и оператором над некоторым пространством?Это для меня слишком сложно.
В чем функциональная разница ? Что можно сделать с указателем на функцию, что нельзя с функцией ? И вообще, что такое функция ?
функция - отнюдь не число.Неужели набор чисел ?
нет, функция - это отображение из одного множества в другое.
ты не прав имхо. Указатель - это не адрес, это переменная, хранящая адрес. Функция - условно говоря, это просто адрес. Именно поэтому у указателя адрес взять можно, а у функции нет.
В каком смысле у функции нельзя взять адрес?
у указателя можно узнать адрес. у функции - нет.Указатель - это и есть адрес. Адрес функции.
В PHP, к примеру, ты можешь создать динамическую функцию string create_function (string args, string code). Эта функция вернет тебе имя для твоей новой функции, по которому и можешь ее вызвать.
можно вернуть указатель на уже существующую функциюНу вобщем все правильно. Указатель на функцию оотличается от "настоящей" функции тем, что указателей на функции в любой программе конечное число, а функций хотелось бы иметь потенциально неограниченное количество. В Си чтобы это выразить всегда приходится вместе c указателем на функцию тоскать с собой (void * то есть контекст, какие-то данные, параметризующие эту функцию. А в "нормальных" языках код вместе с контекстом объединяются вместе и называются просто функцией.
PS. Правда совершенно не ясно какое отношение имеют к этому ленивые вычисления? Просто язык должен поддерживать данные высшего порядка, он не обязан для этого быть ни ленивым (SML) ни даже функциональным (perl, PHP даже вот тут говорят).
Первый раз слышу, чтобы замыкание называли "функцией", а функцию - "указателем".
я и не говорил, что указатель - это адрес.
насчёт лениовости - тогда должен быть существенно различным синтаксис вызова функции и передачи её как сущности, иначе как неленивый компилятор поймёт, что ему делать. если так - то да, необязательно. просто сегодня читал книжку по Хаскелю - вот возможно поэтому и привёл в пример
А причём замыкание?
код вместе с контекстомили ты другое имел в виду ?
Первый раз слышу, чтобы замыкание называли "функцией"Серьезно? Я знаю много языков, в которых "функцией" называется именно замыкание. Ты нет? По-моему ты это написал просто чтобы все знали что ты знаешь слово "замыкание"
Указатель - это не адрес, это переменнаяпочему это указатель обязан храниться в переменной?
some_t * f;
void g(some_t *);
g(f;
Что, "та штука" которую вернула f и "съела" g - это был не указатель что ли? Указатель это как раз таки адрес. Он может храниться в переменной. А может и не храниться.
По-моему ты это написал просто чтобы все знали что ты знаешь слово "замыкание"Незачот по телепатии. Во-первых, не для этого, во-вторых, не знаю (как выяснилось)
Первый раз просто слышу подобный термин в отношении к программированию - только применительно к анализу знаю
In programming languages, a closure is an abstraction representing a function, plus the lexical environment (see static scoping) in which the function was created.
http://en.wikipedia.org/wiki/Closure_(programming)
Благодарю
В Си чтобы это выразить всегда приходится вместе c указателем на функцию тоскать с собой (void * то есть контекст, какие-то данные, параметризующие эту функцию.Насколько я понял из статьи про замыкания, в Си как раз не существует контекста функций, собственно поэтому и замыкания не существует. Можно только эмулировать контекст при помощи статических переменных.
some_t * f;
функция возвращает указатель на some_t.
Бля. До чего же тупым делает меня бессоница
Можно только эмулировать контекст при помощи статических переменных.Так по той ссылке написано? Ну это уже совсем извращение!.. Посмотрим как это делают профессионалы
extern int pthread_create (pthread_t *__restrict __threadp,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *
void *__restrict __arg) __THROW;
То есть __start_routine + __arg это и есть замыкание.
Или вот пример из "другого мира"
BOOL EnumWindows(
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);
Здесь колбацка lpEnumFunc имеет прототип
BOOL CALLBACK EnumWindowsProc(
HWND hwnd,
LPARAM lParam
);
То есть lpEnumFunc + lParam замыкание в чистом виде.
А qsort, например, в этом смысле "спроектирован" неправильно, не позволяет параметризовать компаратор:
extern void qsort (void *__base, size_t __nmemb, size_t __size,
__compar_fn_t __compar) __nonnull 1, 4;
То есть lpEnumFunc + lParam замыкание в чистом видеНу это-то всё понятно, только это ведь тоже эмуляция. Если я, например, вместо контекста передам NULL, или нагажу в него между вызовами? В контексте, как я понял, смысл именно такой, что никто туда гадить не может, он относится только к замыканию, которому он принадлежит.
Оставить комментарий
erotic
Выдает ошибку - error C2091: function returns function.
Как оформить по другому - не знаю. Можно ли вообще функцией возвращать указатель на другую функцию?
Дело в том, что ошибка выдается независимо от того, что содержится в теле функции - не нравится сам факт, что одна функция возвращает другую.