Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Обсуждение статей
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.10.2009, 20:47   #1
Retainer
Новичок
Джуниор
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию Правила пространства имён Delphi

Уважаемые продвинутые и начинающие Дельфисты!

Прошу Вас помочь с подсказкой, где можно посмотреть материал с подробными примерами объявлений/определений/вызовов процедур и функций НЕ в плане ООП ( с ним как раз нет проблем, почти всё понятно), А В ПЛАНЕ применения перекрестных вызовов функций из смежных модулей, вложенных функций и применения директивы FORWARD. Использую Дельфи 7. Причём хотелось бы посмотреть примеры комбинаций этих действий- или узнать, какие комбинации ошибочны (например, вложенное объявление с директивой forward возможно?, или несколько объявлений forward подряд?). Про директиву forward вообще хотелось бы просто понять - она существует только для разрешения косвенной рекурсии функций, то есть узкоспециализирована, или есть другие варианты её применения- если есть, то какие, где их посмотреть? Искал ответы у Архангельского, Флёнова, Марко Кенту, других уважаемых авторов, в русскоязычном и англоязычном хэлпе (в нём, кстати, очень мало полезных примеров кода). Имею опыт работы с Си/Ассемблером, с Дельфи 7 знаком менее года. Предпочитаю не приводить листинг для поиска ошибок, а найти источник с примерами и всё выяснить.
Retainer вне форума Ответить с цитированием
Старый 07.10.2009, 09:26   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Про директиву forward вообще хотелось бы просто понять - она существует только для разрешения косвенной рекурсии функций, то есть узкоспециализирована, или есть другие варианты её применения- если есть, то какие, где их посмотреть?
Про эту директиву я знаю две вещи:

1. Это отживающий себе аттавизм, и используется редко.
2. Смысл ее в том чтобы дать возможность (насколько я помню) описывать параметры функции только в обьявлении, а в реализации писать только имя функи.

Вот пример:
Код:

function Calculate(X, Y: Integer): Real; forward;
........

function Calculate;

 ...   { declarations }
begin
 ...   { statement block }
end;
Вместо:
Код:

function Calculate(X, Y: Integer): Real; 
...
function Calculate(X, Y: Integer): Real;

 ...   { declarations }
begin
 ...   { statement block }
end;
Без forward в старых паскалях приходилось писать параметры и в обьявлении и в реализации.

Сейчас такая проблема решена - forward обьявлния по умолчанию стоят.

Это насколько я помню...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 12:56   #3
Retainer
Новичок
Джуниор
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию Для Stilet'а

[QUOTE=Stilet;358570]Про эту директиву я знаю две вещи:

1. Это отживающий себе аттавизм, и используется редко.
2. Смысл ее в том чтобы дать возможность (насколько я помню) описывать параметры функции только в обьявлении, а в реализации писать только имя функи.
................................... .............................
Без forward в старых паскалях приходилось писать параметры и в обьявлении и в реализации.
Сейчас такая проблема решена - forward обьявлния по умолчанию стоят.
................................... .............................
Спасибо за реплику, Виталий. Видимо, под "сейчас" Вы имеете в виду более поздние версии Дельфи (там, 2005, 2007 и т.д.)? К сожалению, они для меня сейчас недоступны, работаю с Дельфи 7. Читал, что начиная, кажется, с 2005-й версии в Редакторе Кода Дельфи появилась опция "скрытия блоков", с помощью "+"/"-" знаков, как в Проводнике, которая позволяет разместить все реализации процедур прямо в месте их объявления и затем скрыть эти блоки в листинге и перейти к собственно телу главной процедуры модуля, откуда все скрытые блоки и вызываются. При таком сервисе forward действительно "отмирает" как GOTO, но в 7-й версии такой опции нет, а так хочется сначала выкатить список объявлений с директивами forward, затем записать тело вызывающей процедуры, а затем уже прописать все блоки для вызываемых процедур.... Скажете "блажь", но я так не считаю, поскольку привык именно таким образом оформлять все свои листинги, даже если никто больше их не увидит - такой стиль очень эргономичен и экономит массу времени при внесении изменений и при повторном использовании ранее сделанных наработок, когда при прокрутке сразу видишь основной алгоритм, а затем в случае необходимости докручиваешь экран до нужной процедуры..... Меня также интересует, можно ли использовать FORWARD ДЛЯ ВЛОЖЕННЫХ процедур, поскольку это также очень упростило бы мою работу (отдельно могу объяснить, почему...). Надеюсь, кто-нибудь уже сталкивался с подобными вопросами, и подскажет путь решения.....
Retainer вне форума Ответить с цитированием
Старый 07.10.2009, 13:16   #4
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

С директивой forward в Дельфи чисто практически дело обстоит следующим образом.Если Вы создаете свои методы и они используются следующим образом:
Процедура1;
Процедура2; (содержит вызов Процедуры1)
Процедура3; (содержит вызов Процедуры2)
Процедура4; (содержит вызовы Процедуры1 и Процедуры3)
В зтом случае не обязательно предварительно объявлять эти процедуры, а достаточно только описать их в такой же последовательности в коде программы (1,2,3,4).
Но встречаются случаи использования методов в следующем виде:
Процедура1; (содержит вызов Процедуры3)
Процедура2; (вызов Процедуры1)
Процедура3; (вызов Процедуры2)
В таком случае следует предварительно объявить Процедуру3 (с ее параметрами,если они есть) и директивой forward.Объявляется после глобальных var до implementation. А уже само описание процедур пишете в коде в нужном месте в той же последовательности (1,2,3).
Это же правило соблюдается и не только для рекурсивного вызова методов, а и для случаев с переменными и др. объектами.Например - в Процедуре1 используется переменная-объект типа TBitMap , а создается она (Create) в Процедуре3.
Тогда аналогично следует предварительно дать объявление Процедуре3 с директивой forward.
Цитата:
Сейчас такая проблема решена - forward обьявлния по умолчанию стоят.
В Дельфи 7 еще надо использовать forward.
И не сомневайся даже ... отдых - кайф, работа - лажа!

Последний раз редактировалось DeKot; 07.10.2009 в 13:19.
DeKot вне форума Ответить с цитированием
Старый 07.10.2009, 13:21   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
под "сейчас" Вы имеете в виду более поздние версии Дельфи
"сейчас" для этой директивы началось с седьмого турбо паскаля, а уж про делфи молчу вообще.
Цитата:
а так хочется сначала выкатить список объявлений с директивами forward,
А что мешает пообьявлять все это в разделе interface, а уж в implementation описать тела?
Так ты отделишь масло от хлеба.
Цитата:
В Дельфи 7 еще надо использовать forward.
Чет я не замечал ее в своих прогах, и все у меня по полочкам всегда было разложено.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 14:39   #6
Retainer
Новичок
Джуниор
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию

Спасибо Stilet и DeKot за реплики по моему вопросу. Всё же, Stilet, я интересовался возможностью использовать FORWARD для ВЛОЖЕННЫХ процедур, а вложенные процедуры, как известно, в INTERFACE секции не объявляются - на то они и вложенные. У вложенных процедур есть одно преимущество - они обитают в пространстве имён вызывающей процедуры, и, соответственно, могут иметь доступ ко всем созданным в ней структурам, объектам и переменным без явной передачи через формальные параметры, и я нахожу это для себя весьма удобным (таков контекст проекта...), даже несмотря на снижение читабельности кода, зато не надо в две строки перечислять фактические параметры - это улучшает восприятие....Я прошу подсказать мне именно Источник, где можно было бы (желательно по-русски) прочитать инфу по этим вопросам, желательно с примерами реализации - примеры даже важнее, как говориться, один раз увидеть....
Retainer вне форума Ответить с цитированием
Старый 07.10.2009, 15:15   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Retainer
Ну на сколько я знаю, особых каких то придирок к этой директиве нет
http://www.citforum.ru/programming/bp70_lr/lr9.shtml
Здесь в общем, примерно так и поступай.
Ничего страшного что вложенные
Вот от меня пример:
Код:
procedure qq;
 {Описываем процедуры}
 procedure bb(var s:string); forward;
 procedure ee(var s:string); forward;

 {Пишем их тела}
   procedure ee; begin bb(s); s:=s+'haha';end;
   procedure bb; begin s:=s+'qq';end;

 var w:string;
begin
 ee(w);
 writeln(w);
 readln;
end;

begin
 qq;
end.
Кстати для отличия скажу что если убрать forward-описание в данном случае процедура ee не скомпилируется потому как она вызывает еще не описаную процедуру bb, которой нет выше нее. Она есть но ниже, и forward говорит компилятору о том что все в порядке, мол есть такое, только ты погодь немного, спустишся ниже найдешь ее и прикомпилишь - это главный плюс такой директивы.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.10.2009, 16:22   #8
Retainer
Новичок
Джуниор
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию

Хорошо, Stilet, я ппросмотрю указанный тобой форум.
Retainer вне форума Ответить с цитированием
Старый 07.10.2009, 17:36   #9
Retainer
Новичок
Джуниор
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию

Для Stilet'а :

Благодарю за подсказку, просмотрел указанный форум, похоже, это именно то, что я искал - подробные очень формализованные описания операторов и директив, много примеров. Всё описание Паскаля скачаю себе. Ещё раз благодарю. Тему за сим прошу считать закрытой - это уже МОДЕРАТОРАМ.
Retainer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание имён файлов dobrohleb Microsoft Office Excel 21 06.09.2012 11:35
Правила написания кода на Delphi Virtson Общие вопросы Delphi 17 06.08.2010 08:59
Правила разделов/главные правила Alex Cones О форуме и сайтах клуба 1 30.09.2009 17:49
Правила написания формул в Delphi yurik44 Общие вопросы Delphi 1 13.06.2007 15:57