Помощь - Поиск - Пользователи - Календарь
Полная версия: Переход из процедуры в главную прогу
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
>hamka<
Можно из процедуры прыгнуть на метку, кот. в главной программе. Или ее надо описывать в параметрах передаваемой процедуры. А если нельзя, то нет ли каких нибудь приемчиков, чтобы перейти на метку не процедурную?
volvo
Цитата(>hamka< @ 25.02.05 18:57)
Можно из процедуры прыгнуть на метку, кот. в главной программе. Или ее надо описывать в параметрах передаваемой процедуры. А если нельзя, то нет ли каких нибудь приемчиков, чтобы перейти на метку не процедурную?


А Вы в курсе, что использование меток в паскале ВООБЩЕ не приветствуется? Да и по определению этого сделать нельзя ... Опишите проблему, возможно ее удастся решить другими методами...
>hamka<
Цитата(volvo @ 25.02.05 19:59)
А Вы в курсе, что использование меток в паскале ВООБЩЕ не приветствуется?

а почему ? =((
Altair
А потому что это противоречит принципам структурного программирования.
Есть желание поспорить? идите к Вирту, Дейкстре и прочим "динозаврам" программирования!
>hamka<
Цитата(Oleg_Z @ 25.02.05 20:04)
А потому что это противоречит принципам структурного программирования.

а как же асм ;)
а чем заменять метки? Неужели флажками?
Altair
А АСМ - эт оязык НИЗКОГО УРОВНЯ!
и методы программирвоания на языках ВЫСОКОГО уровня к нему не относятся!
Altair
p.s. Да и в АСМЕ без них не обойдешься - фон-неймановская модуль работает там - переход на произвольный участок (памяти например) - а это и есть скачок! переход!

Но цель развития программирвоания - свести все команды ближе к человеческому языку, и от безусловных переходов решили отказаться!

Если вам так мил АСМ, вам на несклолько разделов ниже в форум АССЕМБЛЕР.

Так какие проблеммы в задаче?
>hamka<
Цитата(Oleg_Z @ 25.02.05 20:21)
Так какие проблеммы в задаче?

Хочу проверку на число оформить как процедуру. А так у меня все в программе разбросано на метки. ( если не число _>переход на введение числа)Как переоформить не знаю. Флажки не работали и в программе без разбиения на процедуры. Только по меткам я добилась хоть какой-то корректной работы. Теперь я понимаю, что надо делать как-то по-другому. Как не знаю. И сроки уже поджимают =))
Altair
убрать ВСЕ МЕТКИ ИЗ ПРОГРАММЫ.

А вы можете сказать задание вообще глобальное которое вы делаете?
SKVOZNJAK
Цитата(Oleg_Z @ 25.02.05 17:19)
Но цель развития программирвоания - свести все команды ближе к человеческому языку, и от безусловных переходов решили отказаться!



На ловца и зверь бежит smile.gif Недавно ковырялся в настройках ГТА вай сити(рульная фановая игра, если кто не слышал или не играет) и залез в скрипты. Уж насколько скрипты к человеческому языку приближены, а вот оказалось что там всё через GOTO работает lol.gif Ведь что есть гото, это машинный вариант человеческой команды-приветствия "да пошёл ты на... в..." только без мата. А уж сколько этими короткими фразами в человеческом языке можно сказать. Но неприятие нецензурной (отнюдь не нормативной smile.gif) лексики этого не позволяет. Тут же цивильно - ну не обидится же комп если на регистр его пошлют smile.gif Вывод, иногда lol.gif в некоторых прогах без этого обойтись сложно, если специально не подгонять задачу под возможности решения без гото.
То о чём ты спрашиваешь, уже когда-то обсуждалось на форуме, конкретно система "сушняк турбо" - моё извращение над турбовизион. Там приведён работающий макет проги с оконным интерфейсом. Естественно пупырится всё через гото, управление объектами тоже через гото. Можешь поискать на форуме инфу или скачать исходники с моего сайта. Принцип такой. Ядро программы состоит из бесконечного цикла на гото типа:

Код

BEGIN

A:=0;

1:
............................
GOTO 3;
2:
.............................


3:

CASE A OF
0: PROCEDUR1;
1: GOTO 2;
2: PROCEDUR2;
3: PROCEDUR3;
END;

IF A=100 THEN GOTO 100;
GOTO 1;

100:
END.



Цикл на гото и есть тело проги, он запускает объекты, процедуры, да всё что угодно. Каждая процедура или объект при запуске считывает данные и номер команды из массива глобальных переменных, туда же всё и сохраняет. Выполнив действие объект записывает команду в переменную и отрубается(сохраняет завещание с которым далее работает адвокат). Это может быть команда запустить что-то ещё, или предоставить дополнительную инфу и запуститься снова - зависит от вашей фантазии. Объект в данном случае становится как бы обычной процедурой, а не основой проги. Команда считывается в операторе CASE или IF THEN, и опять по кругу. Бесконечная мясорубка перемалывающая инфу. Основной прикол в том, что любые объекты не живут слишком долго и используются по очереди, а
значит обеспечивается совместимость несовместимых сабжей.
Martyr
Stop flaming!

В BP запрещено обращение к идентификаторам-меткам вне текущего блока (т. е. из процедуры к метке основной программы).
SKVOZNJAK
Невнимательно читал, если вообще дочитал. В этой концепции описывается альтернативный подход, запреты для которого ещё не написали smile.gif И есть работающие по этой схеме проги, в частности игра, разновидность шахмат. Жалко со временем туго, былоб прикольно и над дельфи так приколоться smile.gif
Martyr
Вообще этот подход называется асинхронной обработкой событий (сейчас широко применяется при построении пользовательских интерфейсов) smile.gifСовременная альтернатива: использование иерархии классов и полиморфизма (аппарата виртуальных функций). Впрочем, все это смутно связано с ответом на вопрос сабжа <_<

P. S. Примерчик активного использования GOTO... smile.gif
Altair
Вы отклоняетесь от темы... GOTO - ПЛОХОЙ СТИЛЬ ПРОГРАММИРОВАНИЯ
... вообще-то тема себя исчерпала, .т.к. вопрос автора темы относился к задачам. Думаю обсуждать больше нечего.
SKVOZNJAK
Может и плохой, но придумай ему адекватную замену, если таковая вообще существует.
Dark
Олежка, если вопрос относился к задачам то почему он в теории? А поскольку он находится в теории - то его можно здесь обсуждать, независимо от направления первого вопроса

Мне лично тема интересна =) но со стороны
Romtek
Цитата(>hamka< @ 25.02.05 20:28)
Хочу проверку на число оформить как процедуру.


Код
Procedure InputN (var N: integer);
var
 erс: integer;
begin
 repeat
   write ('Введите целое число: ');
   {$I-}
   readln (N);
   {$I+}
   erc :=IOresult;
   if erc <> 0 then
      writeln ('Число должно быть *целым*');
 until erc = 0;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.