|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||||||||||||
#define and debug_mode04.02.2016, 10:51. Показов 4553. Ответов 45
Метки нет (Все метки)
Столкнулся с необходимостью использовать при отладке довольно внушительные куски кода.
(ранее решил проблему с мелкими кусками)(смотри код)
Но теперь мне исключительно для отладки понадобилось исполнять циклы, делать вычисления и прочее И пришла в голову гениальная идея
![]() Или может есть какой нибудь лайфхак в этом стиле? Добавлено через 24 минуты Много всего перепробовал. Ответ нашелся. И всё оказалось очень просто ![]() прямо в *.cpp файле
Ну и конечно ещё раз спасибо автору статьи. https://www.cyberforum.ru/blogs/18334/blog100.html Перечитав которую ещё раз - понял это простое и правильное решение.
0
|
||||||||||||||||
| 04.02.2016, 10:51 | |
|
Ответы с готовыми решениями:
45
#define c++11 и $define C++define |
|
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
|
|
| 04.02.2016, 11:07 | |
|
0
|
|
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
| 04.02.2016, 11:24 [ТС] | |
|
Nosey, Никак нет. Это очень плохая идея.
NDEBUG определяет компилятор (это уже плохо, так как тут я уже теряю часть власти над программой) но самое страшное - что он делает это для ВСЕЙ программы. Это недопустимо. У меня программа состоит из десятка(ов) различных модулей. И в каждом есть свои дебаг код. И если я пытаюсь отладить один модуль - то мне (подобрать слово) не надо отладочные действия во всех остальных модулях. (К примеру за 1 цикл исследуемого модуля по логике программы другой модуль (давно отлаженный) срабатывает 100500 раз. И что мне будет выводится 100500 сообщений кудато?)
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 04.02.2016, 19:05 | ||||||||||||
пасти трасу функций, полностью выпиливаться из компиляции (макросы схлопываются) локально настраиваться на каждом урове стека. настраивать стратегию логгирования. например, если стек начал раскручиваться в обратную сторону, и все хорошо, тогда лог можно похерить (нафига нам информация о том, что все хорошо? вот если пофиксил варнинг, или ошибку - вот тогда он весь лог будет сливать на диск) и тд, и тп.
0
|
||||||||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||||||||||||||||||||||||
| 04.02.2016, 19:29 [ТС] | ||||||||||||||||||||||||||||
|
hoggy, непойму пост.
Например файлы : module1_debug.h
Гдето мне хватает одного файла логов, или вывода на экран, а гдето у к примеру моделируется турнир покерный на 100 игроков и 10 столов. и мне надо логи для турнира, столов, игроков и у каждого должен быть свой файл логов.
0
|
||||||||||||||||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||
| 04.02.2016, 21:32 | |||||||||
|
пример:
ну если вам так хочется - дерзайте. только тогда не понятно, зачем была создана эта тема. по хорошему, лог должен работать с "фреймами" : уметь быть активным на определенном участке кода. фреймы могут быть вложенными друг в друга, либо повторяться. на каждом уровне вложенности лог должен уметь поднастраиваться, но при этом локальные настройки не должны влиять на настройки родительских фреймов. в этом случае становится возможным контролировать трассу вызовов функций, реализовывать стратегии поведения для циклов. и вообще как угодно кастомизировать и детализировать лог. который как раз делает примерно то, что вы хотите.
0
|
|||||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|||||||||
| 04.02.2016, 22:43 [ТС] | |||||||||
|
Этот механизм родился потому что по другому не получалось. Отладочная информация - это не прихоть, потому что типа это круто и похоже на нормальный код. И типа круто когда всё подстраивается и выводит красиво. Это необходимость, без которой проект просто останавливается. Это в хело ворде можно дебагером ловить ошибки логики. Пока проект меньше 3000 строк (во всех файлах) дебагера хватало. А когда модули проекта используются в других смежных проектах... Буду благодарен за конкретный пример. Приведённый пример выглядит немного нелепо. Особенно void() через запятую. http://iproc.ru/programming/cpp-comma-operator/ Кликните здесь для просмотра всего текста
Опе*ра*ция за*пя*тая пред*на*зна*че*на для то*го, что*бы впи*хи*вать дей*ствия с по*боч*ны*ми эф*фек*та*ми в те ме*ста про*грам*мы, где ком*пи*ля*тор ожи*да*ет один опе*ра*тор. Как вы уви*ди*те да*лее, от этой воз*мож*но*сти язы*ка про*грам*ми*ро*ва*ния нет ни*ка*кой поль*зы — по*нят*ность про*грам*мы сни*жа*ет*ся, а до*пол*ни*тель*ные дей*ствия мож*но вы*пол*нить и без за*пя*тых.
так же спустя 20 мин было найдено решение (в первом посте в конце)
0
|
|||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||
| 04.02.2016, 23:07 | |||||||||||||||||||||
|
не первый день замужем. если не понятно, то можно разобрать поподробнее. выпиливается из компиляции при необходимости. можно писать многострочный код. что именно вас смущает? позволяет написать такой код:
схлопнувшись, макрос должен превратиться в пустоту. но тогда, при отключении дефайна, такой код бы поломался:
позволяют избежать требования использовать фигурные скобочки. Добавлено через 57 секунд
0
|
|||||||||||||||||||||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 04.02.2016, 23:20 | |
|
4
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 04.02.2016, 23:38 | |||||||
|
автоматом прописывает минимум две конфигурации: дебаг и релиз. чего не скажешь о невиндузятных сборках. там что пропишут, в каком нибудь мейкфайле, то и будет. само по себе деление на "дебаг" и "релиз" - штука условная. целиком и полностью зависит от фантазий программистов. часто в сборках фигурирует макрос DEBUG, и нет никаких гарантий, что там будет фигурировать NDEBUG пример: мой воркспейс в качестве базиса использует вот такие ключики:
без этих строк, в сборку под какие нибудь линуксы, никто за меня бы NDEBUG бы не добавил.
0
|
|||||||
| 04.02.2016, 23:39 | |
|
0
|
|
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||||
| 05.02.2016, 00:04 [ТС] | ||||||||
|
ну или просто оставить этот void() для no_debug_mode, и убрать его с запятой из дебага Добавлено через 5 минут
А если там 15 строчек? писать в 1 строчку в {}? и кто это читать потом будет?
0
|
||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||||||||||||||||||||
| 05.02.2016, 00:31 | |||||||||||||||||||||||||||||
|
благодаря void, можно вот так написать, например:
Добавлено через 21 минуту вы ж не пытаетесь под assert запихать 15 строчек фигни? код под макросом - опционален. он в любом случае не должен перемешиваться с основным кодом, и замыливать глаза. поэтому, по хорошему, его следует выносить в отдельные функции. исключения составляют только короткие конструкции, которые можно оформить в одну две строки. плохой код:
0
|
|||||||||||||||||||||||||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||
| 05.02.2016, 01:05 [ТС] | ||||||
|
в последнем посте поменять местами хорошо и плохо - и всё ок.
1. Дебаг - это не только ассерт. Мало того, как рас для ассерта он и не используется. когда кудато пришли не те параметры - это очень легко уловимая ошибка. Дебаг и логи служат для нахождения логических ошибок. Чтоб проследить толи делает программа. Рассмотрим подробнее плохой пример кода
Забегая вперед и предупреждая холивар. Прокомментирую свои слова про не используется для ассерта. Я имею в виду что более 95% отладочного кода - это вывод в удобочитаемой форме того, что делает программа. И лишь 5% это проверки (большинство из которых не надо, так как просто приведёт к крашу программы). А починить программу которая неработает в 100500 раз легче чем починить программу которая работает, но возможно как то не так. И эта отладочная информация ВСЕГДА НЕПОСРЕДСТВЕННО связана с предыдушим кодом. И выносить её в другой файл или начало файла - просто преступление против здравого смысла.
0
|
||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
||||||
| 05.02.2016, 01:13 [ТС] | ||||||
|
Ну и да, в хорошем коде не забываем отступы - и всё ок.
0
|
||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 05.02.2016, 01:35 | ||||||||
|
не нужно ничего пролистывать. проверка - второстепенная, опциональная деталь. в хорошем коде, программист вообще может не вникать в детали её работы. технически, можно вообще удалить весь ассерт-код, и это никак не должно влиять на бизнес-логику самой функции. собственно в этом и суть: хорошо читаемый код красноречиво отображает свою суть, не замусориваясь всякими не относящимися к этой сути второстепенными деталями. если что нибудь пойдет через жёппь, только тогда станет интересно, что произошло в проверочном коде. опять таки, хороший код услужливо подскажет суть проблемы. простым английским текстом, он сообщит программисту суть диагностики. не напрягая программиста необходимостью вникать во все детали. но если все таки придется - проверка инкапсулированна в отдельной функции. и понять её при необходимости будет не сложно. это называется "разделяй и властвуй" - фундаментальное свойство ООП, официально именуемое "инкапсуляцией". в противовес можно представить себе монолитную портянку "непойми чего". суть которой давно растворилась в гороховом супе не относящихся к ней деталей. Добавлено через 7 минут
в которых эти две функции просто утонут. программист, который читает код, рискует забыть с чего все началось, и зачем вообще затевалось. потому что 99% времени по вашему рецепту он будет читать не относящиеся к сути подробности проверок.
0
|
||||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
| 05.02.2016, 08:30 [ТС] | |
|
Вы невнимательно читали мой последний пост.
мне не нужны ни ассерты ни проверки. Мне нужно логирование человеческим языком что делает программа. Без этого невозможно создать в разумные сроки чтонибудь действительно большое и сложное. Програма крашится, или просто выдаёт подозрительный результат - включаешь логи, запускаешь прогу и потом смотришь по созданным файлам что, когда и почему пошло не так.
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 05.02.2016, 22:10 | |||||||
|
я ещё и понял прекрасно вашу точку зрения. потому что и сам проходил через нечто подобное несколько лет назад. сейчас вам нужен
которые не являются частью бизнес-логики функции. когда нибудь вы поймете, что это плохой путь - захламлять бизнес-логику всяким барахлом, которое напрямую не имеет к ней отношение. и если вынести все эти буковки в отдельную функцию, это сразу все упростит: улучшит читабельность. и для лога вам достаточно будет простенького макроса, аля assert.
0
|
|||||||
|
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
|
|
| 05.02.2016, 23:30 [ТС] | |
|
Это не опциональные буковки.
Последние 3 дня я бился над проблемой, что код выдавал странные (неверные) результаты. Чтоб узнать сам факт их неверности (описка в расчётах оказалось) требуется ночь работы программы!!!!!! Тоесть 1 число считается целую ночь!!! И только так можно с какойто вероятностью судить о странных результатах. Просмотр 10ти страниц (в разных файлах естественно) кода отвечающего за этот конкретный расчёт - не дал результатов. И только подробное логирование человеческим языком помогло найти ошибку (к тому же не одну) и увидеть то место где я накосячил. Это факт. Подробное логирование = проблема была решена. И это далеко не первый раз. Ну и да, дебагер естественно абсолютно бессилен, так как он оперирует числами, а проблема нашлась только когда все данные были представлены в своём человеческом виде.
0
|
|
| 05.02.2016, 23:30 | |
|
Помогаю со студенческими работами здесь
20
#define define #define c :: define не define Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение
Это мой обзор планшета X220 с точки зрения школьника.
Недавно я решила попытаться уменьшить свой. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|