Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите понять выражение 
:(
    Опции темы
tommy_kid
Дата 14.12.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 14.12.2006

Репутация: нет
Всего: нет



приветствую!

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

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


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

спасибо
PM MAIL   Вверх
jnb
Дата 14.12.2006, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.10.2006

Репутация: нет
Всего: 1



читай указатели на функции в литературе и все станет понятно.

PM MAIL   Вверх
Damarus
Дата 14.12.2006, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 671
Регистрация: 6.5.2006

Репутация: 1
Всего: 29



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

Указатель на функцию.
PM MAIL ICQ Jabber   Вверх
BreakPointMAN
Дата 14.12.2006, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Код

РАЗБОР СЛОЖНЫХ КОНСТРУКЦИЙ ПРОГРАММ НА 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)



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Anikmar
Дата 15.12.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



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

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


PM MAIL ICQ   Вверх
Yra
Дата 15.12.2006, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 12.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



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

я тоже.


BreakPointMAN, ещё бы примерчик по использованию "ЭТОГО"  smile 
PM MAIL   Вверх
BreakPointMAN
Дата 16.12.2006, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Пожалуйста...  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.





Это сообщение отредактировал(а) BreakPointMAN - 16.12.2006, 15:39


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Yra
Дата 16.12.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 12.9.2006
Где: Украина, Киев

Репутация: нет
Всего: нет



BreakPointMAN, спасибо!!!  smile 
PM MAIL   Вверх
BreakPointMAN
Дата 18.12.2006, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Ну, и еще, напоследок, парочка примеров...  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



--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Anikmar
Дата 18.12.2006, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



BreakPointMAN вошел во вкус  smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0852 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.