Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
А я вас покажу принципиальную слабость использования do{}while(0). А если бы без ненужной обертки do{}while(0) - запросто.
Отправлено
VasilyS
(80.92.96.25)
04 января 2010, г. 12:18
В ответ на:
Берется всего одна пара скобочек.... >>
отправлено
VasilyS
04 января 2010, г. 12:12
#define something() do { P1OUT = 123; if( i==3 ) \
break; P2OUT = 234;} while(0)
void Test(){
uint8_t i;
something();
for( i = 0; i < 5; ++i)
{
something(); // хочу break из for! ХЕР!
if(P1IN & 1)
{
something(); // опять хочу break из for! ХЕР!
}
else printf("test");
}/*for*/
}
Составить ответ
|
Вернуться на конференцию
Ответы
тут даже две ошибки
-
Запрещенные_символы
(04.01.2010, 12:46:49
91.135.22.160
, 223 байт)
Дядя Петя, вы... что? Я не Ваш пример разжевываю, а показываю на своем примере слабость do-while(0) при выходе из цикла for!. Уберите нафик этот приблудный внецикловый вызов :-)
-
VasilyS
(04.01.2010, 12:51:44
80.92.96.25
,
пустое
)
А про локальную переменную - ну не будем о пустяках! Это НЕ ИЛЛЮСТРАЦИЯ СЛАБОСТИ while(0), а мллюстрация моей лени редактировать весь ваш пример. Cчитайте переменную глобальной...
-
VasilyS
(04.01.2010, 12:54:14
80.92.96.25
,
пустое
)
Вы меняете условия задачи под свое решение
-
Запрещенные_символы
(04.01.2010, 13:05:38
91.135.22.160
, 608 байт)
Опять чуш... Я дал вам НОВЫЙ пример (не связанный в -общем-то с вашим кодом, просто он оказался удобен) ПРИНЦИПИАЛЬНОЙ слабости макро-решения do{}while(0)...
-
VasilyS
(04.01.2010, 13:07:52
80.92.96.25
,
пустое
)
И постотрите на прошлой странице: я просил дать пример "трудной или невозможной" замены вайла(0). А здесь - лехко!
-
VasilyS
(04.01.2010, 13:10:54
80.92.96.25
,
пустое
)
Перелопатить весь исходник - ЛЕГКО? Ну тогда продолжайте упорствовать в своем заблуждении.
-
Запрещенные_символы
(04.01.2010, 13:19:16
91.135.22.160
, 301 байт)
Все с вами ясно :-) Надумаете следующий "неразрешимый" макрос без do-while(0) пример - пишите, обещаю признать свое бессилие. Подход тот же: только с помощью {}, и без заведомого увеличения кода.
-
VasilyS
(04.01.2010, 14:42:53
80.92.96.25
,
пустое
)
_Ясно_ все с вами. Вы просили пример, я вам его дал. Вместо изменения макроса вы изменили текст...{+}(+)
-
Запрещенные_символы
(04.01.2010, 15:50:31
91.135.22.160
, 546 байт)
Ваш пример работает и без do{...}while(0), только {...} достаточно. Давайте другой пример, мне тоже интересно
-
koyodza
(04.01.2010, 17:10:4
93.73.215.120
,
пустое
)
Ну, если это не только нам с Доком интересно, то для Вас специальный рецепт: проверьте экстремальный вариант без do, без while(0), даже без {}, >>
-
VasilyS
(04.01.2010, 20:05:38
80.92.96.25
, 757 байт)
Ты сам-то понял, что написал?
-
Запрещенные_символы
(05.01.2010, 12:39:38
91.135.22.160
, 469 байт)
это кто тут Док?
-
koyodza
(04.01.2010, 20:52:15
93.73.215.120
, 59 байт)
Я ж вроде ясно в посте выразился... Дока ассоциирую с "запрещенными символами". А Вас просил проверить пример, который Доку хотел на погоны дать...
-
VasilyS
(04.01.2010, 21:03:6
80.92.96.25
,
пустое
)
Проверьте еще раз.
-
Запрещенные_символы
(04.01.2010, 17:25:4
91.135.22.160
, 133 байт)
Проверено - мин нет :-))
-
VasilyS
(04.01.2010, 18:53:16
80.92.96.25
,
пустое
)
Проверяйте еще раз. Специально, для прикидывающихся валенком:
-
Запрещенные_символы
(04.01.2010, 19:09:13
91.135.22.160
, 255 байт)
да, в таком виде не работает. Но такая простая конструкция нормально работает через запятую, без фигурных скобок
-
koyodza
(04.01.2010, 20:10:41
93.73.215.120
,
пустое
)
Проверьте пример чyть повыше, после вашего поста. Оч. интepесен рнзультат :-)
-
VasilyS
(04.01.2010, 20:15:59
80.92.96.25
,
пустое
)
Скобочьки мои не забываем, да? Зачем опять на грабли наступать?
-
VasilyS
(04.01.2010, 19:15:12
80.92.96.25
,
пустое
)
Кто обещал измерение макроса? Не надо ляля.. Я обещал с помощью {} и без лишнего кода избавиться от проклятия while(0).
-
VasilyS
(04.01.2010, 16:49:17
80.92.96.25
,
пустое
)
Ваши скобки в коде - уже дополнительный код.
-
Запрещенные_символы
(04.01.2010, 17:23:42
91.135.22.160
,
пустое
)
Смешно... Тогда и while(0) - это оверкод :-)
-
VasilyS
(04.01.2010, 18:51:39
80.92.96.25
,
пустое
)
do {} while(0) пишется в одном месте, а не по всей программе.
-
Запрещенные_символы
(04.01.2010, 19:11:23
91.135.22.160
,
пустое
)
Это уж как получится... По мне главное - что я за базар ответил: только с помощью {} и без увеличения кода. Этот пример - в архив. Просим с вас более "невыполнимый". Награда - научу вас if(x<y){a=b; c=d; } без {} сделать :-))
-
VasilyS
(04.01.2010, 19:23:21
80.92.96.25
,
пустое
)
Гы... не "Вас" покажу, а "Вам" :-)
-
VasilyS
(04.01.2010, 12:21:30
80.92.96.25
,
пустое
)
И еще: если ваш компилятор позволяет (как ИАР например), не пишите вы макросы в функциональном виде со скопками (). Надо же дать понять чтоб читающий различал (он же не знает какими префиксами вы выделяете макросы) - это не вызов функции, а макрос.
-
VasilyS
(04.01.2010, 12:32:55
80.92.96.25
,
пустое
)
макросы в функциональном виде позволяет препроцессор
-
Запрещенные_символы
(04.01.2010, 12:58:10
91.135.22.160
, 277 байт)
Нуну :-) И именно для этого макро-подстановки в литературе предлагается как-то выделять префиксами-суффиксами-подчеркиваниями - только чтобы как-то ненавязчиво отличать их от вызовов функций.... #define __PI 3.14
-
VasilyS
(04.01.2010, 13:04:54
80.92.96.25
,
пустое
)
Не мешайте в кучу определения констант и функциональные макросы
-
Запрещенные_символы
(04.01.2010, 13:11:10
91.135.22.160
, 354 байт)
Гы.... :-) Здесь просто замена... Тоже мне функциональный макрос.
-
VasilyS
(04.01.2010, 13:13:45
80.92.96.25
,
пустое
)
И вайл(0) - тоже просто макроподстановка... Учите матчасть настоящим образом.
-
VasilyS
(04.01.2010, 13:14:50
80.92.96.25
,
пустое
)
Какой именно раздел матчасти порекомендуете изучить?
-
Запрещенные_символы
(04.01.2010, 13:23:41
91.135.22.160
,
пустое
)
Может быть этот - "Function-like Macros"? На что конкретно посоветуете обратить внима...{+}
-
Запрещенные_символы
(04.01.2010, 13:25:48
91.135.22.160
, 191 байт,
ссылка
)
Это интересно для дилетантов. Читайте лучше об отличиях макро от функций, о побочных эффектах, о недостаточности проверок аргументов, читайте чужие программы, которые "вроде бы" работают, но глючат из-за корявых подстановок, научитесь, наконец, применять метод эмпатии при программировании. Успехов!
-
VasilyS
(04.01.2010, 15:14:53
80.92.96.25
,
пустое
)
Как говорят в таких случаях "слив защитан". Конкретных ошибок указать не смогли, наго...{+}
-
Запрещенные_символы
(04.01.2010, 15:26:8
91.135.22.160
, 214 байт)
А ваши ошибки - я их исправил. Компилер ни гугу, код не вырос, прога работает. ЧТД!
-
VasilyS
(04.01.2010, 20:25:58
80.92.96.25
,
пустое
)
однозначно - слив.
-
POV
(04.01.2010, 20:06:45
91.203.67.154
,
пустое
)
Чей, ваш?
-
VasilyS
(04.01.2010, 20:23:25
80.92.96.25
,
пустое
)
Я сделал замену do-while(0), как и обещал, только с помощью {}, и без дополнительного кода. А остальное - слова.
-
VasilyS
(04.01.2010, 15:39:7
80.92.96.25
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 90:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru