Так вроде Ivanoff-iv начал с того, что вот есть функция GetTemp(), внутри конечный автомат, из кода ее периодически вызываем... У тебя в примере циклично вызывается get_temperature(), реализация может быть какой угодно, в том числе и тот же автомат, если не хотим ждать. Существенная разница в чем?
Вопросы по С/С++ (СИ)
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=3345454#p3345454"]функция get_temperature может не возвращать управление до конца ожидания, может возвращать предыдущее значение до окончания преобразования - это тонкости её внутренней реализации, которая, как я и написал, может быть любой.[/uquote]
Так вроде Ivanoff-iv начал с того, что вот есть функция GetTemp(), внутри конечный автомат, из кода ее периодически вызываем... У тебя в примере циклично вызывается get_temperature(), реализация может быть какой угодно, в том числе и тот же автомат, если не хотим ждать. Существенная разница в чем?
Так вроде Ivanoff-iv начал с того, что вот есть функция GetTemp(), внутри конечный автомат, из кода ее периодически вызываем... У тебя в примере циклично вызывается get_temperature(), реализация может быть какой угодно, в том числе и тот же автомат, если не хотим ждать. Существенная разница в чем?
- Реклама
уж не знаю, с чего он начал, но закончил он вот этим:Reflector писал(а):Так вроде Ivanoff-iv начал с того, что вот есть функция GetTemp(), внутри конечный автомат
и дальнейшие мои рассуждения уже об этом.Ivanoff-iv писал(а):а у меня нет навороченного обработчика и переходов к над/подпрограммам - просто линейный код разбвавленный IF и switch-case...
конечный автомат штука хорошая, но заменять им любую логику приложения - это далеко не всегда разумно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Разница в том, что человек реализует автомат в прерывании. Причём, наживает себе гемор с разделением кода на куски, чтобы вовремя отдать управление обратно.Reflector писал(а):Существенная разница в чем?
Ему тут ОС то, скорее всего, и не понадобится совсем. Всё перенести в основной цикл и грамотно распределить задачи (пусть даже тем же автоматом).
извините, пришлось отлучиться
1) если бы меня в текущем положении дел всё устраивало - я бы сюда не написал...
2) про ОПО там не такой код и его я не пишу, пока нет прав. но смотреть и разбираться в этом коде приходится. там не РТОС, там скорее виртуальная машина (сначала грузится система отладки, которая позволяет на горячую отслеживать и изменять переменные, флаги...) а сам "полезный" код очень линеен.
3) макарон получается немного, вот функцию вы вызываете и она пока датчик не ответил (отдельный вопрос определения что датчик ответил внешнее прерывание или от таймера? опустим пока, но потом всёравно над этим придётся подумать) допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
на счет функций - да это подпрограмма со своим окружением, но если хотите - напишу всё через дефайн
4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт? а остальные - не связанные с этим прерывания будут короткими.
Добавлено after 13 minutes 7 seconds:
размещение и компоновку кода я продумал, с этим вопросов нет.
пишу, чтобы получить совет - как красивее это всё оформить,
задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода.
1) если бы меня в текущем положении дел всё устраивало - я бы сюда не написал...
2) про ОПО там не такой код и его я не пишу, пока нет прав. но смотреть и разбираться в этом коде приходится. там не РТОС, там скорее виртуальная машина (сначала грузится система отладки, которая позволяет на горячую отслеживать и изменять переменные, флаги...) а сам "полезный" код очень линеен.
3) макарон получается немного, вот функцию вы вызываете и она пока датчик не ответил (отдельный вопрос определения что датчик ответил внешнее прерывание или от таймера? опустим пока, но потом всёравно над этим придётся подумать) допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
на счет функций - да это подпрограмма со своим окружением, но если хотите - напишу всё через дефайн
4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт? а остальные - не связанные с этим прерывания будут короткими.
Добавлено after 13 minutes 7 seconds:
размещение и компоновку кода я продумал, с этим вопросов нет.
пишу, чтобы получить совет - как красивее это всё оформить,
задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 290
- Зарегистрирован: Чт ноя 06, 2014 13:09:06
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода.[/uquote]
Хм. Классическое переключение контекста на другую задачу. Тогда как обычно: сохраняем контекст (все регистры + адрес возврата), далее, в общем случае начинает работать планировщик, который определяет, какой задаче дать процессорное время. Естественно, для каждой задачи требуется память (сообственно дескриптор задачи, стек задачи).
Или я не понял твои хотелки?
ЗЫ. Какого рода совет нужен?
Хм. Классическое переключение контекста на другую задачу. Тогда как обычно: сохраняем контекст (все регистры + адрес возврата), далее, в общем случае начинает работать планировщик, который определяет, какой задаче дать процессорное время. Естественно, для каждой задачи требуется память (сообственно дескриптор задачи, стек задачи).
Или я не понял твои хотелки?
ЗЫ. Какого рода совет нужен?
- Реклама
он не столько тяжел, сколько сложен для понимания. да и получается путаным частенько после пары-тройки корретировокIvanoff-iv писал(а):а чем код конечных автоматов тяжел?
очень странная постановка задачи. тут на форуме не один раз сталкивался с тем, что то одному, то другому начинает хотеться то из прерывания возвращаться не туда, откуда вышел, то из функции возвращаться в другое место... то главный цикл продолжать сначала... что-то и в вашей задаче есть такое, странненькое.Ivanoff-iv писал(а):задача сделать конструкцию, чтобы при наступании на её запоминалась позиция выполнения и подпрограмма завершалась, а при следующем запуске подпрограммы (возможно там ответная конструкция) вернуться на прежнее место выполнения кода
характерное для многозадачных ОС. к чему это в собственных поделках - пока не ясно. особенно, если мы говорим о малоресурсных МК типа AVRviiv писал(а):Классическое переключение контекста на другую задачу
давайте неспеша разберемся. если функция не виснет, то очевидно, что её результат следует обработать. и это очень правильно и логично. задача функции - сделать свои дела и сообщить наружу о результате, задача "главного" цикла - понять, что с этим результатом делать. и очень даже хорошо, когда именно так. в частности, есть и стандарты, ПРЕДПИСЫВАЮЩИЕ только так и делать, т.е. нельзя игнорировать результат функции.Ivanoff-iv писал(а):допустим вылетает со старым значением, чтоб код не подвесить, тогда всё равно будет результат и его придётся обработать; а если виснет, то в это время на её уровне мы ничего не сможем делать.
а теперь вторая часть вашего рассуждения - про зависшую функцию. вы абсолютно правы, что в этом случае на уровне вызывающего такую функцию кода все подвисает. но это абсолютно не касается фоновых процессов, работающих по прерываниям, например, динамической индикации или чего-то еще. поэтому, если функция должна работать долго - пусть работает. а вот если она зависла из-за ошибки, то и в вашем случае с автоматом состояний все будет стоять колом... поэтому для случая ошибок в коде вообще все равно. и, кстати, даже ОСРВ тут ничем не поможет: даже если она сумеет прервать "зависшую" функцию, то спустя некоторое время все равно вернется в неё. и та часть кода, которая ждет результатов из этой подло зависшей функции, так никогда и не дождется его, и все ваши старания пойдут коту под хвост.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
нет, на другую задачу я переключаться не хочу, хочу перемещаться в пределах подпрограммы (чтобы ни стек не трогать, ни контекст), просто хотел спросить есть ли для этого более удобный метод чем свитч-кейс? както со счётчиком комманд взаимодействовать? на прямую он вроде не даёт. и будет ли из этого польза? (по памяти, скорее нет, т.к. придётся хранить на байт служебной инфы больше) (по надёжности тоже скорее нет - в друг в адрес перехода ахинея какая попадёт...) так может хоть по флешу и по возможностям (например вставлять в цикл)?
пс. про цикл, вроде разобрался - можно. пойду курить про возможности дефайна, чтобы ещё эту запись облагородить.
Добавлено after 40 minutes 49 seconds:
Re: Вопросы по С/С++ (СИ)
хотя нет не разобрался - там для выхода изконструкции применён брейк, а в цикле он скорее всего сделает не то.
наверно GOTO придётся применять.
Добавлено after 53 seconds:
Re: Вопросы по С/С++ (СИ)
завтра поэкспериментирую
пс. про цикл, вроде разобрался - можно. пойду курить про возможности дефайна, чтобы ещё эту запись облагородить.
Добавлено after 40 minutes 49 seconds:
Re: Вопросы по С/С++ (СИ)
хотя нет не разобрался - там для выхода изконструкции применён брейк, а в цикле он скорее всего сделает не то.
Добавлено after 53 seconds:
Re: Вопросы по С/С++ (СИ)
завтра поэкспериментирую
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=3345686#p3345686"]очень странная постановка задачи. тут на форуме не один раз сталкивался с тем, что то одному, то другому начинает хотеться то из прерывания возвращаться не туда, откуда вышел, то из функции возвращаться в другое место... то главный цикл продолжать сначала... что-то и в вашей задаче есть такое, странненькое.[/uquote]
В плюсах сейчас обкатывают coroutines/resumable functions(в VS уже работают), во многих языках корутины идут из коробки. Если это stackless реализация, то компилятор по сути преобразовывает код в конечный автомат, т.е. получается именно то, что Ivanoff-iv и хочет. Не знаю насколько это в данном случае будет эффективно, но хотеть такое совсем не странно, потому подобную функциональность в языки и добавляют.
В плюсах сейчас обкатывают coroutines/resumable functions(в VS уже работают), во многих языках корутины идут из коробки. Если это stackless реализация, то компилятор по сути преобразовывает код в конечный автомат, т.е. получается именно то, что Ivanoff-iv и хочет. Не знаю насколько это в данном случае будет эффективно, но хотеть такое совсем не странно, потому подобную функциональность в языки и добавляют.
в какие дебри вы полезли! Си вам дано для того, чтобы забыть про счетчик команд... а вы наоборот.Ivanoff-iv писал(а):както со счётчиком комманд взаимодействовать?
есть такая страшная вещь - setjmp.h - модуль, который позволяет откуда угодно сделать "goto" куда угодно в пределах модуля. но сразу предупреждаю - я вам не советую этим пользоваться! и вообще, есличо - я ничего про это не говорил.
если вам интересен мой совет, то он таков: вместо усложнения одной функции разбейте её на несколько маленьких и простых. толку будет гораздо больше. при этом, скорее всего, вам придется пересмотреть и подход в принципе, а именно отказаться от повсеместного и безоговорочного использования автомата состояний, как единственного решения любых проблем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт?[/uquote]
Он всем хорош. Но Вы, в своём случае, его используете всего-лишь потому, что крутите его в обработчике прерываний и не хотите допустить выход за временные рамки.
Если Вы его вынесете в основной цикл, то автоматом всё упростите. У Вас уже не будет столько switch-case'ов, у Вас уже не будет такого огромного кол-ва состояний и, как следствие, их обработки. У Вас упростится всё...
По поводу выхода и возврата в тоже место программы. Во время выполнения обработчика (где Вы всё и крутите) это сделать будет намного тяжелее, чем в основном цикле. А так - сохранение контекста для каждой задачи (отдельного потока) и возврат его при обратном входе. Как уже сказали - "Классическое переключение контекста на другую задачу".

Он всем хорош. Но Вы, в своём случае, его используете всего-лишь потому, что крутите его в обработчике прерываний и не хотите допустить выход за временные рамки.
Если Вы его вынесете в основной цикл, то автоматом всё упростите. У Вас уже не будет столько switch-case'ов, у Вас уже не будет такого огромного кол-ва состояний и, как следствие, их обработки. У Вас упростится всё...
По поводу выхода и возврата в тоже место программы. Во время выполнения обработчика (где Вы всё и крутите) это сделать будет намного тяжелее, чем в основном цикле. А так - сохранение контекста для каждой задачи (отдельного потока) и возврат его при обратном входе. Как уже сказали - "Классическое переключение контекста на другую задачу".
Ой, только я начал читать это и меня сразу передёрнуло. И мне уже сразу не терпелось высказаться. Но, в конце предложения, Вы сами всё за меня сказалиARV писал(а):есть такая страшная вещь - setjmp.h
это я прекрасно понимаю... но раз встаёт такой вопрос - значит я его плохо знаю.ARV писал(а):Си вам дано для того, чтобы забыть про счетчик команд...
у меня их обычно не так много - конкретно в этом коде я так убрал все крупные (мелкие в подпрограммах) делаи - сколько их было, столько и кейсовАlex писал(а):У Вас уже не будет столько switch-case'ов,
---------------------------------------
пытаюсь думать дальше: есть какой нибудь метод чтобы название переменной преобразовать в текст?
если я сделаю вместо break`ов GOTO label; то, пока у меня в коде один блок - всё нормально, а вот если несколько - то метки нужны разные, вот, чтобы автоматом они вписывались взять бы за название метки имя переменной (в рамках одного блока она постоянна, а в другом будет гарантирована другая) т.е. возложить всю эту работу на компилятор
ПС: я итак уже "дал слабину" начав нумеровать точки останова - по идее их нумерацию желательно тоже автоматизировать
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ну вот, метастазы плохого стиля уже проникли в ваш кодIvanoff-iv писал(а):если я сделаю вместо break`ов GOTO label;
всё, пропал человек...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
на самом деле гото сидит во всех функциях, в которых изменяется порядок выполнения кода, просто программист к ним доступа не имеет.
я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...
я просто надеялся что такая конструкция существует, только я о ней не знаю - думаю, ткнут носом в готовый велосипед, чтобы не изобретать.
я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...
я просто надеялся что такая конструкция существует, только я о ней не знаю - думаю, ткнут носом в готовый велосипед, чтобы не изобретать.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
и это совсем не хорошоIvanoff-iv писал(а):на самом деле гото сидит во всех функциях
и это не просто не хорошо, а ужасноIvanoff-iv писал(а):я хочу сделать также - создам макрос и гото не будет доступно программисту
да конструкций полно, но зачем?!Ivanoff-iv писал(а):я просто надеялся что такая конструкция существует, только я о ней не знаю
вы все время идете по пути усложнения кода, хотя правильная практика - максимальное его упрощение. чем загадочней код выглядит, тем хуже. если вы спрячете goto в макрос, вы вообще запутаете любого, кто взглянет на ваш код. ну зачем это делать?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
это как минимум неизбежно... а почему это не хорошо? оно както портит код (снижает понятность или надежность)?ARV писал(а):и это совсем не хорошо
всё, кажись получилось, попробую обкатать...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
уже давно научно доказано, что избежно. просто достаточно часто избегание goto приводит к большей некрасивости кода. но в целом и общем наличие goto всегда тревожный маячок для программиста, а их избыток или решающая роль в коде - повод для очень большого беспокойстваIvanoff-iv писал(а):это как минимум неизбежно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
нет, я имею ввиду не те, что пишутся goto Label; а те что пишутся if () {}else{}; или switch() {case0:...}; или ещё както - для контроллера на низком уровне это теже гото... только программист туда ахинею не сможет вписать - они контролируются компилятором
---------------------------------
кстати у меня получилась не совсем машина конечных автоматов (там переходы осуществляются самой машиной, програмист только задаёт направление), а у меня - простая замена делай`я: откуда ушли - от туда обязательно и продолжим, все остальные перемещения - силами программиста
Добавлено after 24 minutes 11 seconds:
из недостатков - практически все переменные, в подпрограмме, где использован код приходится делать статик.
---------------------------------
кстати у меня получилась не совсем машина конечных автоматов (там переходы осуществляются самой машиной, програмист только задаёт направление), а у меня - простая замена делай`я: откуда ушли - от туда обязательно и продолжим, все остальные перемещения - силами программиста
Добавлено after 24 minutes 11 seconds:
из недостатков - практически все переменные, в подпрограмме, где использован код приходится делать статик.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Сообщения: 353
- Зарегистрирован: Вс янв 19, 2014 22:41:55
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345996#p3345996"]на самом деле гото сидит во всех функциях, в которых изменяется порядок выполнения кода, просто программист к ним доступа не имеет.[/uquote]
Как не имеет? Имеет. В С мы платим гибкостью ассемблера за комфорт обобщённых типовых паттернов построения кода. И перекладываем львиную долю рутинных операций на машину. Человек должен творить, а машина - пахать. Если вам нужен доступ к этим goto - пишите на ассемблере. Но сделав из С ассемблер - будьте готовы, что вас не поймут - причём во всех смыслах - и стратегически (заччем?!) и буквально - никто не любит смотреть неструктурированный запутанный код. Кстати о последнем - ваш исходный спойлер нечитабелен, честно говоря. "Мыслит, кто ясно излагает, тот ясно. Поняли если вы меня о чём." Заставив искать case чёрт знает где вы, вероятно, потратили лимит внимания тех, кто потенциально был готов вам помочь, увы. Всякий язык - для обмена идеями и делать это быстрее всего уже привычно выглядящими для коллег блоками. Не в обиду?
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345996#p3345996"]я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...[/uquote]
О каком программисте речь? Для собственого употребления вы вольны делать как вам удобнее, но предлагая кому-то воспользоваться вашими трудами нужно думать о удобстве тех, кому предлагаете - а они уже лет 40 как предпочитают привычные формы. Макрос хорош если вы сами его писали для себя, или если вы его прилежно задокументировали для коллег, но в любом случае скрытый переход внутри макроса - это волчий билет для автора. Силява́!
ЗЫ: Интересно, кому-нибудь ещё, кроме меня, не хватает штатной "конструкции" (АКА исключения для бедных):
Как не имеет? Имеет. В С мы платим гибкостью ассемблера за комфорт обобщённых типовых паттернов построения кода. И перекладываем львиную долю рутинных операций на машину. Человек должен творить, а машина - пахать. Если вам нужен доступ к этим goto - пишите на ассемблере. Но сделав из С ассемблер - будьте готовы, что вас не поймут - причём во всех смыслах - и стратегически (заччем?!) и буквально - никто не любит смотреть неструктурированный запутанный код. Кстати о последнем - ваш исходный спойлер нечитабелен, честно говоря. "Мыслит, кто ясно излагает, тот ясно. Поняли если вы меня о чём." Заставив искать case чёрт знает где вы, вероятно, потратили лимит внимания тех, кто потенциально был готов вам помочь, увы. Всякий язык - для обмена идеями и делать это быстрее всего уже привычно выглядящими для коллег блоками. Не в обиду?
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345996#p3345996"]я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...[/uquote]
О каком программисте речь? Для собственого употребления вы вольны делать как вам удобнее, но предлагая кому-то воспользоваться вашими трудами нужно думать о удобстве тех, кому предлагаете - а они уже лет 40 как предпочитают привычные формы. Макрос хорош если вы сами его писали для себя, или если вы его прилежно задокументировали для коллег, но в любом случае скрытый переход внутри макроса - это волчий билет для автора. Силява́!
ЗЫ: Интересно, кому-нибудь ещё, кроме меня, не хватает штатной "конструкции" (АКА исключения для бедных):
Спойлер
Код: Выделить всё
do {
if (check1)
break;
if (check2)
break;
if (check3)
break;
if (check4)
break;
if (check5)
break;
[...]
if (checkN)
break;
// all checks are ok - let's do
result = OK;
} while (false);
return result;
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! 


