LINUX.ORG.RU

походу кто-то прикалывается...

anonymous
()

Особенно если учесть, что данная конструкция сама по себе указатель на функцию

anonymous
()

Этта, типа, вопрос на экзамене в провинциальном ПТУ?
Ок, я банку с пивом открыл - можно поприкалываться.

> Особенно если учесть, что данная конструкция сама по себе указатель на
> функцию

Ответ неверный.

tkf есть функция, принимающая аргументы int l1,int (*ptr)(int)
и возвращающая указатель на функцию, принимающую int и возвращающую
int.

Стандартный прием работы с указателями на такие навороты состоит в использовании
typedef'ов.

Рабочий пример:

#include <stdlib.h>
#include <stdio.h>

int ququ(int i)
{
printf("Hello %d \n",i);
return 10;
}/*ququ*/

int (*tkf(int l1,int (*ptr)(int)) ) (int)
{
return &ququ;
}/*tkf*/

typedef int (*TKF(int l1,int (*ptr)(int)) ) (int);

int main(void)
{
TKF *tkfptr=&tkf;
int i;
i=tkfptr(i,NULL)(5);
printf("returned: %d \n",i);
return 0;
}/*main*/
Результат работы программы:

Hello 5
returned: 10

Die-Hard ★★★★★
()

я тут не совсем правильно задал вопрос.

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

type * имя_указателя.

по определению указатель на ф-ю принимающую type2 и возвращающую type1 - type1 (*имя указателя) (type2) вот как его определить в этом контексте ведь получается , что возвращаемое значение type1 - int (*)(int), а принимаемое type2 - (int,int (*ptr)(int)) , как это корректно записать ?

Я конечно понимаю ,что это вопросы на уровне сельской школы , но я новичок в C/C++ и если Die-Hard-у не сложно может он объяснит мне этот вопросик.

из книг под рукой у меня только книга Подбельского "Язык C++" P.S спасибо за ответ !

anonymous
()

А зачем новичкам в C/C++ такие вещи? Для того, чтобы их программы читать потом нельзя было?

Мой вариант ответа на вопрос:
int (* (*mypointer) (int l1, int (*ptr)(int))) (int) = &tkf;

justme
()
Ответ на: комментарий от anonymous


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

Далее, не понятен вопрос. Вернее, не понятно, что не понятно.
Язык C совершенно однозначен в данном вопросе, правило "изнутри
наружу". То же самое, но без typedef'а, привел
justme (*) (2001-11-27 12:52:52.0)
Если мсье извращенец:), или специально пишет нечитабельные программы, то можно
делать и так.

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

Если же вопрос был задан в целях самообразования, то
justme (*) (2001-11-27 12:52:52.0)
на него ответил, как я понимаю.

Die-Hard ★★★★★
()

а вот про это правило "изнутри наружу" можно поподробнее ? или где прочесть правила вывода для компилятора при разборе таких конструкций ?

мсье не извращенец ;-) преподователя по С/С++ у мсье вообще никогда не было ;-) так что вопрос в целях самообразования.

и вообще какую хорошую книгу можно взять по C/C++ чтобы там ВСЕ было ?

а то у меня есть ISO стандарты на C/C++ я их разбираю , но что-то процесс медленновато идет :-( может есть книги потоньше и охватывающие такие же вопросы ?

anonymous
()
Ответ на: комментарий от anonymous

Вопрос:
>и вообще какую хорошую книгу можно взять по C/C++ чтобы там ВСЕ было ? 
Ответ:
>а то у меня есть ISO стандарты на C/C++ я их разбираю ,
Немого подумав, мсье поймет, что это ЕДИНСТВЕННОЕ чтиво, где есть ВСЕ.

Кстати, не поделишься стандартами как-нибудь? А то бесплатно on-line
я нашел только драфты. 

Из книг я бы посоветовал Кернигана и Риччи (про С, немного 
устарел синтаксис, но зато понятно написано)

а про С++, к моему удивлению, оказалась действительно почти идеально 
написанная книжка, но очень толстая и на буржуинском языке:
http://www.icce.rug.nl/documents/cplusplus/

Аналогичным Кернигану-Риччи стандартом для С++ считается книжка
Страуструпа, она доступна на русском, но мне она не нравится.
IMHO мозги у Страуструпа набекрень.

> а вот про это правило "изнутри наружу" можно поподробнее ? 
Первая попавшаяся online книга
(http://www.citforum.ru/programming/c/h12.shtml#1211):

Для интерпретации сложных описаний предлагается простое правило,
которое звучит как "изнутри наружу", и состоит из четырех шагов.

 1. Начать с идентификатора и посмотреть вправо, есть ли квадратные
или круглые скобки.

 2. Если они есть, то проинтерпретировать эту часть описателя и затем
посмотреть налево в поиске звездочки.

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

 4. Интерпретировать спецификатор типа.

 Примеры:
           int    * ( * comp [10]) ();

            6     5   3   1    2    4


 В данном примере объявляется переменная comp (1), как массив из
десяти (2) указателей (3) на функции (4), возвращающие указатели (5)
на целые значения (6).


           char  * ( * ( * var ) () ) [10];

             7   6   4   2  1     3     5


 Переменная var (1) объявлена как указатель (2) на функцию (3)
возвращающую указатель (4) на массив (5) из 10 элементов, которые
являются указателями (6) на значения типа char.

Die-Hard ★★★★★
()

большое спасибо за инфу буду заниматься самообразованием дальше. из стандартов у меня есть:

ISO/IEC 14882 C++ first edition 1998-09-01 ISO/IEC 9899/1999 C

вроде бы это не драфты.

лежат они на ftp://ftp.iks-jena.de/pub/mitarb/lutz/standards/iso/

anonymous
()

Thanks за стандарты. Давно искал.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.