в отладчике, при явном невыполнении условия, вызовы функций не выполнялись, а вот return; выполняется. Я решил, что поскольку после кривой скобки нет больше кода, там только ещё одна кривая скобка завершающая void OnTick(), то компилятор перенёс return
Это оптимизатор кода все выкинул и функция осталась пустой. Брекпоинт съехал в тот же самый конец функции и сработал.
С первым примером погорячился, согласен. Ну а что на счет второго? Ведь там точка останова остается внутри условия и никуда не съезжает. Срабатывание точки останова вводит пользователя в заблуждение, будто бы условие входа было выполнено, когда в действительности это может быть совсем не так:
class A{
public:
bool m_flag;
A* m_next;
A(bool flag) : m_flag(flag){}
void test(){
if(m_flag){
printf("1");
m_next = m_next; // Вручную установленная точка останова срабатывает как для false так и true условий//m_next = &this; // Ok
}
}
};
voidOnStart(){
{A a(false); a.test();} // Result: breakpoint Expected result:
{A a(true); a.test();} // Result: printf + breakpoint Expected result: printf + breakpoint
}
namespace NameSpace{
struct A{};
template<typename T>
struct B : public A{}; // 'A' - declaration without type
};
struct D : public NameSpace::B<int>{
int data;
};
voidOnStart(){
D d;
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Мне кажется всё правильно. Программа игнорирует if(false) и срабатывает на ближайшем по коду месте.)
Совершенно не правильно. Если мне надо остановиться только при выполнении условия, а остановка будет на каждом тике, то я с ума свихнусь пока...
Еще вопросы?
с чего Вы решили, что компилятор не выбросил текст условия if(false) {....} при компиляции проекта ?
точка останова получилась на первом текстовом символе МЕ оставшегося кода, т.к. МЕ не умеет сдвигать строки, фолдинги пр. прелести VS
ME не умеет в режиме реального времени анализировать код, максимум, что доступно автоподстановки
хотя если баг, значит баг
с чего Вы решили, что компилятор не выбросил текст условия if(false) {....} при компиляции проекта ?
точка останова получилась на первом текстовом символе МЕ оставшегося кода, т.к. МЕ не умеет сдвигать строки, фолдинги пр. прелести VS
ME не умеет в режиме реального времени анализировать код, максимум, что доступно автоподстановки
хотя если баг, значит баг
Это надо тестировать с нормальным условием. Я вот такое получил недавно: при пошаговом выполнении кода
в отладчике, при явном невыполнении условия, вызовы функций не выполнялись, а вот return; выполняется. Я решил, что поскольку после кривой скобки нет больше кода, там только ещё одна кривая скобка завершающая void OnTick(), то компилятор перенёс return
Это надо тестировать с нормальным условием.
да, я про это и пишу, не false нужно, а что нибудь как:
обычно компилятор не видит такого условия при компиляции
Код демонстрирует БАГ, где в условие зайти нельзя, но все-равно срабатывает точка останова, при этом совсем в другом месте кода.
Еще вопросы?
Это оптимизатор кода все выкинул и функция осталась пустой.
Брекпоинт съехал в тот же самый конец функции и сработал.
Это оптимизатор кода все выкинул и функция осталась пустой.
Брекпоинт съехал в тот же самый конец функции и сработал.
С первым примером погорячился, согласен.
Ну а что на счет второго? Ведь там точка останова остается внутри условия и никуда не съезжает.
Срабатывание точки останова вводит пользователя в заблуждение, будто бы условие входа было выполнено, когда в действительности это может быть совсем не так:
Брекпоинт съехал в тот же самый конец функции и сработал.
По-вашему это не баг?
C++ online: https://onlinegdb.com/S1E503pj8