Перейти к содержанию
    

Как вы работаете с регистрами GPIOx_AFR?

2 часа назад, KnightIgor сказал:

У меня такой вопрос "back to roots": в чём глубинный смысл { ... } while (0) вместо просто { ... } ? У меня и второй вариант всегда работал...

Смысла никакого. Смысл есть в: #define ... do {...} while (0)

А ваше разве вообще компилится без ошибок?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/20/2015 at 11:53 AM, GenaSPB said:

Или так...

 

 

        #define arm_stm32f30x_hardware_pio_altfn(gpio, opins, afn) \
            { \
                const portholder_t lo = power4((opins) >> 0); \
                const portholder_t hi = power4((opins) >> 8); \
                (gpio)->AFR [0] = ((gpio)->AFR [0] & ~ (lo * 0x0f)) | (lo * (afn)); \
                (gpio)->AFR [1] = ((gpio)->AFR [1] & ~ (hi * 0x0f)) | (hi * (afn)); \
            } while (0)
 

 

pio.zip 11.78 kB · 18 downloads

Кстати do пропущено в цитате...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/1/2022 at 12:42 PM, aaarrr said:

 

Так не будет работать:

#define f() { ... }

if (cond)
	f();
else
	...

Ой... Синтаксически if(cond) и одним оператором до else (если есть) БЕЗ {} будет компилиться и даже правильно работать, но с таким синтаксисом по дресс-коду в порядочные дома не пускают. Страстно везде рекомендуется облачиться в скобки:

 

if (cond)

{

}

else

{

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 10/1/2022 at 2:34 PM, jcxz said:

Смысла никакого. Смысл есть в: #define ... do {...} while (0)

А ваше разве вообще компилится без ошибок?

А почему бы и нет? Более того, облачив кусок кода в скобки, можно в C объявить локальные переменные. Нынешние С, в отличие о старых стандартов, позволяют смешивать объявление переменных и код по ходу текста, но меня учили, что это плохой тон, и я делаю сначала объявление переменных/констант, а потом уже операторы, однако внутренние локальные переменные тоже в этом стиле допустимы, если объявление находится внутри "локальных" {}:

4 minutes ago, aaarrr said:

Где?

Это такие "basics", что я даже не вспомню и не смогу для вас привести ссылки на литературу для начинающий в программировании.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, KnightIgor said:

меня учили, что это плохой тон

Это хороший тон. Понадобилась переменная, создал её и сразу присвоил значение. Не все компиляторы могут отслеживать использование переменной, которой не было присвоено значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, aaarrr said:

не сомневался

Все, что работает - допустимо. Мы говорим о стиле.

Есть определенные договоренности по синтаксису.

https://www.mikrocontroller.net/wikifiles/b/b3/CodeStyleConventions_ID_Software.pdf

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

Использование скобок даже для одного оператора после if (cond) обусловлено тем, чтобы избегать ошибок невнимательности при расширении кода. Например, у вас есть конструкция

if (cond)

   func(1);

и вам надо в процессе развития кода под if () вставить еще несколько операторов, то вы, очевидно, должны написать

if (cond)

{

   func1();

   func2();

}

Однако практика работы показывает, что делаются ошибки такого рода:

if (cond)

   func1();

   func2();

 

Как бы вы ни были внимательны и круты (как вы захотите о себе утверждать), такого рода залеты случаются сплошь и рядом (люди - не роботы). Поэтому, как мера безопасности, в сообществе программистов выработан стиль, помогающий уменьшить вероятность таких ошибок типа "copy paste" и "add stuff". В данном случае - скобки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, aaarrr said:

Вы не понимаете, о чем я. Синтаксически нет необходимости в скобках после if с одним оператором. Речь о развивающемся коде! Я ловил такие ошибки у коллег. Есть такое понятие "глаза замыливаются": вы просто не видите свой код, а коллега бросает взгляд через ваше плечо и тыкает пальцем. Вы что, программер - одиночка, не работали в коллективе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очередной пророк скобкопоклонничества с вычитанными где-то выводами на основе средней температуры по больнице.....  :negative:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 minutes ago, jcxz said:

Очередной пророк скобкопоклонничества с вычитанными где-то выводами на основе средней температуры по больнице.....  :negative:

Каждый волен делать свои ошибки сам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...