Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Помогите понять выражение


Автор: tommy_kid 14.12.2006, 18:45
приветствую!

разбираюсь с исходниками, написанными в Borland C++ 3.1, встретилась строчка, смысла которой никак не могу понять.
вот она:
Код

int (* emuf)(int n, float _FAR *in, float _FAR *out);


если можно, поподробнее прокомментируйте плз

спасибо

Автор: jnb 14.12.2006, 19:00
читай указатели на функции в литературе и все станет понятно.

Автор: Damarus 14.12.2006, 19:23
Цитата(tommy_kid @  14.12.2006,  18:45 Найти цитируемый пост)
разбираюсь с исходниками, написанными в Borland C++ 3.1, встретилась строчка, смысла которой никак не могу понять.вот она:

Указатель на функцию.

Автор: BreakPointMAN 14.12.2006, 21:08
Код

РАЗБОР СЛОЖНЫХ КОНСТРУКЦИЙ ПРОГРАММ НА C++
==========================================


Правило "право-лево" (разбор сложных конструкций программ на C++)
А как вообще фоpмулиpуется основной пpинцип pазбоpа сложных
синтаксических констpукций языка, навpоде 'указатель на функцию,
возвpащающую указатель на массив из тpёх указателей на функции,
возвpащающие значение int'? 

Давно и чётко формализовано в виде правила 'право-лево'. Всё предельно
просто. Имеем: 

() - функция, возвращающая... 
[] - массив из... 
* - указатель на... 

Процесс разбора итеративный: 

Первым делом находим имя, от которого и будем плясать. Пляски начинаются
со слов 'Имя есть...' 
Следующий шаг - шаг вправо. Что там у нас справа? Если (), то говорим,
что 'Имя есть функция, возвращающая...'. (если промеж скобок что-то
есть, то 'Имя есть функция, принимающая то, что между скобок, и
возвращающая...') Если там [], то 'Имя есть массив из...' И таким вот
образом мы идём вправо до тех пор, пока не дойдём до конца объявления
или правой ) скобки. Тут тормозим... 
...и начинаем танцевать влево. Что у нас слева? Если это что-то не из
приведённой выше таблицы (то есть не (), [], *), то просто добавляем к
уже имеющейся расшифровке. Если же там что-то из этих трёх символов, то
добавляем то, что написано в таблице. И так танцуем до тех пор, пока не
дотанцуем до конца (точнее - начала объявления) или левой ( скобки. Если
дошли до начала, то всё готово. А если дошли до (, то по уже означенной
итеративности переходим к шагу 2 - пляски вправо продолжаем. 

Пример: 

        int (*(*(*fptr)())[3])();
                  ^^^^
    
Hаходим имя и записываем 'fptr есть...' 
Шаг вправо, но там ), потому идём влево 
        int (*(*(*fptr)())[3])();
                 ^
  
и получаем 'fptr есть указатель на...' 
Продолжаем ехать влево, но тут (. Идём вправо 
        int (*(*(*fptr)())[3])();
                       ^^
  
получаем 'fptr есть указатель на функцию, возвращающую...' Снова ),
опять влево. 
Получаем 
        int (*(*(*fptr)())[3])();
               ^
  
'fptr есть указатель на функцию, возвращающую указатель на...' Слева
опять (, идём вправо. 
Получаем 
        int (*(*(*fptr)())[3])();
                          ^^^
  
'fptr есть указатель на функцию, возвращающую указатель на массив из
трёх...' И снова справа ), отправляемся влево 
Получаем 
        int (*(*(*fptr)())[3])();
             ^
  
'fptr есть указатель на функцию, возвращающую указатель на массив из
трёх указателей на...' Снова разворот вправо по причине ( 
Получаем 
        int (*(*(*fptr)())[3])();
                              ^^
  
'fptr есть указатель на функцию, возвращающую указатель на массив из
трёх указателей на функции, возвращающие...' Тут конец описания, поехали
влево и получили окончательную расшифровку этой каракули 
        int (*(*(*fptr)())[3])();
        ^^^
  
'fptr есть указатель на функцию, возвращающую указатель на массив из
трёх указателей на функции, возвращающие int' 
Именно то, чего ты и хотел. Просто? 


06.01.2003
(c)Наумочник Александр (2:5020/59)

Автор: Anikmar 15.12.2006, 15:36
BreakPointMAN,  Снимаю шляпу - с огромным удовольствием прочитал пост!

У меня всегда были с этим проблемы - чтобы нормально делать объявления я делал последовательность typedef  smile  - по-другому не получается и все тут!


Автор: Yra 15.12.2006, 20:06
Цитата(Anikmar @  15.12.2006,  15:36 Найти цитируемый пост)
BreakPointMAN,  Снимаю шляпу - с огромным удовольствием прочитал пост!

я тоже.


BreakPointMAN, ещё бы примерчик по использованию "ЭТОГО"  smile 

Автор: BreakPointMAN 16.12.2006, 15:21
Пожалуйста...  smile 

Цитата

double (*(*(*fptr)(void*))[10])(int );
             ^^^^
fptr - это...



double (*(*(*fptr)(void*))[10])(int );
            ^
...указатель на...



double (*(*(*fptr)(void*))[10])(int );
                  ^^^^^^^
...функцию, принимающую void* ...


 
double (*(*(*fptr)(void*))[10])(int );
          ^
...и возвращающую указатель на...



double (*(*(*fptr)(void*))[10])(int );
                          ^^^^
...массив из 10...



double (*(*(*fptr)(void*))[10])(int );
        ^  
...указателей на...



double (*(*(*fptr)(void*))[10])(int );
                               ^^^^^^
...функцию, принимающую int...



double (*(*(*fptr)(void*))[10])(int );
^^^^^^
...и возвращающую double.




Или, на примере из первого поста...

Цитата

int (* emuf)(int n, float _FAR *in, float _FAR *out);
       ^^^^
emuf - это...



int (* emuf)(int n, float _FAR *in, float _FAR *out);
     ^
...указатель на...



int (* emuf)(int n, float _FAR *in, float _FAR *out);
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...функцию, принимающую в качестве параметров int n, float _FAR *in, float _FAR *out...



int (* emuf)(int n, float _FAR *in, float _FAR *out);
^^^
...и возвращающую int.




Автор: Yra 16.12.2006, 17:53
BreakPointMAN, спасибо!!!  smile 

Автор: BreakPointMAN 18.12.2006, 13:40
Ну, и еще, напоследок, парочка примеров...  smile 

Цитата
int &(*arr[5])(void *, int &)
       ^^^
arr - это...



int &(*arr[5])(void *, int &)
          ^^^
...массив из 5...



int &(*arr[5])(void *, int &)
      ^
...указателей на...



int &(*arr[5])(void *, int &)
              ^^^^^^^^^^^^^^^
...функцию, принимающую void* и int&...



int &(*arr[5])(void *, int &)
^^^^^
...и возвращающую int&


Цитата
int *(*(**&r)[10])[5]
           ^
r - это...



int *(*(**&r)[10])[5]
          ^
...ссылка на...



int *(*(**&r)[10])[5]
         ^
...указатель на...



int *(*(**&r)[10])[5]
        ^
...указатель на...



int *(*(**&r)[10])[5]
             ^^^^
...массив из 10...



int *(*(**&r)[10])[5]
      ^
...указателей на...



int *(*(**&r)[10])[5]
                  ^^^
...массив из 5...



int *(*(**&r)[10])[5]
^^^^^
...указателей на int

Автор: Anikmar 18.12.2006, 14:33
BreakPointMAN вошел во вкус  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)