[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 (нестрогих функциональных, например). в остальных функция вычисляется сразу, как только встречается, поэтому вернуть её никак не получится.
Гы, это-то понятно, но как заковыристо ты выразился =)
а в чем разница ?

в чём разница между функционалом и оператором над некоторым пространством?

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

нет, функция - это отображение из одного множества в другое.
ты не прав имхо. Указатель - это не адрес, это переменная, хранящая адрес. Функция - условно говоря, это просто адрес. Именно поэтому у указателя адрес взять можно, а у функции нет.
В каком смысле у функции нельзя взять адрес?
у указателя можно узнать адрес. у функции - нет.Указатель - это и есть адрес. Адрес функции.
В PHP, к примеру, ты можешь создать динамическую функцию string create_function (string args, string code). Эта функция вернет тебе имя для твоей новой функции, по которому и можешь ее вызвать.
можно вернуть указатель на уже существующую функциюНу вобщем все правильно. Указатель на функцию оотличается от "настоящей" функции тем, что указателей на функции в любой программе конечное число, а функций хотелось бы иметь потенциально неограниченное количество. В Си чтобы это выразить всегда приходится вместе c указателем на функцию тоскать с собой (void * то есть контекст, какие-то данные, параметризующие эту функцию. А в "нормальных" языках код вместе с контекстом объединяются вместе и называются просто функцией.
PS. Правда совершенно не ясно какое отношение имеют к этому ленивые вычисления?

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

А причём замыкание?
код вместе с контекстомили ты другое имел в виду ?
Первый раз слышу, чтобы замыкание называли "функцией"Серьезно? Я знаю много языков, в которых "функцией" называется именно замыкание. Ты нет? По-моему ты это написал просто чтобы все знали что ты знаешь слово "замыкание"

Указатель - это не адрес, это переменнаяпочему это указатель обязан храниться в переменной?
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.
Как оформить по другому - не знаю. Можно ли вообще функцией возвращать указатель на другую функцию?
Дело в том, что ошибка выдается независимо от того, что содержится в теле функции - не нравится сам факт, что одна функция возвращает другую.