Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
Нафиг в цикл заключать. Ума не приложу.
Отправлено
ZoltriX
(78.40.231.89)
03 января 2010, г. 20:30
Зачем такая запись
do
{
LED1 = LED_OFF; IO_DIR_PORT_PIN(1, 0, IO_OUT); P1SEL &= ~0x01;
}
while (0)
Почему просто нельзя
LED1 = LED_OFF; IO_DIR_PORT_PIN(1, 0, IO_OUT); P1SEL &= ~0x01;
Составить ответ
|
Вернуться на конференцию
Ответы
Такую конструкцию do { } while(0) можно в #define препроцессора запихнуть, а с "прямыми" вариантом при этом могут возникнуть нюансы. Обсуждалось неоднократно.
-
rezident
(03.01.2010, 22:29:49
77.43.130.155
,
пустое
)
Разве есть что-то, что нельзя запихнуть в define используя просто { }, и чтобы эта трудность преодолевалась введением цикла? Где это обсуждалось?
-
VasilyS
(03.01.2010, 23:07:8
80.92.96.25
,
пустое
)
А как вы в #define запихнете несколько операторов в один цикл, кроме как обертки из еще одного цикла do {} while? Где именно обсуждалось не помню. Варианты: 1) здесь же, 2) на caxapa.ru, 3) на electronix.ru.
-
rezident
(03.01.2010, 23:17:46
77.43.130.155
,
пустое
)
Насчет обёртки цикла, ей-Бо, не понял. Опишите поконкретнее примерчик пожалуйста.
-
VasilyS
(03.01.2010, 23:22:53
80.92.96.25
,
пустое
)
Имею в виду обертку для дефайна. Пример, придуманный от балды
-
rezident
(04.01.2010, 00:31:47
77.43.130.155
, 674 байт)
Второй вариант вы имели в виду #define LEDOUT(var,bit) { if ((var&bit)==0) P1OUT&=~0x01; else P1OUT|=0x01; }. Обо всем этом я упоминал и варианты решений без while(0) давал. Ошибки не будет, если >>
-
VasilyS
(04.01.2010, 00:58:14
80.92.96.25
, 239 байт)
Дело не совсем в IF и скобках. Макроc может и как безусловный оператор использоваться. Обертка do { } while(0) позволяет использовать его в любом варианте, невзирая на ленность кодера и его стиль программирования ;)
-
rezident
(04.01.2010, 01:07:48
77.43.130.155
,
пустое
)
Причем сама обертка не влияет на размер кода, т.к. оптимизируется (выкидывается) на этапе компиляции.
-
rezident
(04.01.2010, 01:08:44
77.43.130.155
,
пустое
)
Тогда возвращаемся: Приведите пожалуйста пример, где "проблемно" или "невозможно" при написании или подстановке макроса обойтись без do{}while(0), а я утверждаю что сделаю его посредством {}, которые кода тоже не потребляют :-) Можно и на следующей странице продолжить.
-
VasilyS
(04.01.2010, 10:09:38
80.92.96.25
,
пустое
)
Скорее всего ты прав. Иногда программисты любят извращённый стиль, отсюда и do ... while (0)
-
ZoltriX
(04.01.2010, 11:23:24
78.40.231.89
,
пустое
)
Пардон! во втором варианте ; в конце дефайна забыл убрать. Но ошибка не из-за нее возникает. else without if что-то типа такого.
-
rezident
(04.01.2010, 00:33:1
77.43.130.155
,
пустое
)
Так и есть. Спасибо.
-
ZoltriX
(03.01.2010, 22:47:29
78.40.231.89
,
пустое
)
Рудимент :) Возможно, когда-то, там был цикл, но в процессе эволюции программы...
-
F8
(03.01.2010, 22:26:23
95.132.81.73
,
пустое
)
Это элементарно :-) Вот там найдешь поиском текста "while(0)"
-
VasilyS
(03.01.2010, 21:38:58
80.92.96.25
,
пустое
,
ссылка
)
Но все это, брателло, херня. Мне параноику не влом даже в самых простых if'ах ставить скопки: if{}ese{}. Это помогает когда приходится дописывать действия, это поможет избавится и от необходимости тупого while(0).
-
VasilyS
(03.01.2010, 23:14:0
80.92.96.25
,
пустое
)
А кто так сделал? Иногда ненужные циклы пишут ради возможности break вместо goto.
-
Леонид Иванович
(03.01.2010, 20:34:2
87.252.227.56
,
пустое
)
Ответ:
-
JH
(03.01.2010, 21:12:12
94.180.4.173
,
пустое
,
ссылка
)
Если это в #define, тогда понятно. Но у автора в вопросе такого не было.
-
Леонид Иванович
(03.01.2010, 22:34:42
87.252.227.56
,
пустое
)
Наверное, чтобы после препроцессора красиво(понятно) смотрелось
-
JH
(03.01.2010, 21:19:8
94.180.4.173
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
увеличьте 2 вдвое:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru