Что за декларация на С?
От: Alex20001 Россия  
Дата: 09.11.11 07:32
Оценка: :)
Привет всем!
Никто не знает случайно, что за декларация на С:

double(*foo(double(*)(double, double[]), double))(double, ...);


Нужно сказать тип foo.
Re: Что за декларация на С?
От: о_О
Дата: 09.11.11 07:35
Оценка:
указатель на функцию по имеми foo, которая принимает указатель на функцию, которая принимает число и массив; который возвращает указатель на функцию, которая принимает переменное кол-во параметров?
Re: Что за декларация на С?
От: о_О
Дата: 09.11.11 08:05
Оценка: 2 (2)
Здравствуйте, Alex20001, Вы писали:

>Нужно сказать тип foo.

указатель на функцию, который принимает указатель на функцию, которая принемает double, double[]; и double, и возвращает указатель на функцию, которая принимает переменное кол-во double

double f1(double, ...)
{
    return 0.0;
}

double f2(double, double[])
{
    return 1.0;
}

typedef double(*pF1)(double, ...);
typedef double(*pF2)(double, double[]);

pF1 f(pF2, double)
{
    return f1;
}

void wmain()
{
    typedef pF1 (*foo)(pF2, double);

    foo p = f;

    //double(*foo(double(*)(double, double[]), double))(double, ...);
}
Re: Что за декларация на С?
От: rg45 СССР  
Дата: 09.11.11 09:04
Оценка:
Здравствуйте, Alex20001, Вы писали:

A>Привет всем!

A>Никто не знает случайно, что за декларация на С:

A>
A>double(*foo(double(*)(double, double[]), double))(double, ...);
A>


A>Нужно сказать тип foo.


Если хочешь, чтоб коллеги поломали голову (или что там у них), то убирай из декларации идентификатор и проси назвать тип — так труднее — позицию, от которой следует начинать разбор типа еще найти нужно. Для сравнения:
double(*(double(*)(double, double[]), double))(double, ...)
--
Не можешь достичь желаемого — пожелай достигнутого.
Re: Что за декларация на С?
От: sidorov18 США  
Дата: 09.11.11 09:26
Оценка:
Здравствуйте, Alex20001, Вы писали:

A>Привет всем!

A>Никто не знает случайно, что за декларация на С:

A>
A>double(*foo(double(*)(double, double[]), double))(double, ...);
A>


A>Нужно сказать тип foo.


http://habrahabr.ru/blogs/cpp/116255/
Re: Что за декларация на С?
От: Кодт Россия  
Дата: 09.11.11 09:54
Оценка: 2 (1)
Здравствуйте, Alex20001, Вы писали:

A>Никто не знает случайно, что за декларация на С:

Это — декларация из чьей-то контрольной работы

тайпдефы нас спасут
double(*foo(double(*)(double, double[]), double))(double, ...);

typedef double (*F) (double, double*);
double (*foo(F, double) (double, ...);

typedef double (*G) (double, ...);
G foo(F, double);

Итого, foo принимает указатель-на-функцию (F) и число, и возвращает указатель-на-функцию (G).
Перекуём баги на фичи!
Re[2]: Что за декларация на С?
От: SullenMan  
Дата: 09.11.11 09:56
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Здравствуйте, Alex20001, Вы писали:


>>Нужно сказать тип foo.

о_О>указатель на функцию, который принимает указатель на функцию, которая принемает double, double[]; и double, и возвращает указатель на функцию, которая принимает переменное кол-во double

Что-то много раз слово указатель встречается! Не? В объявлении то только 2 указателя. Можете пояснить откуда взялось

"и возвращает указатель на функцию, которая принимает переменное кол-во double"
Re: Что за декларация на С?
От: Roman Odaisky Украина  
Дата: 09.11.11 10:20
Оценка:
Здравствуйте, Alex20001, Вы писали:

A>double(*foo(double(*)(double, double[]), double))(double, ...);


Это код очень неуверенного в себе человека, который хотя и хочет шесть раз удвоить foo (итого получается 64 foo), но повсеместно ставит то сноски*⁾, то ссылки на литературу[1], то многоточия.

*⁾ Причем с совершенно непоследовательным использованием скобок.

[1] http://rsdn.ru/forum/cpp/2694653.1.aspx
Автор: Roman Odaisky
Дата: 16.10.07
До последнего не верил в пирамиду Лебедева.
Re[3]: Что за декларация на С?
От: о_О
Дата: 09.11.11 10:53
Оценка:
Здравствуйте, SullenMan, Вы писали:

SM>Здравствуйте, о_О, Вы писали:


о_О>>Здравствуйте, Alex20001, Вы писали:


>>>Нужно сказать тип foo.

о_О>>указатель на функцию, который принимает указатель на функцию, которая принемает double, double[]; и double, и возвращает указатель на функцию, которая принимает переменное кол-во double

SM>Что-то много раз слово указатель встречается! Не? В объявлении то только 2 указателя. Можете пояснить откуда взялось


SM>"и возвращает указатель на функцию, которая принимает переменное кол-во double"


не. функция может принимать тип функции и указатель на функцию в качестве параметра. если аргумент является типом функции:
typedef int tratata(int*);

int pumpurum(tratata t)
{
  return t(); //ok
}

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

в данном случае функция явно возвращает указатель на функцию, что видно из примера
Re[2]: Что за декларация на С?
От: о_О
Дата: 09.11.11 10:55
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Alex20001, Вы писали:


A>>Никто не знает случайно, что за декларация на С:

К>Это — декларация из чьей-то контрольной работы

К>тайпдефы нас спасут

К>
К>double(*foo(double(*)(double, double[]), double))(double, ...);

К>typedef double (*F) (double, double*);
К>double (*foo(F, double) (double, ...);

К>typedef double (*G) (double, ...);
К>G foo(F, double);
К>

К>Итого, foo принимает указатель-на-функцию (F) и число, и возвращает указатель-на-функцию (G).

и следующим вопросом почему вместо double[] стало double*
Re[4]: Что за декларация на С?
От: о_О
Дата: 09.11.11 11:01
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>не. функция может принимать тип функции и указатель на функцию в качестве параметра.


параметром функции может быть как указатель на функцию, так и тип функции. так лучше
Re[2]: Что за декларация на С?
От: Lorenzo_LAMAS  
Дата: 09.11.11 12:33
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>указатель на функцию по имеми foo,


это объявление функции foo, а не указателя на функцию.
Of course, the code must be complete enough to compile and link.
Re[3]: Что за декларация на С?
От: о_О
Дата: 09.11.11 13:23
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Здравствуйте, о_О, Вы писали:


о_О>>указатель на функцию по имеми foo,


L_L>это объявление функции foo, а не указателя на функцию.


ммм... да. *посыпал голову*
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.