Работа с циклами

zilk
Offline
Зарегистрирован: 09.08.2017

Здравствуйте!

Подскажите начинающему по вопросу создания циклов, "сдвинутых по фазе", если так можно выразиться.

Существует ли в языке такая возможность, чтобы создать 2 цикла, когда в одном параметр изменяется, например, от 0 до 9, т.е. 0,1,2,3,4,5,6,7,8,9, а в другом цикле параметр изменяется начиная с 5, т.е. 5,6,7,8,9,0,1,2,3,4. Задача состоит в том, чтобы синхронно делать две выборки элементов одного массива со "сдвигом по фазе". Если имеется некое стандартное решение такого случая, просьба направить в нужную сторону, или же кратко объяснить.

Спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, если синхронно, то Вам не нужны два цикла. Вам нужен один цикл с индексом от 0 до 9 и внутри него перемнная, которой присвается (i+5)%10 - вот и всё.

zilk
Offline
Зарегистрирован: 09.08.2017

ЕвгенийП пишет:

Ну, если синхронно, то Вам не нужны два цикла. Вам нужен один цикл с индексом от 0 до 9 и внутри него перемнная, которой присвается (i+5)%10 - вот и всё.

Спасибо за ответ!

Где почитать про расшифровку "(i+5)%10" ? Я изучаю язык 3-й день....

PS. Каждая из двух выборок присваивается своей переменной.

GarryC
Offline
Зарегистрирован: 08.08.2016

Все таки лучше будет (я не люблю %) что то вроде

j=i+5; if (j>9) j=j-10;

тогда при i=0 j=5 ... i=5 j=0 ... i=9 j=5 - то, что Вам и надо.

b707
Offline
Зарегистрирован: 26.05.2017

zilk пишет:

PS. Каждая из двух выборок присваивается своей переменной.

а не важно, сколько переменных. Главное - поймите базовый принцип. Если один индекс всегда сдвинут по отношению к другому на 5 значений - значит вам не нужно два отдельных цикла. вычисляйте второй индекс из первого, сдвигая его на пять. Именно такой сдвиг на пять делает тот оператор, которого вы не поняли.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zilk пишет:

Где почитать про расшифровку "(i+5)%10" ? Я изучаю язык 3-й день....

Вы не знаете, что означает "+"? Или "%"?

Почитайте в любой книге по С. Например, у Кернигана и Ритчи.

zilk
Offline
Зарегистрирован: 09.08.2017

GarryC пишет:

Все таки лучше будет (я не люблю %) что то вроде

j=i+5; if (j>9) j=j-10;

тогда при i=0 j=5 ... i=5 j=0 ... i=9 j=5 - то, что Вам и надо.

Большое спасибо, очень помогли!

Всё работает, легко получается, например, многофазный синус в виде ШИМ-а в 20-ти строках.

Первое предложение не проверял, т.к. пока не понял его смысла...

GarryC
Offline
Зарегистрирован: 08.08.2016

Евгений, не в обиду Вам, все таки принимайте в расчет 2 обстоятельства:
1. Не все на этом форуме знают С достаточно хорошо, это неприятно, но это факт, который мы с Вами не можем изменить.
(Конкретно я знаю, как работает оператор взятия отстатка от деления %, поэтому его и не люблю. Посмотрите код, им порождаемый, особенно для знакового числа, и Вы поймете причину этого чувства).
2. Следуя заветам "Гуру недели", нам надлежит в программе писать именно то, что нам нужно, а нам в данном конкретном случае нужно именно провернуть второй индекс и вариант с явным исправлением предпочтительнее, поскольку яснее отражает суть операции, но это ИМХО.
Я как раз закончил пост на Хабре по поводу кольцевого буфера, где пытаюсь обосновать именно такую точку зрения.

Кстати, вопрос к Вам, Евгений, как старожилу данного сайта, на Хабре у меня немало постов по основам программирования вообще и Ардуино в частности, может, есть смысл их сюда сбросить, или ссылки сделать, там есть небезинтересные моменты ?

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

Кстати, вопрос к Вам, Евгений, как старожилу данного сайта, на Хабре у меня немало постов по основам программирования вообще и Ардуино в частности, может, есть смысл их сюда сбросить, или ссылки сделать, там есть небезинтересные моменты ?

не знаю как посты, а ссылки точно не помешают.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я вмешаюсь.

ГарриС! Если вы обратите внимание, то заметите, что и Евгений и я прекрасно понимаем, что сюда лезут люди не знающие С.

Я сам, и, как я понимаю, ЕвгенийП, приводим, в меру сил, воспитательную политику. Вместо того, чтобы давать готовые ответы, направить новичка на изучение программирования, чтобы избежать вопросов типа "что значит x%y?". Человек не способный найти ответ самостоятельно не стоит усилий по помощи. Тут не благотворительная организация.

Вы не боитесь стать похожим на Квона? Помогая откровенным неучам.

----

да, и отдельно про "взятие по модулю". Такты и память экономят не бессознательно, по привычке, а только тогда, когда это нужно.

Читаемость кода с модулем (%) - для любого человека, знающего основы математики, - на порядок выше. Умение пользоваться этим инсрументом - бесценно.

То есть, по моему мнению, новичек должен сперва научиться пользоваться приемом от ЕвгенияП, а уж потом, осознанно, если нуждается в экономии памяти и/или тактов, применять ваш вариант.

-----

Еще раз, поскольку  это важно.

Вначале нужно создавать правильный код, красивый и масштабируемый. А потом можно его портить, заменяя % на вычитание.

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

В иной области (не програмирование) мой старый наставник учил: "Ты всегда старайся сделать хорошо, плохо - оно само получится".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GarryC пишет:

Евгений, не в обиду Вам

Да, Бог с Вами, какие обиды, я что гимзаистка, что ли?

GarryC пишет:

принимайте в расчет ... Не все на этом форуме знают С 

Как раз принимаю, и стараюсь по мере сил это исправлять.

Про остальное, простите нет настроения на мировозренческие дискуссии сейчас. Тут у меня в кабинете Климов сидит и болтаем про предстоящую конференцию, так что мне есть чем заняться ... 

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

А материалы, конечно давайте. И даже не думайте о том, что у меня или у кого-то ещё может быть другое мнение - собственно, у думающих людей всегда разные мнения, это нормально.

 

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну даже и не знаю - это я Дракуле (правильно?) перечитываю прямо сейчас Александреску
- 9*) избегайте преждевременной оптимизации - вроде аргумент в Вашу пользу и тут же
- 10*) избегайте пессимизации - аргумент в мою.

Вот и встает вопрос : вычитание вместо % - это оптимизация, либо % вместо вычитания - это пессимизация?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

zilk
Offline
Зарегистрирован: 09.08.2017

wdrakula пишет:

Я вмешаюсь.

ГарриС! Если вы обратите внимание, то заметите, что и Евгений и я прекрасно понимаем, что сюда лезут люди не знающие С.

Я сам, и, как я понимаю, ЕвгенийП, приводим, в меру сил, воспитательную политику. Вместо того, чтобы давать готовые ответы, направить новичка на изучение программирования, чтобы избежать вопросов типа "что значит x%y?". Человек не способный найти ответ самостоятельно не стоит усилий по помощи. Тут не благотворительная организация.

 

Вы, уважаемый, наверное что-то попутали и, как Вы сами говорите, "лезете" не в свою тему. Здесь нет необходимости выкладывать свое кредо программиста - здесь требовался простой ответ на простой вопрос от человека, 3 дня изучавшего язык, каковой и был получен благодаря уважаемому GarryC.

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

Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

zilk пишет:

Вы, уважаемый, наверное что-то попутали и, как Вы сами говорите, "лезете" не в свою тему.

1. Дурачек. Я не с тобой разговаривал. Тебя не учили в чужой разговор не встревать?

2. Первый правильный ответ был получен не от Гарри, а от Евгения.

3. Какая бы ни была специальность, образование (техническое) либо есть либо нет. Если есть, то знак % - означает "взятие по модулю" и это общеизвестно. Если тебе не известно - ты просто дурак и невежда.

4. Про меня. Вообще, входя на форум, нужно сперва разобраться кто здесь кто. Для тех кто в танке - повторю в 100500 раз:

мне 47 лет, МехМат МГУ 86-91, кафедра логики. IQ > 160, характер мерзкий. Програмирую я всю жизнь, поэтому на вопрос ответить уже не смогу. Первый проект был еще в средней школе. Естественно, мат-школе.

Поэтому ваш высер более чем смешон.

==========================================

Для ГарриС. По поводу ника. Можно Дракула или граф или просто Влад. Дракула - именно потому, что родители назвали Владиславом. Этот ник  у меня везде. Я ярый противник анонимности в сети.

zilk
Offline
Зарегистрирован: 09.08.2017

wdrakula пишет:

4. Про меня. Вообще, входя на форум, нужно сперва разобраться кто здесь кто. Для тех кто в танке - повторю в 100500 раз:

Мне плевать, кто ты такой, но все-таки обратись к психоаналитику - у тебя, как минимум, проблемы с завышенной самооценкой.

Да и сильно старшим грубить не комильфо, сынок.

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

zilk пишет:

Мне плевать, кто ты такой, но все-таки обратись к психоаналитику - у тебя, как минимум, проблемы с завышенной самооценкой.

Да и сильно старшим грубить не комильфо, сынок.

Родное сердце, ты папке своему советы давай, если, вдруг, мама тебя с ним познакомила, ОК?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

zilk пишет:

Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...

Здесь Вы влезли не на свою территорию и говорите о том, чего не знаете. Я могу ответить на Ваш вопрос "за себя", хотите? Правда, я не просто программист - я специалист по языкам. Так вот, для того чтобы понять смысл языка, его отличия от других языков и его особенности, мне достаточно разговора в курилке за время перекура (но, не с кем попало, а с таким же специалистом, как я). Для того, чтобы начать на языке программировать (иногда заглядывая в справочник) мне достаточно получаса - часа чтения документации. Через день-два мне уже не нужен справочник, а через 3-4 дня я могу консультировать по этому языку и считаться (среди прикладных программистов) гуру в нём. Вот как-то так. Так что, как видите, для специалиста три дня - очень много. То-то же!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Правда, я не просто программист - я специалист по языкам. Так вот, для того чтобы понять смысл языка, его отличия от других языков и его особенности, мне достаточно разговора в курилке за время перекура (но, не с кем попало, а с таким же специалистом, как я).

В этом смысле я Вам, Евгений, завидую. Мой приход в програмирование случился в 80-каком-то году, когда я занял 3 е место в Московской городской олимпиаде по программированию. И получил книгу Хантера "Проектирование и конструирование компиляторов".

Что и привело меня сперва к формальным грамматикам, а потом и на кафедру логики МехМата.

Поэтому на ЛЮБОЙ язык я смотрю с точки зрения: "а как написать компилятор с этого?". Некоторые "загибы" ООП вводят меня в шок, с этой точки зрения. Когда идеи автора языка или модуля к нему требуют "в тени" и сборки мусора и хэш таблиц, и многоуровневого кэша. Поэтому я и остаюсь поклонником процедурного С "от Кернигана и Ритчи", хоть и пишу на всем, что ни попадя.

GarryC
Offline
Зарегистрирован: 08.08.2016

<sarcasm> Завидую людям типа qwone, все то у них просто и понятно, это всякие Александреску туфтой занимаются, а им некогда - они нетленки создают. </sarcasm>

Ну а теперь серьезно - независимо от того, сколько раз выполняется оператор, он ДОЛЖЕН быть написан, в том числе с точки зрения эффективности, правильно. Это не для того, чтобы сэкономить 2 такта, а потому, что хороший программист даже маленькую программу напишет правильно, просто потому, ЧТО ПО ДРУГОМУ НЕ УМЕЕТ. А вот так себе программист, научившись на простеньких программах не думать вообще, так же будет поступать и с проектами, в которых эффективность критична.

Уважаемый Дракула, я постарше Вас, IQ давно не проверял, но в 40 был не хуже Вашего (вообще то, в любой книге написано, что результаты свыше 140 точно недостоверны и нет особого смысла этим бравировать). По моему, оба участника диалога несколько вышли за рамки приличия, и это не свидетельствует в их пользу. Тем не менее, хотя я на знаю IQ Александреску, и не уверен, что он достигал таких высот (это был все тот же сарказм) в языке С++ он понимает побольше меня, (насчет Вас не знаю, если класс Loki Вы можете создать самостоятельно, то не больше) и к его рекомендациям я прислушиваюсь, потому что они выглядят логично.
И он настоятельно рекомендует писать просто, чтобы смысл решения был предельно понятен, а если мы при этом еще и эффективность можем повысить, то я не вижу смысла цепляться за оператор % - это непонятный (для начинающего) и неэффективный (в данном случае) оператор.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

% - это непонятный (для начинающего) и неэффективный (в данном случае) оператор.

Чойта?  

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

zilk пишет:

Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...

я изготовляю по два работающих прототипа ежедневно до начала изучения языка. О_О

GarryC
Offline
Зарегистрирован: 08.08.2016

Вас смутила первая или вторая часть утверждения ?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Чо, холивар?

https://vk.com/popkorn_na_dom

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

GarryC пишет:

Вас смутила первая или вторая часть утверждения ?

меня смущает, что я не могу по диагонали выявить причину подрыва пуканов.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

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

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

DetSimen пишет:

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

это повод для срача?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

да, быстрее выполнить сравнение и вычитание, 

В данном МК и "не на степень двойки" - да, верно. Но в общем случае - это весьма спорное утверждение.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ну, если на степень двойки, то, естесственно, быстрее сделать простейший AND.  Я говорю в общем.  

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Подброшу-ка на вентиллятор ...

Имеется переменная n типа int. задача: если она 0, то оставить в покое. Если не 0, то сделать 1.

Два решения

№1

if (n != 0) n = 1;
// Версию if (n) n = 1; отметаем, из заботы о новичках (и с какого хрена?)

№2 (типа, новичку непонятное)

n = !!n;

И как тут насчёт кошерности?

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

n = n>0 ? 1 : 0; 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ворота пишет:

И как тут насчёт кошерности?

«наиболее важный критерий кошерности, это чешуя»

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

n = n>0 ? 1 : 0; 

Неверное решение - n имеет право быть отрицательным.

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

ну хорошо 

n = n ? 1 : 0;

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так лучше, но для кошерности всё равно чешуя нужна :)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

так, оно точно так будет выглядеть для процессора после компилляции?

или, что бы не наваял, то полюбому оптимизируется?

GarryC
Offline
Зарегистрирован: 08.08.2016

По поводу наброса - все уже разжевано и не один раз, но можно и повторить.
Насчет оптимизации - не все однозначно, но при -о2 и выше сгенерированный код будет одинаков и для (n) и для (n!=0), хотя последний вариант мне нравится больше.
Второй ваш вариант с !!n - это вещь, за которую надо выгонять из профессии, поскольку его результат не однозначен, сильно зависит от компилятора, в любой книге Вы найдете его как пример вычурности и снобизма, а про его эффективность лучше промолчать.
А вот тернарный оператор тут, хотя и допустим, но явно излишен, поскольку 1) правила MISRA его вообще запрещают 2) он мне не нравится еще больше, чем (n).

Возвращаясь к % - даже, "если степень двойки", но число знаковое - будет менее эффективно, чем для вычитания.
И я не очень понимаю, почему выражение if(n=Max+1) n=0 сложночитаемо. ТО, что в нем много букв - да, но смысл предельно ясен.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GarryC пишет:

правила MISRA его вообще запрещают

Аргумент хорош :))) Но тогда уж будьте последовательны

GarryC пишет:

не очень понимаю, почему выражение if(n=Max+1) n=0 сложночитаемо. ТО, что в нем много букв - да, но смысл предельно ясен.

Разве првила MISRA не запрещают такие выражения? (Rule 13.1 (required) по версии 2004 года)

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

GarryC пишет:

По поводу наброса -

Увидел три аргумента:

1. MISRA
2. Мне не нравится (или нравтится)
3. эффективность

Кратко прокомментирую  все три:

1. Ты член MISRA? Я - нет. И какого чего меня колышат их правила? Они, например и union'оны с goto запретили - каждый по своему с ума сходит.

2. Это твоя проблема - всем нам что-то нравится - кому арбуз, а кому поросячий хвостик.

3. Бездоказательно. В целом там если и есть разница в эффективности, то настолько копеечная, что говорить не о чем.

GarryC
Offline
Зарегистрирован: 08.08.2016

Конечно, запрещают, Вы абсолютно правы, просто в комментариях проверка отключена, следует читать if (n==(Max+1)) n=0;
Вот к каким обидным ошибкам приводит привычка к работе в хорошей среде программирования, которая тебе на них указывает.

GarryC
Offline
Зарегистрирован: 08.08.2016

Отдельно ответим :

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

1. Я не могу быть членом MISRA в силу того, что не являюся производителем автомобильной техники, насколько мне известно, индивидуальное членство там не предусмотрено, хотя я был бы польщен, сочти они меня достойным такой чести.
Конечно, Вы можете продолжать использовать все, что угодно, в том числе !!n, это Ваше право, правила MISRA предназначены для обычных людей и коллективов, которым свойственно ошибаться (как я сделал в предыдущем комментарии с (n=Max+1)), а не для полубогов от программирования, к которым Вы, несомненно, относитесь.
Единственно кого жалко, так это Ваших клиентов, но не думаю, чтобы у Вас их было много.

2. Разумеется, это моя проблема и, надеюсь, никто не оспаривает МОЕ право давать те комментарии, которые Я посчитаю нужными.

3. Сайт godbolt.org все еще на месте, любой желающий может посмотреть код в разных вариантах и увидеть доказательства.
И Вы определитесь для себя, есть ли разница в эффективности, или ее нет - я ничего не говорил о размере этой разницы и Вы, предварив свои слова репликой "бездоказательно", в следующей фразе соглашаетесь, что разница есть - налицо опереденное противоречие, не находите? А если разница есть и предлагаемый метод не уступает в понятности написания (на мой взгляд, он понятнее, чем %, но см. замечание 2), то нет никаких оснований для того, чтобы его не применить. Ну конечно, нет разумных оснований, неразумные я не рассматриваю, это область психологии, в которой я не силен.
 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мужики, кончайте холиварить на ровном месте. Нравится - не нравится развели тут. Да и с эффективностью - задолбали уже эти подсчёты тактов. Дешевле, чем "n = (bool)n;" вы эту задачу один хрен не решите. Правда такое решение Камасутра MISRA запрещает (и почему мне на это плевать?), а Мисру обижать нельзя - привлекут за оскорбление чувств верующих!.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Господа, едрёна вошь, а у вас тут весело!

ГарриС! Вы забавны, но очень нудны. Нужна своя фишка.

Вот я, например, кроме занудства еще и хамло. Это привносит элемент свежести, если позволите.

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

---------------------

Если без демагогии, то либо Вы понимаете, что МИСРА - воспаленный бред идиотов, помешанных на переносимости кода и независимости от архитектуры. Либо считаете, что для контроллера можно эффективно писать, соблюдая МИСРу, тогда ... ну что тогда? Держитесь там, счастья Вам, здоровья.

GarryC
Offline
Зарегистрирован: 08.08.2016

Легко проверить наши предположения, для чего пишем код и смотрим на результаты компиляции для avr
volatile char t;
t=!!t;
if (t!=0) t=1;
t=(bool)t;

        ldd r25,Y+1
        ldi r24,lo8(1)
        tst r25
        brne .L2
        ldi r24,lo8(0)
.L2:
        std Y+1,r24          ; t=!!t    5/6 команд
       
        ldd r24,Y+1
        tst r24
        breq .L3
        ldi r24,lo8(1)
        std Y+1,r24
.L3:
        ldd r25,Y+1          ; if (t!=0) t=1;  3/5 команд
       
        ldi r24,lo8(1)
        tst r25
        brne .L4
        ldi r24,lo8(0)
.L4:
        std Y+1,r24          ; t=(bool)t;    4/5 команд

И видим, что самый длинный с точки зрения написания вариант (то есть тот, за который я агитирую) - самый быстрый, потому что он делает именно то, что надо и ничего сверх того.

Ну и напоследок - почему MISRA против приведения - то, что вы видите выше - это C++, если мы определим перечислимый тип bool в языке C, (typedef enum {false=0, true=1} bool;) то последнее выражение превращается просто в 

        ldd r24,Y+1
        std Y+1,r24

Я соглачен, что это самый быстрый вариант, но, Евгений, Вы уверены, что он правильный  и решает поставленную задачу?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

мне это вот это напоминает

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну знаете, Дракула, мне казалось, что в диалоге важнее содержание, а не форма, хотя у Вас, похоже, другое мнение.

А по поводу MISRA - я его бредом не считаю, стараюсь его правила соблюдать и при этом вполне себе пишу код для микроконтроллеров. Не знаю почему, но у меня это вполне получается - что я делаю не так?
динственное, в чем я позволяю себе отклонения - комментарии с //.

Давайте любой фрагмент кода в Вашем стиле и он может быть легко переписан в стиле MISRA без потери эффективности, за исключением тех случаев, когда Вы примените union для перевода из char в int - да, в этом случае правильный код будет несколько медленнее при совпадении порядка байтов в пакете и в процессоре, и в данном случае это плата за переносимость, что легко обходится макросами.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

GarryC пишет:
Евгений, Вы уверены, ...

Что Вы, что Вы, Господь с Вами – я не участвую в холиваре, наоборот предлагаю его прекратить, пример был дан «по ходу» и никому ничего доказывать и объяснять я не буду.

Я достаточно толерантен, и мне совершенно всё равно являетесь ли Вы адептом культа MISRA, членом секты Святого Вирта, или ещё кем-нибудь – я точно знаю, что качество программ, которые человек пишет, зависит не от этого. Я не покушаюсь на Вашу Веру и совершенно не собираюсь обращать Вас в свою.

Раньше я ввязывался в холивары, когда кто-то нападал на мою Веру, но сейчас, после прочтения Э. Овечкина, я и это перестал делать. Просто, когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.

прямой в челюсть? :)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

А я красивый, молодой, зовут Олегою

И никаво я не боюсь, я быстро бегаю. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

ЕвгенийП пишет:

когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.

прямой в челюсть? :)

Нет, зачем?

Метод описан в рассказе «Мичман Тоня» и звучит так: «Я вообще человек неконфликтный и всегда предпочитаю послать человека на хуй, а не заниматься с ним моральным противостоянием». По-моему - идеальное поведение для предотвращения холиваров (моральных противостояний).

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Просто, когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.

Женя! Я - моложе и, вероятно, менее уравновешен.

Поэтому поззволю себе немного похоливарить еще.

=====================================================

Для ГарриС:

Вот тестовый код для остатка и вычитания.

void setup() 
  {
  Serial.begin(57600);
  while (!Serial);// ждем пока сериал стартует, это нужно на Леонардо
  randomSeed(analogRead(0));
  pinMode (13,OUTPUT);
  }

void loop() 
  {
  static uint32_t om = millis();
  uint32_t nm = millis();
  static byte f = 0;
  static int steps = 0;
  int i,j,k;

  if (steps < 10000)
    {
    i = random(10);
    j = random(10);
    steps++;
    k = i+j;
    k = k%10;  //комментируем либо тут
    //if (k >= 10) k = k - 10; //либо тут
    if (k > 3) digitalWrite(13, f = 1-f); //что-то сделать с результатом, чтобы обмануть оптимизатор
    }
  else
    {
      Serial.println(nm-om);
      steps = 0;
      om = millis();
    }
  }

Результат на Леонарде. У меня для издевательств есть боевой Леонардо от "Амперки".

остаток:

время 2045 мс, размер кода: 5096/170.

вычитание:

время 1910 мс, размер кода: 5018/170 .

Разница 136 мс, что составляет 7% по времени исполнения и 78 байт = 1.5% по размеру кода.

--

Это при минимальной возможной полезной нагрузке на код, всего один оператор.

-------

Пример иллюстрирует то, что Вы, ГарриС, по моему мнению, рассматриваете "сферического коня в вакууме".

В реальной программе есть и пейлоад и окружение. Даже код, который Вы генерите на godbolt.org не соответствует тому, что будет порождено в среде. Например потому, что вся математика уже заранее в коде, если мы применяем среду Ардуино.

--------------

Ну да ладно, как говорится: "Каждый дрочит, как он хочет!".