Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Дайте пожалуйста удачный пример использования Assertов  (Прочитано 12267 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 09-01-2008 17:42 » 

Всем привет!
Дайте пожалуйста удачный пример использования Assertов. А то чтото ничего умного придумать не могу  Не надо
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 09-01-2008 18:50 » 

USBLexus, если речь про VC++ , - это глюпость (при чём - вообще только в дебаге) , лично я никогда даже не задумывался над их применением ))
Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-01-2008 19:41 » 

На моей памяти весьма пригодились 1 раз на проекте, когда другой разработчик поставил их в недореализованных методах на серверной стороне, которые тихо компилялись и никем не вызывались, пока я клиентскую сторону для данного функционала не написал. Когда работа моего компонента стала приводить к вызову этого кода, сразу стало ясно, где заглушка и что нужно доделать Улыбаюсь Хотя всё то же самое можно было бы сделать через механизм исключений, в принципе. Но и это лучше, чем вляпать код возврата типа NOT_IMPLEMENTED (или, что хуже, какой-нибудь ОК) или просто копи-пастом вставить из похожих методов рабочий код и забыть об этом напрочь (а бывали и такие случаи в практике:) ).

Другой случай, который видел и на который обращал внимание - в opensource-овом видеокодеке t264 (реализация стандарта H.264), код на С. Там ассерты нужны были для проверки корректности компрессии-декомпрессии видеопотока: как только кодек переходит в какое-то не такое состояние - ассерт. Пригодились, когда кодек подвергся экспериментам по настройке, выбрасыванию лишних деталей и оптимизации оставшихся Улыбаюсь

Ещё много где встречались, но в основном с одной целью - для проверки в режиме отладки передаваемых в функцию параметров. Это не исключало саму проверку в коде, а дополняло её.
« Последнее редактирование: 09-01-2008 19:43 от Вад » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 09-01-2008 22:24 » 

господа, извините, а что такое ASSERT?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 09-01-2008 22:50 » 

Если я правильно понял с вышесказанных ответов. Это макрос в С/С++, аргумент которого является булевое выражение. Программа завершится если выражение оказывается ложным, при этом выводится сообшение на консоль ошибок с указанием исходного файла и номера строки, а также текста выражения, приведшего к ошибке. В gcc можно скомпилировать проект, так чтобы макрос уничтожался на этапе препроцессора, поэтому не рекомендуется делать выражение, делаюшее косвенные действия. Например вызов функций, присваивание и тому подобное.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 09-01-2008 23:00 » 

Верно. В assert.h от Microsoft для релизных сборок вообще этот макрос объявлен так:
Код:
#ifdef  NDEBUG
#define assert(exp)     ((void)0)
#else
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 10-01-2008 10:59 » 

ASSERT нужен и помогает только для отладки. На самом деле программа не завершается, а ПРИостанавливается. Всегда есть возможность выбрать игнор и продолжить. Конечно программер несёт ответственность за последствия. В примере ниже программа будет работать дальше как ни в чём не бывало.

Плюсы - указывается строка кода где произошла остановка.

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

Для обозначения ветвлений, если для них пока никаких действий не предусмотрено.

if(bFound)
{
      ...
}
else
{
      ASSERT(FALSE);
}

Ну и вобще "столблю" таким образом иногда TODO. Действует надёжней, чем TODO в коментах. Ага


зы Лёш, если ты не знаешь с чем это едят - ещё не значит, что это несъедобно.  Ага
« Последнее редактирование: 10-01-2008 11:02 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 18-01-2008 14:55 » 

Мда, не густо...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 18-01-2008 18:44 » 

USBLexus, А что ты ожидал?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 19-01-2008 12:20 » 

Вить, я тоже самое подумал - слово в слово, только не написал. Улыбаюсь)
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #10 : 22-01-2008 13:09 » 

Просто я полтора года ими пользовался они мне очень здорово помогали как средства отладки но давно это было и сейчас когда я решил их внедрить на другой проект не могу объяснить народу их полезность, решил пример использования найти классный чтобы глянул и человек и сразу понял какая это все таки клевая вещь
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 22-01-2008 14:38 » 

Самый большой плюс, это то что они работают только при отладке (дебуге), а для релиза ничего отключать не надо.

Ну а польза очевидна. Например проверка условия для "опасного" участка. Если это не сделать, вылет может произойти где угодно и потратишь кучу времени пока найдёшь, что же именно не так. ASSERT  сразу покажет тебе с точностью до номера строки - где надо искать.

Это же используется с большим успехом в бета-версиях, когда тест-пользователи получают дебуг-версию.
Они видят только что прога вылетела, а больше ничего не могут сказать. А так скидывают инфу из окошка (имя файла, номер строки) и сразу знаешь где искать.

Ну и ещё плюс, что именно вылета из проги не происходит - всегда можно проигнорировать и продолжить.

Так им и передай. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #12 : 22-01-2008 17:06 » new

Ok Джон, спасибо!) Обязательно передам Да-да
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines