Ошибки, баги, вопросы - страница 3130

 
Alexey Viktorov #:

В какой строке вашего снимка есть &=

https://stackoverflow.com/questions/33304407/c-meaning-and

C++ meaning |= and &=
C++ meaning |= and &=
  • 2015.10.23
  • Sven van den Boogaart
  • stackoverflow.com
I have a part of code that contains the following functions: I know what a switch case is but I don't understand what these parts do. is an int. The 's also refer to an int value. Could someone explain what these parts do? An example with input values and results would be nice.
 
Lilita Bogachkova #:

Вы через чур хорошего мнения обо мне… Я этот вражеский язык никогда не учил… так вот случилось… а теперь уже поздно.

 
JRandomTrader #:

Что-то типа того:

 Уже пробовал и break, и даже return сгоряча, но было только хуже. Попробую ещё упростить код и переосмыслить с break...

 
x572intraday #:

 Могу ответить только за &= сразу:

Справочник MQL5 / Основы языка / Операции и выражения / Операции присваивания:

по аналогии с накопительной переменной y:


Но это мой первый опыт использования &=, так что могу ошибаться.

 Нет. Сперва (по задумке) в накопительную h_plus суммируются внутри for все логические условия, а получившаяся bool-сумма подставляется в if, который к внутреннему for отношения не имеет.
Но всё же, корректнее было бы не
h_plus&=high[i]>high[i+increment];
а
h_plus = h_plus && high[i]>high[i+increment];
 
Alexey Viktorov #:

В вашем случае это не так поскольку должны быть выполнены оба условия. А вот если поставить такое

то, да. При выполненном условии «а» второе условие проверяться не будет. За это боролись много лет, а вы теперь предлагаете вернуться в прошлый век…

Хотя… в этом своём утверждении я не прав. Видимо я не совсем понял что написано тут

x572intraday #:

 Багом называть не рискну. Поэтому просто скажу, что заметил одну особенность оператора if. Прозреваю, это может относиться и к другим ЯПам.

Если a окажется true, то проверка перейдёт к Array[over_index] и тут-то терминал начнёт дико бомбить по части 'array out of range', что совершенно справедливо. Если же a окажется false, до проверки условия истинности Array[over_index], а значит, и избыточности индекса дело не дойдёт, if проскочит дальше, а кодер так и не узнает, что у него в программе гуляет массив с несуществующим индексом... точнее существующим, но избыточным.

 Может, это надо пофиксить, чтобы проверка на предмет  'array out of range' происходила в if до самого конца и выдавалось бы такое же сообщение? Или это сильно уронит скорость работы оператора?

Даже если в условии && и первое условие не выполнено, то второе проверяться не будет. Так-что кого ввёл в заблуждение, извиняйте…

 
x572intraday #:

 Уже пробовал и break, и даже return сгоряча, но было только хуже. Попробую ещё упростить код и переосмыслить с break...

for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus = high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

Вот типа того.

 

При масштабировании чарта движением мышей по шкале времени чарт убегает влево или вправо, в зависимости от направления движения мыши, таким образом всё нужное, что находиться в фокусе взгляда пользователя, часто просто исчезает за границами чарта. Это ужасно неудобно, так как потом приходиться искать нужное место, и это наблюдается с тех пор, как я знаком с MT.

Логично было предположить, что возможно нажатие на значок лупы отмасштабирует чарт по центру, но нет, поведение такое же, как и в случае с масштабированием мышей - чарт сдвигается влево (сжатие) или вправо (расширение). 

Уважаемые разработчики! Убедительная просьба поменять поведение чарта при масштабировании, нужно оставлять центр чарта в центре.

Со мной согласны все, с кем я обсуждал данное неудобство при работе с чартом, так что имею большие шансы быть объективным по данной проблеме.

Пытался привыкнуть в течении 14 лет - не смог.

 
JRandomTrader #:
for(int i=start; i<rates_total-n && !IsStopped(); i++)
{
   for(int increment=1, bool h_plus=true ; h_plus && increment<=n ; increment++)
     h_plus = high[i]>high[i+increment]; // можно не накапливать, вылетим из цикла на первом false

   if(h_plus) {...}
   ...
}

Вот типа того.

 Свежая идея, попробую.

 А вот касательно предыдущего варианта:

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
     {
      h_plus&=high[i]>high[i+increment];
      if(!h_plus)break;
     }
   if(h_plus) {...}
   ...
}

даже не пробуя уже ясно, что 

if(!h_plus)break;

идёт после суммирования, а это означает, что терминал увидит сперва предыдущую строку и уже поймёт, что есть массив с избыточным индексом и выдаст всё тот же месседж 'array out of range'. Это второе. А первое — делать вообще надобно проверку не на !h_plus, а на ArraySize(high)<=i+increment и выбегать из цикла в случае превышения индекса. Всё это я уже пытался вчера, но обломался в каких-то нюансах. Да, месседжа уже не было, но и индикатор начал городить огород.

 
x572intraday #:

 А вот касательно предыдущего варианта:

даже не пробуя уже ясно, что 

идёт после суммирования, а это означает, что терминал увидит сперва предыдущую строку и уже поймёт, что есть массив с избыточным индексом и выдаст всё тот же месседж 'array out of range'. Это второе. А первое — делать вообще надобно проверку не на !h_plus, а на ArraySize(high)<=i+increment и выбегать из цикла в случае превышения индекса. Всё это я уже пытался вчера, но обломался в каких-то нюансах. Да, месседжа уже не было, но и индикатор начал городить огород.

Так тут беда в

i<rates_total-3
Я ж там не зря написал
i<rates_total-n
А раннее вышибание из цикла - именно для имитации вычисления if()
 
x572intraday #:

 Багом называть не рискну. Поэтому просто скажу, что заметил одну особенность оператора if. Прозреваю, это может относиться и к другим ЯПам.

Если a окажется true, то проверка перейдёт к Array[over_index] и тут-то терминал начнёт дико бомбить по части 'array out of range', что совершенно справедливо. Если же a окажется false, до проверки условия истинности Array[over_index], а значит, и избыточности индекса дело не дойдёт, if проскочит дальше, а кодер так и не узнает, что у него в программе гуляет массив с несуществующим индексом... точнее существующим, но избыточным.

 Может, это надо пофиксить, чтобы проверка на предмет  'array out of range' происходила в if до самого конца и выдавалось бы такое же сообщение? Или это сильно уронит скорость работы оператора?


если переменная a у вас false то управление передается дальше и не затрагивает массив и код в скобках после if, потому как у вас

if(a && Array[over_index]>val) {...}

управление передастся в правую часть условия, только если левая (a) будет true

если, например, вы сделаете

if(check(over_index) && Array[over_index]>val) {...}

где функция check проверяет индекс на вхождение в пределы массива Array, то никакого "array out of range" у вас никогда не будет. так можно сделать проверку индекса массива и обращение к нему в одном if. но чтобы управление передавалось во вторую часть if с оператором &&, если первая false, вряд ли подобное возможно в любом из существующих языков программирования...