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

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

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

Сообщение ARV »

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

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

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

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

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

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

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

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

Сообщение А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: И ещё. Ооооочень настоятельно рекомендую Вам пересмотреть реализацию своего кода и перенести бОльшую часть в основной цикл. Не нужно его экономить, наживая себе гемор...
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

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

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

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

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

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

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

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

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

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

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

Сообщение ARV »

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

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

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

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

Что то Ivanoff-iv мудрит. Сам запутался и нас путает :)
ещё можно всю обработку сделать в майне - крутись она там, а в прерывании оставить лишь таймеры
Фух... Наконец то... :hunger:
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

а спать - если все счётчики!=0 опять же их проверять, хотя.. когда по всем счетчикам пробежимся, проверяя на равенство - ответ сам и получится, складно..., ладно, завтра подумаю... сегодня рабдень кончился
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346143#p3346143"]на сколько я знаю у АВР этот регистр (PC- программ каунтер) недоступен напрямую[/uquote]
Это почему же? Это как раз без проблем (команды переходов, вызовов, возвратов никто не отменял), например запись в PC:

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

#define avr_write_pc(new_pc) do { \
        asm volatile (            \
        "ijmp"  "\n\t"            \
        : : "z" (new_pc));        \
} while (0)
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346143#p3346143"]да и в его лезть, это почти как под поездом стрелки переводить...[/uquote]
Вот это точно. Компилятор сгенерировал код, а Вы хотите "прыгать" в этом коде, как Вам хочется? Ничего хорошего из этого не выйдет.

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346128#p3346128"]как добыть точку возврата?[/uquote]
Она (точка возрата) лежит под стеком.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

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

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

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346235#p3346235"]про стек знаю - там продолжение вопроса было.[/uquote]
Да, не внимательно читаю. Но и называть это "точкой возрата" странно - скорее, это точка входа, если я правильно понял то, что вам надо:

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

static unsigned char xx_var;
void xx (void)
{
        xx_var += 1;

        asm volatile ("xx_wo_inc: .globl xx_wo_inc\n");

        if (xx_var) {
                xx_var = 0;
        }
}
Далее можно объявить: extern void xx_wo_inc (void); и вызывать эту функцию, т.е. на самом деле "прыгать" в середину другой функции. Вот во что это скомпилировалось:

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

xx:
        lds r24,xx_var
        subi r24,lo8(-(1))
        sts xx_var,r24

xx_wo_inc: .globl xx_wo_inc

        lds r24,xx_var
        tst r24
        breq .L3
        sts xx_var,__zero_reg__
.L3:
        ret
Т.е. все нормально - можно безболезнено вызывать xx_wo_inc (). Но это очень простая функция и здесь все получилось. Вообще говоря, "вход внутрь функции" - идея странная, я без о-о-о-о-о-очень больших оснований бы так не делал никогда, и Вам не советую. :-)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

viiv писал(а):Вот во что это скомпилировалось:
судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="ARV",url="/forum/viewtopic.php?p=3346260#p3346260"]судя по всему вы предложили очередной вариант setjmp.h, о котором уже было сказано... даже не понимаю, зачем об этом говорить вообще...[/uquote]
Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

Добрый день, есть enum который будет использоваться в в нескольких файлах подскажите пожалуйста как его объявить?
Так как дублирование typedef запрещено, пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?
viiv
Грызет канифоль
Сообщения: 289
Зарегистрирован: Чт ноя 06, 2014 13:09:06

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

Сообщение viiv »

[uquote="baghear",url="/forum/viewtopic.php?p=3346285#p3346285"]пока нашел вариант и создать хедер и объявить в ним пользовательский тип. Подключать там где надо.
есть ли еще варианты?[/uquote]
Так и надо делать. А зачем другие варианты?
Аватара пользователя
baghear
Опытный кот
Сообщения: 791
Зарегистрирован: Вт июн 17, 2014 00:34:26

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

Сообщение baghear »

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

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

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

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

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

Сообщение ARV »

viiv писал(а):Ничего общего с setjmp()/longjmp(). Вообще не понимаю, почему у Вас возникла такая ассоциация
ну вот почему:
viiv писал(а):т.е. на самом деле "прыгать" в середину другой функции
вы предложили способ без применения setjmp.h сделать то же самое: из середины одной функции прыгнуть в середину другой. по-моему, общее с setjmp есть
Ivanoff-iv писал(а):решил осмотреться и поприбраться...
вот я и не понимаю, почему вместо причесывания кода в приличной манере вы пытаетесь освоить какие-то грязные хаки... имхо, лучше структурного программирования для Си не придумать. конечный автомат хорош, когда количество состояний небольшое. поэтому вместо наворачивания всего в один конечный автомат правильнее разбивать алгоритм на несколько маленьких. и, разумеется, распределять задачи между главным циклом и прерываниями - может, тогда и потребности в бесконечных автоматах не возникнет
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Ответить

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