Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Вниз

Возврат из процедуры (функции)   Найти похожие ветки 

 
МитяЙ2   (2003-01-14 22:00) [0]

Доброго времени суток МАСТЕРА!


Помогите, если это в Ваших силах.

Проблема в следующем:

Есть обработчик события OnClickButton
в нем есть, вызов только ОДНОЙ процедуры X.

В этой процедуре X есть вызов процедуры X1,
в ней - вызов X2 и т.д. Причем каждая из
Xi-х может вызывать ЛЮБУЮ Xi!

Проблема:

Во многих местах процедур Xi есть
необходимость прекращения выполнения
самой Xi и передачи управления в OnClickButton

или в данном случае просто прекращение выполнения
всех вложенных процедур (в том числе X) и
"переход в режим ожидания" реакции от пользователя.


Подскажите как это сделать!


P.S. Пример неподходящего варианта:
Естественно при вызове функции exit в Xi-ой процедуре
происходит возврат на верхний уровень, т.е. на следующий
оператор в Xk-ой процедур, откуда вызвалась Xi-ая
процедура. А проблема в переходе сразу в X или
на уровень OnClickButton.



(пишу курсовичек по нисходящему анализатору для
написания копилятора)



Буду ООЧЧЕЕННЬЬ благодарен за помощь.
Митяй


 
Митяй2   (2003-01-14 22:39) [1]

Вопрос-то в общем простой.

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

Т.е. оставить её (программу) в режиме ожидания реакции от юзера.

Вот так...

А нужно,......................., очень нужно!


 
Набережных С.   (2003-01-14 23:05) [2]

function X2: boolean;

function X1: boolean;
begin
...
Result:=X2;
if not Result then Exit;
...
end;

procedure X;
begin
...
if not X1 then Exit;
...
end;

procedure ...OnClick;
begin
x;
end;


 
Набережных С.   (2003-01-14 23:06) [3]

Или просто Abort


 
Юрий Зотов   (2003-01-14 23:27) [4]

Можно и иначе:

procedure ...OnClick;
begin
try
x
except
... // Здесь можно проанализировать, откуда вывалились
end;
end;

После этого достаточно в любой последующий процедуре возбудить любое исключение.


 
A2   (2003-01-14 23:27) [5]

В OnClick поставь блок "try ... except", а во всех остальных процедурах, если нужно прекратить выполнение, вызывай raise.


 
OlDemon   (2003-01-15 06:32) [6]

Я бы глобальный флажочек сделал. И по нему бы вываливался из всех функций.


 
Digitman   (2003-01-15 08:45) [7]


> пишу курсовичек по нисходящему анализатору для
> написания копилятора


К чему изобретать велосипед ? Возьми за основу готовый парсер YACC for Pascal. На вход ему подаешь скрипт-описание своего языка, на выходе получаешь текст Паскаль-модуля, осуществляющего парсинг и лексический анализ текста на твоем языке, который должен быть скомпилирован/интерпретирован.

Посмотри на filesearch.com или на Torry файл tp_lex_and_yacc.zip.
Там есть все, включая исходники YACC и примеры его использования


 
A2   (2003-01-15 09:06) [8]

OlDemon>
> Я бы глобальный флажочек сделал. И по нему бы вываливался
> из всех функций.

Можно поинтересоваться, как это будет выглядеть на стеке вызовов функций?



 
neXt   (2003-01-15 09:16) [9]

> A2 (15.01.03 09:06)
Я подозреваю, OlDemon имеет в виду, что в каждой из Xi - функций после выхода из вложенных функций стоит проверка некого глобального флага, который любая из вызываемых функций может выставить в значение ВСЕ_НА_ВЫХОД. При наличие такого значения в флаге, любая из Xi - функций завершает работу, и управление возвращается по стеку в обратном порядке в OnClickButton.

:) Это очень дзенское решение! Примерно такое же, как проверка возвращаемого значения каждой Xi-функции. Истинные индейцы, могут попробовать... Но я бы рекомендовал бы, всё-таки использовать исключения.



 
Набережных С.   (2003-01-15 17:22) [10]

>neXt © (15.01.03 09:16)

Генерация и обработка исключения приводит к раскрутке стека и выливается в выполнение от 700-800 машинных инструкций. Анализ возвращаемого результата не стоит почти ничего, но кому это интересно "в наш век, когда космические корабли бороздят просторы вселенной"? ИМХО, защитные фреймы - мощный, но дорогой инструмент, пользоваться которым следует обдуманно и по назначению.
Вероятно, WinAPI писали сплошь "дзенские" программисты. Бедные, живут и не знают об этом...


 
A2   (2003-01-15 20:08) [11]


> neXt
> Генерация и обработка исключения приводит к раскрутке стека
> и выливается в выполнение от 700-800 машинных инструкций.
> Анализ возвращаемого результата не стоит почти ничего

Дело не в количестве команд (700 800 действительно почти нничего не стоят), а в подходе к решению задачи, позволяющем избежать ошибок кодирования (при Exception) или почти наверняка посадить их штук этак несколько (при ЯВНОЙ проверке результата).


 
Набережных С.   (2003-01-15 20:14) [12]

>A2

Речь шла не о защите, а о способе принятия решения по результату работы функции

>700 800 действительно почти нничего не стоят)

Ну-ну


 
Юрий Зотов   (2003-01-15 20:17) [13]

Безусловно, решение через try-except НАМНОГО более ресурсоемко. Преимущество его, пожалуй, лишь в том, что оно позволяет без усложнения кода проанализировать результат цепочки вызовов и получить точку, в которой она была прервана (достаточно лишь возбуждать разные исключения, а в except расщепить их). Простой Exit этого не дает - придется вводить какие-то дополнительные переменные и усложнять код.

Если же анализ не требуется, то, конечно, Exit будет лучше.


 
A2   (2003-01-15 20:35) [14]


> Если же анализ не требуется, то, конечно, Exit будет лучше.


Точнее, цепочка Exit"ов и проверок :-(


 
A2   (2003-01-15 20:54) [15]

Кстати, мы совсем забыли, что вопрос касался нисходящего анализатора для компилятора. А в этот случае говорить о ресурсоемкости try-except не стоит: разница в скорости обработки исходного текста будет мизерная. В тоже время, исключения могут быть легко включены в логику грамматического разбора. Если в качестве типа результата взять не Boolean, а,например Integer, то в хорошо спроектированной программе оба эти варианта будут примерно равноценны.


 
neXt   (2003-01-16 10:37) [16]


> Набережных С. (15.01.03 17:22)

Так, интересно, а какое же "назначение" try-except как не экстренный выход по стеку вызовов к месту обработки исключительной ситуации? Вы в серьёз пологаете, что оптимизировать синтаксический анализатор нужно начинать с замены try-except на проверку ретвалов?
Тогда уж стоит отказаться от классов - всякой там vcl и Object Pascal, заодно. И вообще писать всё на C, а лучше на асме. Никаких тебе накладных расходов!
Принемать решение об отказе от какого-либо "удобства" программирования нужно только при двух условиях:
1. в голове тревожно бьётся мысль: "о, чёрт, где бы мне наиграть этих драгоценных 700-800 машинных инструкций!?"
2. Вы твёрдо знаете что отказ от "удобства" принесёт нужные плоды и не станит новым источником ошибок.


> Если в качестве типа результата взять не Boolean, а,например
> Integer, то в хорошо спроектированной программе оба эти
> варианта будут примерно равноценны.

Использовать bool, в качестве ретвала можно только если "исключения" не нужно дифференцировать между собой - это довольно сущесвенное ограничение..


 
Набережных С.   (2003-01-16 15:53) [17]

Я всерьез полагаю, что защитные фреймы нужно использовать в первую очередь для обработки нештатных ситуаций. При нормальном выполнении программы расходы на них мизерны и резко возрастают при обработке исключений. Но так как при грамотном проектировании вероятность исключения очень мала, то они и не влияют ни на что. По-моему, это очевидно. А 700-800 - примерная стартовая цифра, которая зависит от глубины стека и вложенности фреймов. Логический тип я привел только для демонстрации принципа и потому, что в вопросе речь не шла о детальном анализе. Заменим его на целый и получим любую необходимую функциональность, и это тоже мне казалось совершенно очевидным для любого программиста с опытом хотя-бы пол-года. Кроме того, я не говорил что вариант с try-except совершенно непригоден, у него, как и у других, есть свои достоинства и недостатки, которые нужно четко себе представлять. Впрочем, Вы, разумеется, можете оставаться при своем мнении, а я останусь при своем - с Вашего разрешения или без оного.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.011 c
14-87031
Darkman
2003-01-10 21:32
2003.01.27
Установка компонентов


4-87192
Ditron
2002-12-09 18:52
2003.01.27
Доступ к папкам


8-86966
Asderg
2002-10-08 08:25
2003.01.27
как сделать из double вычислений вычисления с фикс точкой.


1-86795
denis24
2003-01-18 14:54
2003.01.27
модульность в делфи


1-86936
anod
2003-01-16 21:42
2003.01.27
Как мне реализовать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский