Примеры: Типичные ошибки в программах на MQL4 и методы их устранения

 

New article Типичные ошибки в программах на MQL4 и методы их устранения has been published:

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

Author: MetaQuotes Software Corp.

 

Спасибо.

Вывел для себя некоторые новые фишки по исправлению.

 

Здравствуйте! А как быть с такой ошибкой:

Файлы:
qpfm3l.jpg  12 kb
2z2.jpg  72 kb
 
iglob:

Здравствуйте! А как быть с такой ошибкой:

Необходимо задать размер второго измерения массива.

Много интересного и познавательного про массивы

 

можете исправить строку

if (URLock == true)  
 {
  double  URLock ;

  if (SellLots_b - BuyLots_b != 0)

причина: declaration of 'URLock' hides global declaration

и ещё пример

int init() {
   gd_348 = MarketInfo(Symbol(), MODE_SPREAD)  * Point;
   switch  MarketInfo(Symbol(), MODE_MINLOT) {
   case 0.001:
      gd_256 = 3;
      break;
   case 0.01:
      gd_256 = 2;
      break;
   case 0.1:
      gd_256 = 1;
      break;
   case 1.0:
      gd_256 = 0;

   }

причина:'MarketInfo' - syntax error

Очень хотелось бы исправить Спасибо...

 
vobler63:

можете исправить строку

if (URLock == true)  
 {
  double  URLock ;

  if (SellLots_b - BuyLots_b != 0)

причина: declaration of 'URLock' hides global declaration

и ещё пример

int init() {
   gd_348 = MarketInfo(Symbol(), MODE_SPREAD)  * Point;
   switch  MarketInfo(Symbol(), MODE_MINLOT) {
   case 0.001:
      gd_256 = 3;
      break;
   case 0.01:
      gd_256 = 2;
      break;
   case 0.1:
      gd_256 = 1;
      break;
   case 1.0:
      gd_256 = 0;

   }

причина:'MarketInfo' - syntax error

Очень хотелось бы исправить Спасибо...

if (URLock == true)   
 {
  double  URLock ;

  if (SellLots_b - BuyLots_b != 0)

причина: declaration of 'URLock' hides global declaration

и ещё пример

int init() {
   gd_348 = MarketInfo(Symbol(), MODE_SPREAD)  * Point;
   switch  MarketInfo(Symbol(), MODE_MINLOT) {
   case 0.001:
      gd_256 = 3;
      break;
   case 0.01:
      gd_256 = 2;
      break;
   case 0.1:
      gd_256 = 1;
      break;
   case 1.0:
      gd_256 = 0;

   }
Вставляйте код пожалуйста правильно, через кнопку "SRC"
 
Vladimir Zubov:
Вставляйте код пожалуйста правильно, через кнопку "SRC"
int init() {
   gd_348 = MarketInfo(Symbol(), MODE_SPREAD)  * Point;
   switch  MarketInfo(Symbol(), MODE_MINLOT) {
   case 0.001:
      gd_256 = 3;
      break;
   case 0.01:
      gd_256 = 2;
      break;
   case 0.1:
      gd_256 = 1;
      break;
   case 1.0:
      gd_256 = 0;
   }
   return (0);

ОШИБКА:'MarketInfo' - syntax error

и другое предупреждение
 if (URLock == true)   
 {
  double  URLock ;
  if (SellLots_b - BuyLots_b != 0)
  {
   if (SellLots_b > BuyLots_b)
   {
предупреждение:declaration of 'URLock' hides global declaration

это части из кодов с ошибками...
 
vobler63:

Тут две ошибки сразу

switch  MarketInfo(Symbol(), MODE_MINLOT) { // почему выражение не в круглых скобках??

Оператор-переключатель switch

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

MarketInfo возвращает тип double, можно выкрутится вот так

switch  (int(MarketInfo(Symbol(), MODE_MINLOT)*10000)) {

Ну и значения в case тоже умножить на 10000

 
А с каких это пор на форуме обсуждаются и правятся куски декомпилированного/ворованного кода ?
 
Alexey Volchanskiy:

Тут две ошибки сразу

Оператор-переключатель switch

Сравнивает значение выражения с константами во всех вариантах case и передает управление оператору, который соответствует значению выражения. Каждый вариант case может быть помечен целой константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций. Выражение оператора switch должно быть целого типа.

MarketInfo возвращает тип double, можно выкрутится вот так

Ну и значения в case тоже умножить на 10000

Попробуйте исправить...Спасибо,что обратили внимание.

<НЕДЕЛЯ БАНА ЗА ДЕКОМПИЛИРОВАННЫЙ КОД>
 

В‌ыдается сообщение, как его исправить?

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Gi_124) {
            Li_24 = OrderType();
            Ld_28 = NormalizeDouble(OrderStopLoss(), Digits);
            Ld_36 = NormalizeDouble(OrderTakeProfit(), Digits);
            Ld_44 = NormalizeDouble(OrderOpenPrice(), Digits);
            Li_8 = OrderTicket();
            Ld_60 = 0;
            Ld_68 = 0;
            if (Li_24 == OP_BUY) {
              Li_16++;
              Ld_0 += OrderProfit();
               Li_88 = 1;
               if (Ld_28 == 0.0 && Stoploss >= Li_12 && Stoploss != 0) Ld_60 = NormalizeDouble(Bid - Stoploss * Point, Digits);
               else Ld_60 = Ld_28;
               if (Ld_36 == 0.0 && Takeprofit >= Li_12 && Takeprofit != 0) Ld_68 = NormalizeDouble(Ask + Takeprofit * Point, Digits);
               else Ld_68 = Ld_36;
               if (NoLoss >= Li_12 && Ld_28 < Ld_44 && NoLoss != 0)

possible use of uninitialized variable 'Li_16' BreakdownLevelDay.mq4 80 15


Файлы:
22.jpg  124 kb
Причина обращения: