Ivan
Внутри объявления цикла можно
Ivan
for (unsigned i = 0; auto& x : thing.items(); ++i) {
// ...
}
вот так чё не сделали?
Aidar
Aidar
Достаточно enumerate
Anatoly
Igor
Igor
Igor
А так это получается тот же сахар что и if (auto x=f(); if x.flag), только тут от него проку чуть меньше //как оно называется то, про переменные в ифах свичах и циклах, все время забываю
Anatoly
будем надеяться на введение ranges и эта проблема решится сама собой, см. выше
Igor
А в каком они состоянии? До TS хоть дошло?
Igor
> The Ranges TS modifies the specification of the range-based for loop to permit differently typed begin and end iterators.
и это упрощает процесс работы с "легковесные надстройками" над классическими контейнерами? zip(vector) создаёт пустышку, в которой итератор бежит по собираемым "на лету" парам?
Anatoly
Vitaliy
Послали сюда)
Vitaliy
Есть кто-нибудь кто в OpenCV горазд ?
Anonymous
@zamazan4ik мб...
Anonymous
Рассказывай свою беду.
Vitaliy
Беда следующая: у cv::Mat есть метод at, у которого стоят ассерты на выход за пределы картинки. Но когда я ему передаю координаты, например (-1, -1), то всё хорошо и программа отрабатывает без фэйла. Что в дебаг, что в релизе, соответственно UB И ответы у функции разные. А теперь вопрос, когда же всё-таки эти ассерты работают ?
Vitaliy
А свои ассерты поверх at, навешивать не хочется.
Berkus
ассерты сишные работают когда задефайнено _NDEBUG
Berkus
у тебя задефайнено?
Vitaliy
у тебя задефайнено?
Я в явном виде ничего не дефайнил, разве что коллега мог намудрить с дебаг флагами в CMakeLists
Anatoly
он спит, а не завис
Vitaliy
Такой ассерт отрабатывает
Berkus
я картофель
Vitaliy
А те ассерты, что внутри at - нет.
Vitaliy
ща
Vitaliy
А код чего ? Внутренностей at или моего метода ?
Vitaliy
#ifdef _DEBUG
# define CV_DbgAssert(expr) CV_Assert(expr)
#else
# define CV_DbgAssert(expr)
#endif
Vitaliy
template<typename _Tp> inline
const _Tp& Mat::at(Point pt) const
{
CV_DbgAssert(dims <= 2);
CV_DbgAssert(data);
CV_DbgAssert((unsigned)pt.y < (unsigned)size.p[0]);
CV_DbgAssert((unsigned)(pt.x * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
CV_DbgAssert(CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1());
return ((const _Tp*)(data + step.p[0] * pt.y))[pt.x];
}
Vitaliy
Тут он конечно хитрый
Aidar
CV_Assert это чо
Anonymous
Вот собери OpenCV с определенными _DEBUG .
Aidar
а это опенцв
Anonymous
И будут ассерты работать.
Aleksei
Vitaliy
Vitaliy
собирал Cmake'ом с соответствующими опциями
Vitaliy
Может он по дефолту не впилил этот флаг
Anonymous
По логике, в дебажном билде должен быть определен _DEBUG, а значит ассерты должны работать.
Vitaliy
Win 10, mingw 6.3
Vitaliy
Что меня смущает, так это то, что assert работает как ожидалось, в дебаге - фейл, в релизе - ок
Vitaliy
Заменил стандартный ассерт, на тот, что в OpenCV и в дебаге ничего не зафейлилось, видимо он действительно не работает
Max
Знатоки. Есть смысл писать Class(Class&&) noexcept = default; или default сам дает гарантию noexcept?
Anonymous
Я думаю, что дефолт будет noexcept, если все члены имеют noexcept конструктор перемещения.
Anonymous
Но это же C++, там далеко не всё так очевидно.
Max
Я вот нануглил, но однозначного ответа не нашел
Vitaliy
#ifdef _DEBUG
#pragma message(DEBUG)
#else
#pragma message(NO DEBUG)
#endif
не дебаг у меня, странно
Max
Ты читал? Если кинул, значит наверно да, тогда покажи пожалуйста, где именно в том доке про иключения написано о том, о чем я спрашивал?
Berkus
make VERBOSE=1 вы значит отрицаете?
Berkus
UNLESS
Vitaliy
Какой-то умелец в CMakeLists.txt написал вот так:
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -DDEBUG")
Vitaliy
Нижнего подчеркивания не было
Max
Спасибо, вчитался
Vitaliy
Вот теперь всё работает, то есть фейлится как и положено
Berkus
Vitaliy
Berkus
можно
Vitaliy
можно
Убрал их и релиз включился сразу
Vitaliy
Видимо где-то в проекте ещё налажали
Berkus
-g не нужен
Berkus
если я праивльно помню в релизе добавляется -DNDEBUG и от него имеет смысл плясать
Berkus
ща проверю
Berkus
message(STATUS ${CMAKE_CXX_FLAGS_DEBUG_INIT})
message(STATUS ${CMAKE_CXX_FLAGS_RELEASE_INIT})
дает
-- -g
-- -O3 -DNDEBUG
на cmake 3.10
Berkus
да, и он добавляется по дефолту в DEBUG и в RELWITHDEBINFO конфиги
Berkus
для этого есть -DCMAKE_BUILD_TYPE=RelWithDebInfo
Vitaliy
Vitaliy
Надо -D_DEBUG
Berkus
это проще сделать через отдельный
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
add_definitions(-D_DEBUG)
endif()
так по-моему понятней что это ваш личный левый флаг
Vitaliy
Berkus
стандартный NDEBUG
Berkus
Is NDEBUG standard?
Yes it is a standard macro with the semantic "Not Debug" for C89, C99, C++98, C++2003, C++2011, C++2014 standards. There are no _DEBUG macros in the standards.
Vitaliy
Alexander "SonnySlave"
Так, кто меня звал?)
Vitaliy
Забавно, то есть OpenCV использует в качестве детектора дебага нестандартный флаг _DEBUG. Не зря день прожил )
Alexander "SonnySlave"