Официальный сайт компании Arduino по адресу arduino.cc
как передать volatile + значение по умолчанию?
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 22/04/2019 - 15:43
приветсвую .
обозначяю ссылку на порт как volatile. как по науке. а потом хочу её передать через одну-другую функцию. и каждый раз пока while сравнивает порт, он должен по моей задумке сравнивать реальное текущее значение порта а не статичное , устаревшее, не соответсвующее реальности значение. вот поэтому и pass-by-reference.
&port = 1; единица нужна как дефолтное стартовое значение для подстраховки и в случае если передача порта опущена при вызове soft_reset
но компилятор ругается. помогите исправить ошибку
#include <avr/wdt.h> volatile uint8_t &portd = PIND; //interrupts port const uint8_t pinint0 = 1 << INT0; //pin INT0 void soft_reset(const uint8_t wdt_prescale, const uint8_t &port = 1, const uint8_t pin = 1){ wdt_enable(wdt_prescale); while(port & pin); wdt_disable(); } void isPIRHigh(const uint8_t &port, const uint8_t pin){ soft_reset(WDTO_8S, ~port, pin); //finish when PD0 high } void isPIRLow(const uint8_t &port, const uint8_t pin){ soft_reset(WDTO_8S, port, pin); //finish when PD0 low } void isPIRAlive(){ isPIRHigh(portd, pinint0); isPIRLow(portd, pinint0); } void setup(){isPIRAlive();}
вв
если передаю так
ругается что нет const, если пишу с const ругается на volatile
А Вы точно себе представляете, что делаете в 6, 13 и 17 строках?
в голове да. а строгом Си я может орфаграфически/синтактически это неправильно написал.
13. вызываю функцию и передаю ей значение: реальное текущее состояние порта. и номер ноги. логически проще не куда. синтакситески вроде тоже правильно написал или нет ?
6. принимаю значение (wdt_prescale, реальное текущее значение порта, статичное значение ноги)
далее работаю с ними. опять же логически правильно синтаксис хромает раз ошибка при компиляции
Хорошо - то, что Вы пытаетесь что-то впихнуть в константу, это полбеды, но Вы передаете состояние порта, а принимаете указатель на порт. И что компилятор должен Вам на это ответить?
" Вы передаете состояние порта" - я передаю указатель на порт. пытаюсь во всяком случае. т.к. мне в while надо проверить реальное текуще (на момент проверки) состояние порта, которе прямо в момент while может и должно измениться, именно это я и проверяю. если я передам старое-стаичное значение порта оно может не соответсвовать реальному-текущему. плюс внутри while оно уже никогда не обновиться
я понял в каждом объявление аргумента функции надо дать понять что это ссылка (как на указатель например)
получается достаточно указать стр 3 что это ссылка и потом просто передавать как обычную переменную ? даже если передаем многократно через посредников (промежуточные функции) то смысл "референсности" при этом не теряется разве ?
Что-то мне сдаётся, что это чистейший героин: uint8_t &port = 1
https://stackoverflow.com/questions/1059630/default-value-to-a-parameter-while-passing-by-reference-in-c
as an example
я передаю указатель на порт
Нет, Вы передаёте состояние. Если хотите передавать указатель, так и передавайте его. Вам уж написали пример.
Только вот нафига Вам это надо?
как я понял вся беда в дефолтном значении.. и надо как то красиво а) его сохранить. б) изменить объявление/декларирование функции чтобы не потерять пункт а)
сори указатель = ссылка. &port я передаю имелось ввиду
как я понял вся беда в дефолтном значении.. и надо как то красиво а) его сохранить. б) изменить объявление/декларирование функции чтобы не потерять пункт а)
Мне повторить ссылку? Ок: https://stackoverflow.com/questions/1059630/default-value-to-a-parameter-while-passing-by-reference-in-c
const надо поправить на volatile.. помимо этого я понял у меня 2 ошибки
первая дефолтное значение или глобальной переменной что не хотелось бы, или func overload вроде красивее но чем больше аргументов тем более громоздко это становиться
DIYMan а так могу ?
и остается вторая проблема, говорят я не могу передать ~port передать как const volatile
указатель = ссылка.
Это Вам кажется. что "указатель == ссылка", на самом деле это совершенно разные вещи.
Дак ты ж выбрать должен, или const или volatile. Или вапще mutable.
Ну, а чо, const с volatile вполне совместимы
Да. Вполне может быть. Чоэтоя.
Евгений я опечатался. везде там где я говорил указатель, замените на ссылку. вот что значит указатель = ссылка. ане то что они равны.
я везде говорю про &port ссылку.
так что с такой реализайцией ? имеет право на жизнт ? вроде как и const и volatile и дефолтное значение в одном флаконе
кстати Евгений ЕМНИП я гдето читал *value == const &value таки равны по смыслу как раз. но утверждать не буду вам виднее.
кстати Евгений ЕМНИП я гдето читал *value == const &value таки равны по смыслу как раз. но утверждать не буду вам виднее.
Это где это вы прочитали такое ? Значение ячейки и ее адрес равны !? Оно конечно может быть, но "по смыслу" - никада.
Евгений я опечатался. везде там где я говорил указатель, замените на ссылку. вот что значит указатель = ссылка. ане то что они равны.
Тогда я вооще не понимаю, Вы вообще читаете, что Вам пишут? Вот, девушка Вам привела работающий пример в посте #8- Вы видели?
А если видели, что там нужен указатель, чего к ссылке прицепились?
пост 8 смотрим
как мне эта информация поможет ? или я не вижу чтото? она не делает тоже самое что моя isPIRHigh
господа и дамы так можно присвоить дефолтное значение const volatile аргументу ?
Dear sir, ЕвгенийП, Thank you!
Have a good mood for the whole day!
best regards sincerely!
пост 8 смотрим
Не знаю, где Вы это увидели. В посте №8 пример программы для Вас.
господа и дамы так можно присвоить дефолтное значение const volatile аргументу ?
Знаете, ответ такой - для Вас - никак. Ну, не доросли Вы ещё до таких конструкций. Вам покажи, Вы потом завалите вопросами, что не так работает.
Хорошо, я могу Вам показать, только для начала хочу убедиться, что Вы понимаете, что спрашиваете.
Итак, const означает, что значение никогда не изменяется, а volatile - означает, что оно может измениться в самый неожиданный момент. Вопрос к Вам: как Вы понимаете const volatile - как такое может быть, где применятется, приведите пример. Если я увижу, что Вы понимаете, что это такое, я покажу Вам как с этим работать.
Евгений, я не профи это да но вы утрируете на мой счёт уж слижком
а) пост 8 мы имеем (отбросив чешую)
что нам даст инверсия пина , т.е. 0&0 ? и даже когда в порту будет high, что нам даст 1&0? и посмотрите моя isPIRHigh что делаете. ровно противоположное. плюс у девушки указатель. я хочу решить задачку используя ссылку. и я не думаю что это нельзя сделать с помощью ссылок. и я даже сделал это через перезагрузку функции используя ссылки. но опять же для практики/понимания сути/набития шишек хочу разобраться с этим куском кода
а точнее с этой строкой, как заменитель присвоения дефолтного значения аргумента функции прямо в объявлении функции. просто в других языках такое работает. как можно сделать аналог на С++?
б) const volatile - я не понимаю. а целенаправленно делаю защиту от случайно записи. и хоть запись я нигде не делаю в коде. но для привычки / набития руки. а вообще при чем тут const volatile. я могу убрать const. всеравно не компилиться конструкция когда я дефолтные значения присваиваю через проверку NULL а вызываю функцию без аргументов soft_reset() . компилятору не нравиться что нет аргументов.
Евгений, я не профи это да но вы утрируете на мой счёт уж слижком
а) пост 8 мы имеем (отбросив чешую)
что нам даст инверсия пина , т.е. 0&0 ?
Ну, вот ни грамма не утрирую. Вы 1) не умеете читать и 2) не понимаете кодов.
В посте 8 функция называется PinPORTLow - она сбрасывает в ноль нужные пины порта! Именно для этого там инверсия в сочетании с &
Если Вам надо устанавливать в 1 или просто тупо писать в порт весь байт, то меняется одна строчка (та самая в которой инверсия).
port &= ~_BV( pin );
как Вы изволили выразиться, а
*port &= ~_BV( pin );
если Вы считаете звёздочку "шелухой", которую можно отбросить, то Вам просто рано ещё делать такие вещи. Используйте имя порта и пишите в него чего Вам надо.
б) const volatile - я не понимаю. ..... а вообще при чем тут const volatile
Так вот и я не понимаю
при чем тут const volatile
Просто Вы написали
Это Вы написали? Или русские хакеры Ваш экаунт взломали?
Вот я и решил проверить, Вы вообще понимаете, о чём спрашиваете? Судя по всему - нет.
Вы попробуйте спросить о чём-то, что Вы понимаете. Может и остальные тогда Ваш вопрос понять смогут.
....
она не делает тоже самое что моя isPIRHigh
она выполняет установка низкий сигнал в указан контакт пин и указан порт с помощью указатель на порт. Вы, не имеете запись в PINx исключение чтение. сказать иначе, volatile переммена сказала - don't touch me without permission, compiler.
strarbit говорите плиз по english а то я вас не понимаю по русски
Евгений звездочку я не считаю шелухой но в дано конкретном разборе она ни тепло ни мягко. толи я присвое значение порту. толи переменной. важна суть какое _значение_. и тут у нас две вещи
1) а зачем мне устанавливать пин в 0? теперь то я понял что я пишу одно а вы говорите другое. я думал вы читаете что я пишу. поэтому то у меня и не получилось натянуть присовение нуля в мой while :) я то искрене верил вы знаете что мне советуете и пытаетесь посоветовать запись нуля вместо while.
а ведь еще в 6 строчка 22 поста я вас спросил зачем мне этот ноль. но вы меня както выборочно читаете.
2) я ничего не присваю а делую проверку! только проверку в while, 8 стр первого поста.
B) Евгений вы получаете наслаждение от тролинга ? я нет. может поговорим как люди а не как компиляторы. для этого попробуйте понимать меня а не только читать. мне не трудно объяснить вам много раз если потребуется.
еще раз - наличие или отсутвие const применительно к volatile переменной _абсолютно_ не влияет на суть проблемы которую я пытаюсь решить. вам легче понимать код когда там const ? ок я его туда поставлю и давайте дальше разбираться с вопросом. вам легче понимать код без const? ок я его уберу и давайте дальше разбираться с вопросом.
так нормально ? можем перейти к вопросу ? или остались еще какието неясности ?
можем перейти к вопросу ? или остались еще какието неясности ?
Думаю, не дорос ты до взрослых еще
я и не соревнуюсь.
но в 16 строчке всетаки инверсия не смотря на то что взрослые говорят что нет - http://arduino.ru/forum/programmirovanie/vnutrennie-preryvaniya#comment-444653
повторюсь еще раз, в других языках вот эта вот конструкция , полностью работоспособная
или эта
в С, первая конструкция не всегда но применима (на что я и напоролся в первом посте)
а вторая вообще у меня не получается, ругается что не аргументов когда делаю вызов soft_reset()
возможно в С реализовать вторую конструкцию?
Есть два варианта развития событий:
1) Вы переходите на другие языки программирования;
2) Принимаете правила игры языка Си.
может поговорим как люди
Вы в чём-нибудь специалист? Попробуйте представить себе человека, который начинает что-то говорить про Вашу область с использованием (не к месту) слов из Вашей области и при этом несёт чистый как
слезасрецтво от Ded Simen бред. Ну, вот совсем чистый - рафинированный. И при этом он не понимает, что он несёт бред и уверен, что попытками задавать наводящие вопросы Вы его троллите.Вот, допустим, что Вы автослесарь, а пришёл к Вам и выдал: «у меня тут карбюратор свечу зажевал и от этого дворники распредвал не центрируют – скрипит что-то, дергается, а радиатор как стоял на блокировке дифференциала, так и стоит пока в магнитоле давление развала на сход не пойдёт». И на любые Ваши попытки как-то привести разговор в норму, следует обиженный ответ: «не тролльте меня, давайте говорить как люди».
Можете мне не верить, но Вы говорите о программировании именно так, как в примере с автослесарем.
Ну, вот скажите. О чём можно «говорить как люди», с человеком, который пишет:
в дано конкретном разборе она (звёздочка) ни тепло ни мягко. толи я присвое значение порту. толи переменной. важна суть какое _значение_.
Ну, это же поэма! Это в граните отливать надо! Ну, ведь, действительно, какая разница, зарплату получите Вы или её кассиры завернут в бумажку с написанным Вашим именем и заберут себе? Никакой разницы ведь!
1) а зачем мне устанавливать пин в 0?
Вам дали пример как передать порт в качестве параметра. Понимаете, пример как передать порт в качестве параметра. А уж что с ним делать, читать, записывать туда нули или единицы – это Ваше дело. Человек пишет туда нули. Вы можете делать то, что Вам нужно. Вам показали, как он передаётся. Вам это непонятно?
поэтому то у меня и не получилось натянуть присовение нуля в мой while :) я то искрене верил вы знаете что мне советуете и пытаетесь посоветовать запись нуля вместо while.
Ну, это опять поэзия, в которой я не понимаю ни одного слова.
попробуйте понимать меня
Да, уж испробовался весь. Собираюсь сдаться. Слабо мне :(
еще раз - наличие или отсутвие const применительно к volatile переменной _абсолютно_ не влияет на суть проблемы которую я пытаюсь решить.
А нахрена Вы его туда приплели?
вам легче понимать код когда там const ? … вам легче понимать код без const?
Мне одинаково трудно. Вернее, даже не трудно, а я просто не понимаю Вашей проблемы.
Возможно, я бы понял, если бы Вы попытались объяснить её, не используя слов, смысла и значения которых Вы не понимаете (const, while, volatile и т.п.). Вы используете эти слова не к месту, и текст становится абсолютно непонятным.
остались еще какието неясности ?
Не просто остались, а ничуть не уменьшились – одна сплошная непонятка.
....
она не делает тоже самое что моя isPIRHigh
она выполняет установка низкий сигнал в указан контакт пин и указан порт с помощью указатель на порт. Вы, не имеете запись в PINx исключение чтение. сказать иначе, volatile переммена сказала - don't touch me without permission, compiler.
Интересно, а Ваш родной язык какой?
Тайский. С красивыми буквами.
Хоть что-то понял, слава Богу
в С, первая конструкция не всегда но применима
Никогда это не применимо в С - там вообще нет параметров по умолчанию. (Вы часом не считаете. что Си и Си++ - это одно и то же?)
возможно в С реализовать вторую конструкцию?
Конечно, а почему нет-то? Если использовать правильный синтаксис. Почитайте какую-нибудь книжку по Си, такие примеры есть практически в любой.
Нууу... Я так больше не буду. ¦(
Нельзя нести мае срецтво в массы.
Хоть оно и чистое, как мой бред :-)
Я тоже подумываю о том, чтобы сдаться.
Прости, дида - я его просто как эталон чистоты использовал :)
пусть будет тайский.
Евгений оно конечно понятно что местами может быть смешно до упада. Но раз я решил помочь от буду проще изъесняться и уж темболее слушать внимательно чтобы понять что я понял то что я понял а не то что показалось. ну ладно это риторика. давайте по вашим пунктам
когда нам надо убедиться кто её получит это важно. когда нам надо понять что начислается к зп . просто цифра. результат. чтобы понять мы вообще правильно её посчитали. то можем хоть кассиру начислить. тем более что изначально в задачи никто ничего не присваивал.... хоть бы намекнули что это просто пример передачи. хотя я просто "передачу" и так в своем коде по десять раз в каждой строчке делаю. скажу больше если все в поинтеры переписать из первого поста оно сразу сработает. я это знал до форума. но сюда пришёл с реферами. вы почему то решили что мне нужны поинтеры.
опять поэзия потому что я пришел с одним вопросом а вы меня учите как передавать ссылки.
я как слесарь если знаю что цвет дворника не влияет на шум подшипника шатуна то и не буду спрашивать а нахрена вы красные поставили. но тем не менее я ответил вам на вопрос этот. и вы увидели что понимаю я правильно. но выдераете из контекста слова другие над которыми вам легче потролить. да ради бога трольте. но хоть бы при этом проблемма реашалась.
в других языках это валидная конструкция
возможно нечто подобное организовать на С/с++ ?
куда еще проще?
вы говорите второую можно. ну вот я пол дня назад показал
а оно не работает
По моему за теоретическими рассуждениями потерялась сама суть вопроса, а она в следующем - ТС боится в своей ОГРОМНОЙ программе просмотреть дефолтное обращение к подпрограмме. Мне смешно - не знаю как Вам.
Уважаемый ТС - из букв ОПЖА нельзя составить слово ВЕЧНОСТЬ, ну никак. Поучите как создаются и определяются классы, посмотрите примеры - одной-двумя строками программы тут не отделаешься. Надо учится...
ну вот я пол дня назад показал ...
... а оно не работает
Полистал тему, проникся.
alexbmd, простите, но я с вас удивляюсь.
Вы этот кусок кода показали уже раз пять наверно - а он всё не работает, да.
Может пора уже что-то поменять? Вы не пробовали эту функцию уменьшать в размерах? То есть выбрасывать из неё строчки, по очереди, все, которые не имеют отношения к вашему вопросу.
Оставьте минимальную, с одним параметром, функцию. Заодно напишите, как вы пытаетесь её вызывать. Напишите какую ошибку выдаёт компилятор. И попытайтесь объяснить, словами, что вас в этой ситуации не устраивает, и чего бы вам хотелось.
В двух строчках разобраться проще, чем в двадцати. В первую очередь вам самому.
И вам сразу помогут, если конечно оно вам надо. Потому что тема, вообще-то, изначально похожа на средней толщины троллинг, если честно. ))
О! это надо в анналы занести!
Указатель это совсем не то, что переменная. Поэтому разница большая. Вот представь что у почтальона есть бумажка с адресом. Когда присваешь заначение указателю со звездочкой это команда почтальону занести значение по адресу записанному на бумажке . Записывать в указатель без звездочки - это переписывать адрес. Если вместо нормального адреса указать ерунду, то вся почта может зависнуть.
Справедливости ради хочу поддержать алекса в использовании const volatile. Это вполне нормальный случай когда мы хотим читать read only (в нашем процессе) shared memory или регистр.
Справедливости ради хочу поддержать алекса в использовании const volatile. Это вполне нормальный случай когда мы хотим читать read only (в нашем процессе) shared memory или регистр.
вы говорите второую можно. ну вот я пол дня назад показал
а оно не работает
Я говорю???? Вы меня с кем-то спутали. Я говорил следующее
Конечно, а почему нет-то? Если использовать правильный синтаксис. Почитайте какую-нибудь книжку по Си, такие примеры есть практически в любой.
Т.е. В взяли первую фразу, и плюнули на всё остальное!
1. Я говорил не о том бреде, который Вы написали, а о том, что это можно написать правильно.
2. Я Вам посоветовал прочитать книгу по языку и получить наконец хоть какие-то систематические знания, а не обрывки из форумов и отдельных статей. Вы это сделали? Нет!
Вот если бы Вы Вы это сделали, то Вам было бы можно писать функции с произвольным числом аргументов и проверять их (аргуметнов) наличие на лету. А сейчас Вам нельзя! Ответ на Ваш вопрос "можно это или нельзя" именно таков - Вам нельзя!
Занете в чём Ваша беда, Вы не читаете, что Вам пишут, а если читаете, то не делаете, что говорят (вот, книгу не прочитали). А вместо этого кидаетесь учить людей, как Вам помогать. Бесполезно, я уже говорил Вам. С тем уровнем знаний, который у Вас есть, помочь Вам невозможно. Вы не понимаете, что я Вам говорю, Вы не понимаете что Вам удаётся прочитать где-то ещё (и "ловите на противоречиях", как в #30). Помочь Вам с такими знаниями нельзя. Можно или сделать за Вас (и то трудно, т.к. Вы даже объяснить что Вам нужно толком не можете), или устраивать здесь филиал учебного заведения и перепечатывать Вам тут учебники целиком.
Прочитайте нормальную книку по языку программирования, это лучшее, что Вам можно посоветовать. А пока Вы этого не сделаете - ничего не будет.
Я только попросил ТС пояснить как он это понимает, ..., к сожалению - никак не понимает.
т.е. мой ответ
показал вам что ни как не понимает? ну ну
а оно не работает
----
Я говорю???? Вы меня с кем-то спутали.
да вы
Евгений это вы меня постоянно ловите на опечатках и вырываете слова из контекста. потому столько ненужного трёпа вместо разбора конкретных ошибок и предложений по исправлению. может хватит , вам не надоело?
я только и делаю что читаю книжку по Си. и как смог написал пример. знаете в чём у меня ошибка в коде - так можете просто показать пример в одну строчку или объяснить почему именно в этом ошибка да на худой конец просто указать где ошибка. а не вместо указания ошибки по ссылке направлять меня использовать поинтеры. и я пойду дальше читать в этом направление книги и исправлять код. но вектор задайте! :) а кидаться лепёхами в мой огород - сомнительный подход к обучению\помощи человеку.
аптамуш, ты хочешь странного.
Я перечитал уйму книг по С++, и ни разу нигде мне не понадобилось const volatile (я даж не знаю чо это, и как работает)
DetSimen там без конст ровно таже ошибка, т.е. ошибка не в конст :) и всё оно там (в конст волатиле тобишь) просто и понятно работает :)
в то время как Евгений кидается в меня лепехами, используя ссылки и перезагрузку я частично решил вопрос. но вот по прежнему не понятно как "писать функции с произвольным числом аргументов и проверять их (аргуметнов) наличие на лету" простой пример можно ? А то в книжках не нашел
пусть будет тайский.
alex, ваш как я понимаю, .md?