Работа с циклами
- Войдите на сайт для отправки комментариев
Чт, 17/08/2017 - 14:33
Здравствуйте!
Подскажите начинающему по вопросу создания циклов, "сдвинутых по фазе", если так можно выразиться.
Существует ли в языке такая возможность, чтобы создать 2 цикла, когда в одном параметр изменяется, например, от 0 до 9, т.е. 0,1,2,3,4,5,6,7,8,9, а в другом цикле параметр изменяется начиная с 5, т.е. 5,6,7,8,9,0,1,2,3,4. Задача состоит в том, чтобы синхронно делать две выборки элементов одного массива со "сдвигом по фазе". Если имеется некое стандартное решение такого случая, просьба направить в нужную сторону, или же кратко объяснить.
Спасибо!
Ну, если синхронно, то Вам не нужны два цикла. Вам нужен один цикл с индексом от 0 до 9 и внутри него перемнная, которой присвается (i+5)%10 - вот и всё.
Ну, если синхронно, то Вам не нужны два цикла. Вам нужен один цикл с индексом от 0 до 9 и внутри него перемнная, которой присвается (i+5)%10 - вот и всё.
Спасибо за ответ!
Где почитать про расшифровку "(i+5)%10" ? Я изучаю язык 3-й день....
PS. Каждая из двух выборок присваивается своей переменной.
Все таки лучше будет (я не люблю %) что то вроде
j=i+5; if (j>9) j=j-10;
тогда при i=0 j=5 ... i=5 j=0 ... i=9 j=5 - то, что Вам и надо.
PS. Каждая из двух выборок присваивается своей переменной.
а не важно, сколько переменных. Главное - поймите базовый принцип. Если один индекс всегда сдвинут по отношению к другому на 5 значений - значит вам не нужно два отдельных цикла. вычисляйте второй индекс из первого, сдвигая его на пять. Именно такой сдвиг на пять делает тот оператор, которого вы не поняли.
Где почитать про расшифровку "(i+5)%10" ? Я изучаю язык 3-й день....
Вы не знаете, что означает "+"? Или "%"?
Почитайте в любой книге по С. Например, у Кернигана и Ритчи.
Все таки лучше будет (я не люблю %) что то вроде
j=i+5; if (j>9) j=j-10;
тогда при i=0 j=5 ... i=5 j=0 ... i=9 j=5 - то, что Вам и надо.
Большое спасибо, очень помогли!
Всё работает, легко получается, например, многофазный синус в виде ШИМ-а в 20-ти строках.
Первое предложение не проверял, т.к. пока не понял его смысла...
Евгений, не в обиду Вам, все таки принимайте в расчет 2 обстоятельства:
1. Не все на этом форуме знают С достаточно хорошо, это неприятно, но это факт, который мы с Вами не можем изменить.
(Конкретно я знаю, как работает оператор взятия отстатка от деления %, поэтому его и не люблю. Посмотрите код, им порождаемый, особенно для знакового числа, и Вы поймете причину этого чувства).
2. Следуя заветам "Гуру недели", нам надлежит в программе писать именно то, что нам нужно, а нам в данном конкретном случае нужно именно провернуть второй индекс и вариант с явным исправлением предпочтительнее, поскольку яснее отражает суть операции, но это ИМХО.
Я как раз закончил пост на Хабре по поводу кольцевого буфера, где пытаюсь обосновать именно такую точку зрения.
Кстати, вопрос к Вам, Евгений, как старожилу данного сайта, на Хабре у меня немало постов по основам программирования вообще и Ардуино в частности, может, есть смысл их сюда сбросить, или ссылки сделать, там есть небезинтересные моменты ?
Кстати, вопрос к Вам, Евгений, как старожилу данного сайта, на Хабре у меня немало постов по основам программирования вообще и Ардуино в частности, может, есть смысл их сюда сбросить, или ссылки сделать, там есть небезинтересные моменты ?
не знаю как посты, а ссылки точно не помешают.
Я вмешаюсь.
ГарриС! Если вы обратите внимание, то заметите, что и Евгений и я прекрасно понимаем, что сюда лезут люди не знающие С.
Я сам, и, как я понимаю, ЕвгенийП, приводим, в меру сил, воспитательную политику. Вместо того, чтобы давать готовые ответы, направить новичка на изучение программирования, чтобы избежать вопросов типа "что значит x%y?". Человек не способный найти ответ самостоятельно не стоит усилий по помощи. Тут не благотворительная организация.
Вы не боитесь стать похожим на Квона? Помогая откровенным неучам.
----
да, и отдельно про "взятие по модулю". Такты и память экономят не бессознательно, по привычке, а только тогда, когда это нужно.
Читаемость кода с модулем (%) - для любого человека, знающего основы математики, - на порядок выше. Умение пользоваться этим инсрументом - бесценно.
То есть, по моему мнению, новичек должен сперва научиться пользоваться приемом от ЕвгенияП, а уж потом, осознанно, если нуждается в экономии памяти и/или тактов, применять ваш вариант.
-----
Еще раз, поскольку это важно.
Вначале нужно создавать правильный код, красивый и масштабируемый. А потом можно его портить, заменяя % на вычитание.
Здесь есть люди, которые считают, что в эмбеде можно поступать иначе - и куча глобалов, и сравнение с вычитанием, если уж в камне нет деления. Считаю этот подход не верным. Сначала програмирование - потом оптимизация.
В иной области (не програмирование) мой старый наставник учил: "Ты всегда старайся сделать хорошо, плохо - оно само получится".
Евгений, не в обиду Вам
Да, Бог с Вами, какие обиды, я что гимзаистка, что ли?
принимайте в расчет ... Не все на этом форуме знают С
Как раз принимаю, и стараюсь по мере сил это исправлять.
Про остальное, простите нет настроения на мировозренческие дискуссии сейчас. Тут у меня в кабинете Климов сидит и болтаем про предстоящую конференцию, так что мне есть чем заняться ...
Кстати, в том посте я всех желающих приглашал. Интересно, кто-нибудь приедет? Связывайтесь там со мною, если чего.
А материалы, конечно давайте. И даже не думайте о том, что у меня или у кого-то ещё может быть другое мнение - собственно, у думающих людей всегда разные мнения, это нормально.
Ну даже и не знаю - это я Дракуле (правильно?) перечитываю прямо сейчас Александреску
- 9*) избегайте преждевременной оптимизации - вроде аргумент в Вашу пользу и тут же
- 10*) избегайте пессимизации - аргумент в мою.
Вот и встает вопрос : вычитание вместо % - это оптимизация, либо % вместо вычитания - это пессимизация?
GarryC, туфта это ваша оптимизация, пессимизация. Вы не учитываете важное. Программист пишет исходник. И от размеров исходника к размерам получаемого кода отношения никакого не имеют. Так как исходник компилируется в код компилятором. А вот как компилятор скомпилирует один он знает. Идем дальше . В некоторых участках программы код должен быть быстрым, в некоторых короткий, а в некоторых ,прости господи,похеру. Так как если в программе и выполнится то и не больше одного раза и то в исключительных случаях.
Я вмешаюсь.
ГарриС! Если вы обратите внимание, то заметите, что и Евгений и я прекрасно понимаем, что сюда лезут люди не знающие С.
Я сам, и, как я понимаю, ЕвгенийП, приводим, в меру сил, воспитательную политику. Вместо того, чтобы давать готовые ответы, направить новичка на изучение программирования, чтобы избежать вопросов типа "что значит x%y?". Человек не способный найти ответ самостоятельно не стоит усилий по помощи. Тут не благотворительная организация.
Вы, уважаемый, наверное что-то попутали и, как Вы сами говорите, "лезете" не в свою тему. Здесь нет необходимости выкладывать свое кредо программиста - здесь требовался простой ответ на простой вопрос от человека, 3 дня изучавшего язык, каковой и был получен благодаря уважаемому GarryC.
Если Вы не поняли, повторю еще раз, медленно - у меня несколько иная специальность, причем не менее сложная, чем программирование, да и морали я читаю возможно лучше Вас всяким "неспособным человекам" уже лет эдак 35... :)
Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...
Вы, уважаемый, наверное что-то попутали и, как Вы сами говорите, "лезете" не в свою тему.
1. Дурачек. Я не с тобой разговаривал. Тебя не учили в чужой разговор не встревать?
2. Первый правильный ответ был получен не от Гарри, а от Евгения.
3. Какая бы ни была специальность, образование (техническое) либо есть либо нет. Если есть, то знак % - означает "взятие по модулю" и это общеизвестно. Если тебе не известно - ты просто дурак и невежда.
4. Про меня. Вообще, входя на форум, нужно сперва разобраться кто здесь кто. Для тех кто в танке - повторю в 100500 раз:
мне 47 лет, МехМат МГУ 86-91, кафедра логики. IQ > 160, характер мерзкий. Програмирую я всю жизнь, поэтому на вопрос ответить уже не смогу. Первый проект был еще в средней школе. Естественно, мат-школе.
Поэтому ваш высер более чем смешон.
==========================================
Для ГарриС. По поводу ника. Можно Дракула или граф или просто Влад. Дракула - именно потому, что родители назвали Владиславом. Этот ник у меня везде. Я ярый противник анонимности в сети.
4. Про меня. Вообще, входя на форум, нужно сперва разобраться кто здесь кто. Для тех кто в танке - повторю в 100500 раз:
Мне плевать, кто ты такой, но все-таки обратись к психоаналитику - у тебя, как минимум, проблемы с завышенной самооценкой.
Да и сильно старшим грубить не комильфо, сынок.
Мне плевать, кто ты такой, но все-таки обратись к психоаналитику - у тебя, как минимум, проблемы с завышенной самооценкой.
Да и сильно старшим грубить не комильфо, сынок.
Родное сердце, ты папке своему советы давай, если, вдруг, мама тебя с ним познакомила, ОК?
Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...
Здесь Вы влезли не на свою территорию и говорите о том, чего не знаете. Я могу ответить на Ваш вопрос "за себя", хотите? Правда, я не просто программист - я специалист по языкам. Так вот, для того чтобы понять смысл языка, его отличия от других языков и его особенности, мне достаточно разговора в курилке за время перекура (но, не с кем попало, а с таким же специалистом, как я). Для того, чтобы начать на языке программировать (иногда заглядывая в справочник) мне достаточно получаса - часа чтения документации. Через день-два мне уже не нужен справочник, а через 3-4 дня я могу консультировать по этому языку и считаться (среди прикладных программистов) гуру в нём. Вот как-то так. Так что, как видите, для специалиста три дня - очень много. То-то же!
Правда, я не просто программист - я специалист по языкам. Так вот, для того чтобы понять смысл языка, его отличия от других языков и его особенности, мне достаточно разговора в курилке за время перекура (но, не с кем попало, а с таким же специалистом, как я).
В этом смысле я Вам, Евгений, завидую. Мой приход в програмирование случился в 80-каком-то году, когда я занял 3 е место в Московской городской олимпиаде по программированию. И получил книгу Хантера "Проектирование и конструирование компиляторов".
Что и привело меня сперва к формальным грамматикам, а потом и на кафедру логики МехМата.
Поэтому на ЛЮБОЙ язык я смотрю с точки зрения: "а как написать компилятор с этого?". Некоторые "загибы" ООП вводят меня в шок, с этой точки зрения. Когда идеи автора языка или модуля к нему требуют "в тени" и сборки мусора и хэш таблиц, и многоуровневого кэша. Поэтому я и остаюсь поклонником процедурного С "от Кернигана и Ритчи", хоть и пишу на всем, что ни попадя.
<sarcasm> Завидую людям типа qwone, все то у них просто и понятно, это всякие Александреску туфтой занимаются, а им некогда - они нетленки создают. </sarcasm>
Ну а теперь серьезно - независимо от того, сколько раз выполняется оператор, он ДОЛЖЕН быть написан, в том числе с точки зрения эффективности, правильно. Это не для того, чтобы сэкономить 2 такта, а потому, что хороший программист даже маленькую программу напишет правильно, просто потому, ЧТО ПО ДРУГОМУ НЕ УМЕЕТ. А вот так себе программист, научившись на простеньких программах не думать вообще, так же будет поступать и с проектами, в которых эффективность критична.
Уважаемый Дракула, я постарше Вас, IQ давно не проверял, но в 40 был не хуже Вашего (вообще то, в любой книге написано, что результаты свыше 140 точно недостоверны и нет особого смысла этим бравировать). По моему, оба участника диалога несколько вышли за рамки приличия, и это не свидетельствует в их пользу. Тем не менее, хотя я на знаю IQ Александреску, и не уверен, что он достигал таких высот (это был все тот же сарказм) в языке С++ он понимает побольше меня, (насчет Вас не знаю, если класс Loki Вы можете создать самостоятельно, то не больше) и к его рекомендациям я прислушиваюсь, потому что они выглядят логично.
И он настоятельно рекомендует писать просто, чтобы смысл решения был предельно понятен, а если мы при этом еще и эффективность можем повысить, то я не вижу смысла цепляться за оператор % - это непонятный (для начинающего) и неэффективный (в данном случае) оператор.
% - это непонятный (для начинающего) и неэффективный (в данном случае) оператор.
Чойта?
Лучше скажите - на какой день от начала изучения языка лично Вы изготовили РАБОТАЮЩИЙ прототип изделия с заданными параметрами? а? то-то же...
я изготовляю по два работающих прототипа ежедневно до начала изучения языка. О_О
Вас смутила первая или вторая часть утверждения ?
Чо, холивар?
https://vk.com/popkorn_na_dom
Вас смутила первая или вторая часть утверждения ?
меня смущает, что я не могу по диагонали выявить причину подрыва пуканов.
в любом приличном языке есть операция остаток от деления, ничего заумного в этом нет, в третьем классе это добрые люди проходят. Насчет эффективности, да, быстрее выполнить сравнение и вычитание, только некрасива это. Сложночитаемо.
в любом приличном языке есть операция остаток от деления, ничего заумного в этом нет, в третьем классе это добрые люди проходят. Насчет эффективности, да, быстрее выполнить сравнение и вычитание, только некрасива это. Сложночитаемо.
это повод для срача?
да, быстрее выполнить сравнение и вычитание,
В данном МК и "не на степень двойки" - да, верно. Но в общем случае - это весьма спорное утверждение.
Ну, если на степень двойки, то, естесственно, быстрее сделать простейший AND. Я говорю в общем.
Подброшу-ка на вентиллятор ...
Имеется переменная n типа int. задача: если она 0, то оставить в покое. Если не 0, то сделать 1.
Два решения
№1
№2 (типа, новичку непонятное)
И как тут насчёт кошерности?
n = n>0 ? 1 : 0;
И как тут насчёт кошерности?
«наиболее важный критерий кошерности, это чешуя»
n = n>0 ? 1 : 0;
Неверное решение - n имеет право быть отрицательным.
ну хорошо
n = n ? 1 : 0;
Так лучше, но для кошерности всё равно чешуя нужна :)
так, оно точно так будет выглядеть для процессора после компилляции?
или, что бы не наваял, то полюбому оптимизируется?
По поводу наброса - все уже разжевано и не один раз, но можно и повторить.
Насчет оптимизации - не все однозначно, но при -о2 и выше сгенерированный код будет одинаков и для (n) и для (n!=0), хотя последний вариант мне нравится больше.
Второй ваш вариант с !!n - это вещь, за которую надо выгонять из профессии, поскольку его результат не однозначен, сильно зависит от компилятора, в любой книге Вы найдете его как пример вычурности и снобизма, а про его эффективность лучше промолчать.
А вот тернарный оператор тут, хотя и допустим, но явно излишен, поскольку 1) правила MISRA его вообще запрещают 2) он мне не нравится еще больше, чем (n).
Возвращаясь к % - даже, "если степень двойки", но число знаковое - будет менее эффективно, чем для вычитания.
И я не очень понимаю, почему выражение if(n=Max+1) n=0 сложночитаемо. ТО, что в нем много букв - да, но смысл предельно ясен.
правила MISRA его вообще запрещают
Аргумент хорош :))) Но тогда уж будьте последовательны
не очень понимаю, почему выражение if(n=Max+1) n=0 сложночитаемо. ТО, что в нем много букв - да, но смысл предельно ясен.
Разве првила MISRA не запрещают такие выражения? (Rule 13.1 (required) по версии 2004 года)
По поводу наброса -
Увидел три аргумента:
1. MISRA
2. Мне не нравится (или нравтится)
3. эффективность
Кратко прокомментирую все три:
1. Ты член MISRA? Я - нет. И какого чего меня колышат их правила? Они, например и union'оны с goto запретили - каждый по своему с ума сходит.
2. Это твоя проблема - всем нам что-то нравится - кому арбуз, а кому поросячий хвостик.
3. Бездоказательно. В целом там если и есть разница в эффективности, то настолько копеечная, что говорить не о чем.
Конечно, запрещают, Вы абсолютно правы, просто в комментариях проверка отключена, следует читать if (n==(Max+1)) n=0;
Вот к каким обидным ошибкам приводит привычка к работе в хорошей среде программирования, которая тебе на них указывает.
Отдельно ответим :
0. Правила хорошего тона предполагают в русском языке уважительное обращение на Ва к собеседнику, иное обращение допустимо только между хорошими знакомыми, к каковым я Вас отнести не могу.
1. Я не могу быть членом MISRA в силу того, что не являюся производителем автомобильной техники, насколько мне известно, индивидуальное членство там не предусмотрено, хотя я был бы польщен, сочти они меня достойным такой чести.
Конечно, Вы можете продолжать использовать все, что угодно, в том числе !!n, это Ваше право, правила MISRA предназначены для обычных людей и коллективов, которым свойственно ошибаться (как я сделал в предыдущем комментарии с (n=Max+1)), а не для полубогов от программирования, к которым Вы, несомненно, относитесь.
Единственно кого жалко, так это Ваших клиентов, но не думаю, чтобы у Вас их было много.
2. Разумеется, это моя проблема и, надеюсь, никто не оспаривает МОЕ право давать те комментарии, которые Я посчитаю нужными.
3. Сайт godbolt.org все еще на месте, любой желающий может посмотреть код в разных вариантах и увидеть доказательства.
И Вы определитесь для себя, есть ли разница в эффективности, или ее нет - я ничего не говорил о размере этой разницы и Вы, предварив свои слова репликой "бездоказательно", в следующей фразе соглашаетесь, что разница есть - налицо опереденное противоречие, не находите? А если разница есть и предлагаемый метод не уступает в понятности написания (на мой взгляд, он понятнее, чем %, но см. замечание 2), то нет никаких оснований для того, чтобы его не применить. Ну конечно, нет разумных оснований, неразумные я не рассматриваю, это область психологии, в которой я не силен.
Мужики, кончайте холиварить на ровном месте. Нравится - не нравится развели тут. Да и с эффективностью - задолбали уже эти подсчёты тактов. Дешевле, чем "n = (bool)n;" вы эту задачу один хрен не решите. Правда такое решение
КамасутраMISRA запрещает (и почему мне на это плевать?), а Мисру обижать нельзя - привлекут за оскорбление чувств верующих!.Господа, едрёна вошь, а у вас тут весело!
ГарриС! Вы забавны, но очень нудны. Нужна своя фишка.
Вот я, например, кроме занудства еще и хамло. Это привносит элемент свежести, если позволите.
Вы же, пока что, просто очень занудны... это уже не оригинально... по крайней мере на этом форуме... но , думаю, и на других будет аналогично.
---------------------
Если без демагогии, то либо Вы понимаете, что МИСРА - воспаленный бред идиотов, помешанных на переносимости кода и независимости от архитектуры. Либо считаете, что для контроллера можно эффективно писать, соблюдая МИСРу, тогда ... ну что тогда? Держитесь там, счастья Вам, здоровья.
Легко проверить наши предположения, для чего пишем код и смотрим на результаты компиляции для avr
volatile char t;
t=!!t;
if (t!=0) t=1;
t=(bool)t;
И видим, что самый длинный с точки зрения написания вариант (то есть тот, за который я агитирую) - самый быстрый, потому что он делает именно то, что надо и ничего сверх того.
Ну и напоследок - почему MISRA против приведения - то, что вы видите выше - это C++, если мы определим перечислимый тип bool в языке C, (typedef enum {false=0, true=1} bool;) то последнее выражение превращается просто в
Я соглачен, что это самый быстрый вариант, но, Евгений, Вы уверены, что он правильный и решает поставленную задачу?
мне это вот это напоминает
Ну знаете, Дракула, мне казалось, что в диалоге важнее содержание, а не форма, хотя у Вас, похоже, другое мнение.
А по поводу MISRA - я его бредом не считаю, стараюсь его правила соблюдать и при этом вполне себе пишу код для микроконтроллеров. Не знаю почему, но у меня это вполне получается - что я делаю не так?
динственное, в чем я позволяю себе отклонения - комментарии с //.
Давайте любой фрагмент кода в Вашем стиле и он может быть легко переписан в стиле MISRA без потери эффективности, за исключением тех случаев, когда Вы примените union для перевода из char в int - да, в этом случае правильный код будет несколько медленнее при совпадении порядка байтов в пакете и в процессоре, и в данном случае это плата за переносимость, что легко обходится макросами.
Что Вы, что Вы, Господь с Вами – я не участвую в холиваре, наоборот предлагаю его прекратить, пример был дан «по ходу» и никому ничего доказывать и объяснять я не буду.
Я достаточно толерантен, и мне совершенно всё равно являетесь ли Вы адептом культа MISRA, членом секты Святого Вирта, или ещё кем-нибудь – я точно знаю, что качество программ, которые человек пишет, зависит не от этого. Я не покушаюсь на Вашу Веру и совершенно не собираюсь обращать Вас в свою.
Раньше я ввязывался в холивары, когда кто-то нападал на мою Веру, но сейчас, после прочтения Э. Овечкина, я и это перестал делать. Просто, когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.
когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.
прямой в челюсть? :)
А я красивый, молодой, зовут Олегою
И никаво я не боюсь, я быстро бегаю.
когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.
прямой в челюсть? :)
Нет, зачем?
Метод описан в рассказе «Мичман Тоня» и звучит так: «Я вообще человек неконфликтный и всегда предпочитаю послать человека на хуй, а не заниматься с ним моральным противостоянием». По-моему - идеальное поведение для предотвращения холиваров (моральных противостояний).
Просто, когда нападают, один раз объясняю свою позицию, и, если не помогло, - поступаю по методу Овечкина.
Женя! Я - моложе и, вероятно, менее уравновешен.
Поэтому поззволю себе немного похоливарить еще.
=====================================================
Для ГарриС:
Вот тестовый код для остатка и вычитания.
Результат на Леонарде. У меня для издевательств есть боевой Леонардо от "Амперки".
остаток:
время 2045 мс, размер кода: 5096/170.
вычитание:
время 1910 мс, размер кода: 5018/170 .
Разница 136 мс, что составляет 7% по времени исполнения и 78 байт = 1.5% по размеру кода.
--
Это при минимальной возможной полезной нагрузке на код, всего один оператор.
-------
Пример иллюстрирует то, что Вы, ГарриС, по моему мнению, рассматриваете "сферического коня в вакууме".
В реальной программе есть и пейлоад и окружение. Даже код, который Вы генерите на godbolt.org не соответствует тому, что будет порождено в среде. Например потому, что вся математика уже заранее в коде, если мы применяем среду Ардуино.
--------------
Ну да ладно, как говорится: "Каждый дрочит, как он хочет!".