на мой взгляд это неправильное выражение , т.к после применения маски , по идее справа остаются 0 , а это не то , что мне нужно , но часто такое выражение встречал в форуме в скетче, и причем на него никто не обращал внимания. Поэтому и спросил
почему мое выражение которое правильное - трешь , а вот на это которое неправильное ИМХО( ну или я что-то не понял в нем) никто не обращает внимания…
ТАк в чем же все таки трешь у меня … вроде я все правильно написал ,?
Пиз-ец, Вы знаете, что ОНО неправильно и лезете с ЭТИМ к народу. Извращение.
А почитать? Подумать? Не Ваш метод?
Хорошо , объясните пожалуйста почему мое выражение считается трешем? оставим в покое чужое , то отдельнаея тема… меня интересует , то что я написал … что там не так ?и как тогда ?
Прошу прощения, я перепепутал отрицание и НЕ … я решил , что это одно и тоже … оказывается разное…
if (~PINA & (1<<6))
это должно быть if (!PINA & (1<<6)
) с отрицанием работает . но все равно непонятно чем !(PINA & (1<<6))
лучше !(PINA >> 6) & 1)
или , что имеется ввиду под трешем
Нет, это уже какой-то зашквар!
Значит, слушайте внимательно. Вы ОЧЕНЬ много болтаете и ни хера не делаете.!
Давайте, Вы не будете НИЧЕГО здесь отвечать пока не:
- попробуете это выражение в маленьком примере;
- убедитесь в том, что здесь написан бред сивой кобылы
- разберётесь, что не так
и только после этого ответите постом в котором объясните почему здесь написан бред и как надо.
Только в этом случае я готов ответить на Ваш другой вопрос, про другое выражение. Учить же чему-то того, кто НИ ХЕРА не делает сам а только спорит до хрипоты, о том в чём ни бельмесы - увольте, я не буду.
И да, вставляйте код нормально. Вот так if (!PINA & (1<<6))
, а не так, как у Вас. На неправильно вставленный код ответов от меня не будет никаких. Замечаний уже сделано много, больше их делать нет смысла. Просто не будет ответов.
я попробовал…
!(PINA & (1<<6))
вот так конечно работает , извините в первой части предложения проглядел ошибку, отрицание ко всему выражению надо.!PINA действительно ерунда
Может быть тем, что первое синтаксически правильно, а во втором не соблюдён баланс скобок?
вставка фрагментов кода!
не ругайтесь … просмотрел закрепленный раздел не нашел как вставлять именно фрагмент , там только про 3 апострофа… решил , что это иммели ввиду… ошибся…(протанопия ) посмотрел содержание Вашего сообщения как у Вас сделано - исправил …
Итишкин кот!!! Да точно так же три апострофа перед и три апострофа после. И точно так же апострофы должны быть отдельными строками.
А если это неподъёмная задача, воспользуйтесь кнопкой </>. Вот ведь проблема-то, прямо двух высших образований требует
я и делал 3 апострофа а он вставляет как обычный код - за это и поругали…
if (t=0)
а понял надо так
if (t=0)
Рома! До тебя просто докопались.
Отправляй всех запускать пример.
void setup() {
Serial.begin(115200);
uint16_t a;
// put your setup code here, to run once:
for (a = 0; a < 256; a++) {
if ( (!(a & (1 << 6))) != (!((a >> 6) & 1)) )
{
Serial.println("Oopsss..");
break;
}
}
if (a == 256)
Serial.println("Я прав! Идите в жопу!");
Serial.println("Dixi");
}
void loop() {
// put your main code here, to run repeatedly:
}
это, как уже сказал Влад - ничем.
Проблема была в том, что три раза до этого вы делали ошибки в выражениях. Соответственно эта строчка уже очень далека от той, за которую на вас наехали.
Вы, похоже, считаете что это “просто опечатки и не влияют на суть”. Нет, опечатки. это когда вы пишете “копьютер” вместо “компьютер”. А когда вы путаете знаки или скобки в выражениях С - это грубые ошибки, каждая из которых вам может стоить неделю отладки в крупном проекте.
romansochi
Что в AVR подразумевается под PINA ???
У Меги есть порт А
Вот именно что это порт и его значение будет известно только на момент выполнения.
Потом это значение надо крутнуть вправо 6 раз и это при отсутствии в системе команд сдвига на произвольное число бит. И только потом уже наложится маска.
А что у нас есть 1<<6 - это константа времени компиляции. Следовательно просто считается значение порта и наложится маска.
Я только в этом смысле ужаснулся …
Да, это ценное замечание. Насчет оптимизации я редко вперед задумываюсь.
Тогда да, выражения неравноценны. Но с точки зрения языка оба корректны.
вспомнилось про “…но есть нюанс…”
Обратите внимание, в каждом Вашем посте выражение написано неправильно. То, Вы скобки не там поставите, то баланс не соблюдёте. Такая небрежность записи несовместима с программированием. Вы очень торопитесь что-нибудь сказать и от своей торопливости пишете бред.
Наконец, по поводу двух выражений.
Я Вам не говорил, что это плохо, и мне неоткуда знать, что имел в виду тот, кто говорил. Я лишь выскажу своё предположение о том, что он мог иметь в виду.
С точки зрения общей логики, а также любого современного компилятора, эти два выражения идентичны. (хотя, давайте, заменим «любого» на «всех известных мне», чтобы не говорить «за всю Одессу»). А вот, с точки зрения программиста - нет, правое режет глаз и вызывает неприятие.
Почему?
Обратите внимание на внутренние скобки - выделено жёлтым фоном.
В левом выражении, содержимое внутренних скобок - константа, которая, очевидно, будет вычислена компилятором и в код пойдёт уже готовое значение 0x40
.
А вот в правом выражении в скобках находится не константа и компилятор не имеет никакой возможности вычислить выражение в скобках заранее и подставить в код готовое значение. Поэтому «на вид» выглядит так, что компилятор может оставить вычисление этого значения на время выполнения (т.е. сгенерирует код, который прочитает регистр и начнёт его реально сдвигать). На самом деле, он этого не сделает, т.к. достаточно «умный» - он сам преобразует правое выражение к левому и скомпилирует именно левое. Но, повторяю, «на вид» это выглядит ужасно и режет глаз любому профессионалу.
Это как если бы Вы моряку расстояние в километрах написали. Правильное, но в километрах - ему бы это резануло по глазам.
Спасибо…
Спасибо
постараюсь исправиться:)
В Общем решил посмотреть , что же на самом деле компилятор пихает в мой код , все как Вы сказали…Тут вопросов нет, вопрос в другом…
почему компилятор делает такую простыню кода , когда можно обойтись 3 командами для того , чтобы проверить пин ? (если не брать команды работы со стеком и команды возврата данных).
Зачем такие сложности ?
Код использовал один и тот -же , чтобы сравнить , так что на неиспользуемые переменные внимания не обращайте…
Спойлер
#include <avr/io.h>
int t = 0;
int main(void) {
DDRA = 0x00;
PORTA |= 1 << 6;
Serial.begin(9600);
while (1) {
t = f();
Serial.println(t);
}
}
int f() {
int a = 0, b = 0;
b = !(PINA & (1 << 6));
return b;
}
код компилятора , который определяет пин занимает с 021A-238
и мой код , который делает абсолютно тоже самое (проверенно в ATMEL STUDIO и PROTEUS) , правда в ардуино среде (и VS miсro тоже) единицу не возращает , всегда 0, но возможно я где-то, чего-то не поставил в настройках…
3 команды 18.19.20 причем 20 постольку поскольку он даже не нужен
Спойлер
#include <avr/io.h>
int t=0;
int main(void)
{
DDRA=0x00;
PORTA |= 1<<6;
Serial.begin(9600);
while (1)
{
t= f();
Serial.println(t);
}
}
int f() {
int a = 0, b=0;
asm volatile (
"sbis 0x00,0x6\n\t"
"ldi %0,0x1\n\t"
"nop\n\t"
: "=r"(b)
: "r"(a)
);
return b;
}
Этот текст будет скрыт
P/S извините , что дизассемблированный листинг скрином, не нашел как сохранить или выделить …