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

 
Manov:

У вас   "possible use of uninitialized variable 'local_low' "

 А что выдаётся  если

Если переменная инициализирована хоть чем-нибудь, то предупреждение исчезает. Но, как Вы сами можете видеть, в данном куске кода инициализация переменной local_low является излишней. Поэтому предупреждение совершенно не мешает жить.
 
Renat:

Перечитайте мои ответы с точки зрения руководителя софтверной компании, который довел до рынка много программных проектов.

Иначе, оставшись на уровне "любого программиста", так и не поймете в чем ошибка.

 

:) Поскольку я никогда не стану руководителем софтверной компании, то навсегда останусь на уровне "любого программиста" (т.е. программиста-любителя, в моём понимании).

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

 
Yedelkin:
Если переменная инициализирована хоть чем-нибудь, то предупреждение исчезает. Но, как Вы сами можете видеть, в данном куске кода инициализация переменной local_low является излишней. Поэтому предупреждение совершенно не мешает жить.
Конкретний код - наверно да, ... но компилатор надо будеть максимално "дуракоустойчивы".
 
И воспылал монитор и сказал программисту: никогда не прячте инициализацию за условием, как и никогда не используйте переменную цикла после тела цикла, проверяйте деление на ноль, не плодите сущностей сверх необходимости, не пишите if (a==true) ...
 
Manov:
... компилатор надо будеть максимално "дуракоустойчивы".
Так я с этим и не спорю. Полезное предупреждение. Чем таких предупреждений будет больше, тем  лучше будешь понимать свой собственный код.
 
Vigor:
... не пишите if (a==true) ...

Кстати, по весне были у меня учебные эксперты, в которые, поначитавшись литературы, вставлял условия типа if(а). Так вот эксперты начинали работать только после того, как изменял эти условия на условия типа if (a==true). Теперь с трудом отвыкаю от этой привычки.
 
Yedelkin:

Но из-за использования bool-переменной interrupcion в строке 9 сразу после инициализации переменной local_low в строке 8 получается, что в строке 15 переменная local_low будет гарантированно инициализированной. Поэтому на текущий момент предупреждение "possible use of uninitialized variable 'local_low' " означает не "гарантированное", а всего лишь возможное наличие ветки прохода, при котором переменная не инициализирована.
В Вашем примере, если   Ac-k=0 , то оператор for не выполнится ни разу и local_low окажется гарантировано неинициализированной. Или не так ?
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 

Если отправить запрос на модификацию позиции с прежними стопами, то получим ошибку. А если отправить запрос на модификацию отложенного ордера с прежними параметрами, то запрос будет выполнен. Это так задумано и параметры не надо проверять на изменение ?

Зачем забивать сервер лишними запросами, например, в случае ошибке в эксперте или неправильной логики его работы ?

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства ордеров - Документация по MQL5
 
Valmars:
В Вашем примере, если   Ac-k=0 , то оператор for не выполнится ни разу и local_low окажется гарантировано неинициализированной. Или не так ?

Совершенно верно. Если Ac-k<=1, то оператор for не должен выполниться ни разу, и переменная local_low останется гарантированно неинициализированной. Но так как при этом bool-переменная interrupcion останется со значением false (строка 3), то в силу условия из строки 13 неинициализированная переменная local_low никогда не будет (не должна) использоваться при расчётах. В частности, не должно вычисляться выражение с переменной local_low из строки 15 [если же, конечно, оператор if будет работать именно так, как указано в справке:) ].

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

 

void Graf()
 {
  if(ObjectFind(0,"H")<0) ObjectCreate(0,"H",OBJ_HLINE,0,0,h,0);
  if(ObjectFind(0,"L")<0) ObjectCreate(0,"L",OBJ_HLINE,0,0,l,0);
     ObjectSetDouble(0,"H",OBJPROP_PRICE,h);
     ObjectSetDouble(0,"L",OBJPROP_PRICE,l);
    
    string bal = DoubleToString (AccountInfoDouble(ACCOUNT_BALANCE),2);
    string equ = DoubleToString (AccountInfoDouble(ACCOUNT_EQUITY),2);
    string spread = DoubleToString(((Ask-Bid)/_Point),0);
    string space = "  ";
    string info= bal+space+equ+space+spread;
    
    if (ObjectFind(0,"info")<0) ObjectCreate(0,"info",OBJ_LABEL,0,0,0,0);
      ObjectSetInteger(0,"info",OBJPROP_XDISTANCE,0);
      ObjectSetInteger(0,"info",OBJPROP_YDISTANCE,15);
      ObjectSetString(0,"info",OBJPROP_TEXT,info);
      ObjectSetInteger(0,"info",OBJPROP_FONTSIZE,36);
      ObjectSetInteger(0,"info",OBJPROP_COLOR,Maroon);
   return;
 }

Вот кусок кода. Функция выводит значения баланса, эквити и спред на каждом тике. Вот только почему-то информация отображается за предыдущий тик а не за прошедший...  Помогите разобраться, почему ?   В МТ 4 аналогичный код меняет значения с приходом нового тика, а в МТ5 с приходом нового тика  отображается информация на предшествующий тик.