Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):както со счётчиком комманд взаимодействовать?
в какие дебри вы полезли! Си вам дано для того, чтобы забыть про счетчик команд... а вы наоборот.

есть такая страшная вещь - setjmp.h - модуль, который позволяет откуда угодно сделать "goto" куда угодно в пределах модуля. но сразу предупреждаю - я вам не советую этим пользоваться! и вообще, есличо - я ничего про это не говорил.

если вам интересен мой совет, то он таков: вместо усложнения одной функции разбейте её на несколько маленьких и простых. толку будет гораздо больше. при этом, скорее всего, вам придется пересмотреть и подход в принципе, а именно отказаться от повсеместного и безоговорочного использования автомата состояний, как единственного решения любых проблем.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3345603#p3345603"]4) а чем код конечных автоматов тяжел? и чем я рискую если точно знаю что время выполнения кода не больше времени между вызовами прерываний и знаю, что этого прерывания раньше чем я его жду не произойдёт?[/uquote]
Он всем хорош. Но Вы, в своём случае, его используете всего-лишь потому, что крутите его в обработчике прерываний и не хотите допустить выход за временные рамки.
Если Вы его вынесете в основной цикл, то автоматом всё упростите. У Вас уже не будет столько switch-case'ов, у Вас уже не будет такого огромного кол-ва состояний и, как следствие, их обработки. У Вас упростится всё...

По поводу выхода и возврата в тоже место программы. Во время выполнения обработчика (где Вы всё и крутите) это сделать будет намного тяжелее, чем в основном цикле. А так - сохранение контекста для каждой задачи (отдельного потока) и возврат его при обратном входе. Как уже сказали - "Классическое переключение контекста на другую задачу".
ARV писал(а):есть такая страшная вещь - setjmp.h
Ой, только я начал читать это и меня сразу передёрнуло. И мне уже сразу не терпелось высказаться. Но, в конце предложения, Вы сами всё за меня сказали :)))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

ARV писал(а):Си вам дано для того, чтобы забыть про счетчик команд...
это я прекрасно понимаю... но раз встаёт такой вопрос - значит я его плохо знаю.
Аlex писал(а):У Вас уже не будет столько switch-case'ов,
у меня их обычно не так много - конкретно в этом коде я так убрал все крупные (мелкие в подпрограммах) делаи - сколько их было, столько и кейсов
---------------------------------------
пытаюсь думать дальше: есть какой нибудь метод чтобы название переменной преобразовать в текст?
если я сделаю вместо break`ов GOTO label; то, пока у меня в коде один блок - всё нормально, а вот если несколько - то метки нужны разные, вот, чтобы автоматом они вписывались взять бы за название метки имя переменной (в рамках одного блока она постоянна, а в другом будет гарантирована другая) т.е. возложить всю эту работу на компилятор
ПС: я итак уже "дал слабину" начав нумеровать точки останова - по идее их нумерацию желательно тоже автоматизировать
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):если я сделаю вместо break`ов GOTO label;
ну вот, метастазы плохого стиля уже проникли в ваш код :))) goto принято считать скорее допустимым исключением, вроде родимого пятнышка на лице (лучше, когда нет, но если маленькое, то ничего не портит и иногда придает даже некий шарм), чем правилом. вы же приступили к процессу, делающим goto доминирующим...

всё, пропал человек... :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

на самом деле гото сидит во всех функциях, в которых изменяется порядок выполнения кода, просто программист к ним доступа не имеет.
я хочу сделать также - создам макрос и гото не будет доступно программисту, но если и это много...
я просто надеялся что такая конструкция существует, только я о ней не знаю - думаю, ткнут носом в готовый велосипед, чтобы не изобретать.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):на самом деле гото сидит во всех функциях
и это совсем не хорошо
Ivanoff-iv писал(а):я хочу сделать также - создам макрос и гото не будет доступно программисту
и это не просто не хорошо, а ужасно
Ivanoff-iv писал(а):я просто надеялся что такая конструкция существует, только я о ней не знаю
да конструкций полно, но зачем?!

вы все время идете по пути усложнения кода, хотя правильная практика - максимальное его упрощение. чем загадочней код выглядит, тем хуже. если вы спрячете goto в макрос, вы вообще запутаете любого, кто взглянет на ваш код. ну зачем это делать? :o
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

ARV писал(а):и это совсем не хорошо
это как минимум неизбежно... а почему это не хорошо? оно както портит код (снижает понятность или надежность)?
всё, кажись получилось, попробую обкатать...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):это как минимум неизбежно...
уже давно научно доказано, что избежно. просто достаточно часто избегание goto приводит к большей некрасивости кода. но в целом и общем наличие goto всегда тревожный маячок для программиста, а их избыток или решающая роль в коде - повод для очень большого беспокойства
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

нет, я имею ввиду не те, что пишутся goto Label; а те что пишутся if () {}else{}; или switch() {case0:...}; или ещё както - для контроллера на низком уровне это теже гото... только программист туда ахинею не сможет вписать - они контролируются компилятором
---------------------------------
кстати у меня получилась не совсем машина конечных автоматов (там переходы осуществляются самой машиной, програмист только задаёт направление), а у меня - простая замена делай`я: откуда ушли - от туда обязательно и продолжим, все остальные перемещения - силами программиста

Добавлено after 24 minutes 11 seconds:
из недостатков - практически все переменные, в подпрограмме, где использован код приходится делать статик.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ivanoff-iv писал(а):Ivanoff-iv
У Вас камень и компилятор какие ?
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Сообщение Siarzhuk »

[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 как предпочитают привычные формы. Макрос хорош если вы сами его писали для себя, или если вы его прилежно задокументировали для коллег, но в любом случае скрытый переход внутри макроса - это волчий билет для автора. Силява́! :-(

ЗЫ: Интересно, кому-нибудь ещё, кроме меня, не хватает штатной "конструкции" (АКА исключения для бедных):
Спойлер

Код: Выделить всё

   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! ;-)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Siarzhuk писал(а):Интересно, кому-нибудь ещё, кроме меня, не хватает штатной "конструкции" (АКА исключения для бедных)
вы про эквивалент try-finally? можно макросами, кстати...

но вообще мне не хватает break из вложенных циклов... как бы можно было это реализовать - не знаю, но не помешало бы точно :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

Siarzhuk писал(а):делать это быстрее всего уже привычно выглядящими для коллег блоками.
понятно, просто простыня длинная...вот и свернул... (действительно, надо было самую исходную портянку выкладывать)
так я и пытаюсь сделать код более привычным, понятным и универсальным.
Siarzhuk писал(а):О каком программисте речь?
Конечно задокументирую, когда конечный результат получу и проведу испытания
Siarzhuk писал(а):скрытый переход внутри макроса - это волчий билет для автора
а я вам и не предлагаю с ГОТОй - если внутрь цикла (или ветвления) его не вставлять - всё ОК, а если вставить - оператор брейк путается и кидается не на того... (завершает цикл вместо кейса).
но боюсь, что чтобы обойти такой прикол -всётаки ГОТО будет :( другого варианта пока не вижу
так то брейк - тотже гото, только более автоматизированый (сам себе цель выбирает)

Добавлено after 2 minutes 36 seconds:
над Вашим, Siarzhuk, вариантом кода подумаю.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346097#p3346097"]среда - кодевижен,
камни - конкретно этот код идёт под тини2313, но и в меге 8 работает.[/uquote]
Тогда конкретно не подскажу.
В общих чертах - сохраняйте точку возврата (она будет адресом следующей инструкции) и возвращайтесь по return из функции. Затем, чтобы войти обратно, используйте эту точку. Первый вход - адрес функции.
Но учтите, если не будете манипулировать с сохранением стека (а это реально геморрой, ибо нужно отводить под каждый поток свою область памяти), то об использовании локальных переменных между вызовами можете забыть. В принципе, это не проблема - юзаем статические переменные.

Добавлено after 2 minutes 46 seconds:
ПыСы: Советую Вам поюзать OSA, тогда поймёте принцип распараллеливания задач и входа/выхода из них.

Добавлено after 6 minutes 18 seconds:
ПыСы2: И ещё. Ооооочень настоятельно рекомендую Вам пересмотреть реализацию своего кода и перенести бОльшую часть в основной цикл. Не нужно его экономить, наживая себе гемор...
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

OSA - изучаю, принцип распараллеливания понятен.
про стек - понимаю, потому и делаю всё локально внутри функции как добыть точку возврата? по номеру метки или абсолютный адрес сохранять? а если кто его испортит (хотя посторонних там быть не должно :) )
тот диспетчер, который я приводил - он тоже под тиню делался.
думаю что постепенно уйду в OSA - алгоритм многопоточности мне близок, я итак делаю чтото подобное, но с профи мне не тягаться
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Ivanoff-iv писал(а):как добыть точку возврата?
Это нужно хорошо знать ассемблер и инструкции Ваших камней.
Я, увы, в этом нихт ферштейн...

Вот, для PIC'ов делал - http://radiokot.ru/forum/viewtopic.php? ... 2#p3333672 Но Вы, если их не знаете, вряд ли там чего поймёте...
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

на сколько я знаю у АВР этот регистр (PC- программ каунтер) недоступен напрямую, да и в его лезть, это почти как под поездом стрелки переводить...

Добавлено after 1 hour 18 minutes 19 seconds:
ещё можно всю обработку сделать в майне - крутись она там, а в прерывании оставить лишь таймеры - в этом случае скорость выполнения кода вырастет, но предсказуемость по времени выполнения команд снизится...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):ещё можно всю обработку сделать в майне - крутись она там, а в прерывании оставить лишь таймеры
по-моему, это самые лучшие намерения, которые я от вас услышал :)
Ivanoff-iv писал(а):но предсказуемость по времени выполнения команд снизится
я, наверное, что-то пропустил... но о чем это вы говорите? о какой-такой предсказуемости? зачем она вам?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Что то Ivanoff-iv мудрит. Сам запутался и нас путает :)
ещё можно всю обработку сделать в майне - крутись она там, а в прерывании оставить лишь таймеры
Фух... Наконец то... :hunger:
Ответить

Вернуться в «Разные вопросы по МК»