Почему оператор "for" даёт "осечку"?

 

Уважаемые форумчане.

Объясните пожалуйста, каким образом происходит, что срабатывает "else", когда "alafim=0" ?

А строчка

           Print("222222222222. x: ",x," alafim: ",alafim);

                                     выдаёт:

                    "222222222222. x: 1 alafim: 0

                          ??????????????

ведь 1 больше чем 0

---------------------------------------------------------------------

   int start()

      {

   ...

   for(x=0;x <= alafim;x++)
      {
      ticket=-1;
      while(ticket == -1)
         {
         RefreshRates();
         if(x == alafim)
            {
            int OrdSnd_Stavka=stavka;
            }
         else
            {
            Print("222222222222. x: ",x," alafim: ",alafim);
            OrdSnd_Stavka=MaxStavka;
            }
//------------    kedei limnoa 2 iskaot bo zmanit    ------------------
         if(SalHefsedim >= A1_Limit)
            {
            int OrdSleep=1000*(MathRand()/32767.00000000);
            Sleep(OrdSleep);
            }
//---------------------------------------------------------------------
            if(Seconds() != 57 && Seconds() != 58 && Seconds() != 59) return(0);
            Print("Symbol: ",Symbol()," cmd: ",cmd," OrdSnd_Stavka: ",OrdSnd_Stavka," Bid: ",Bid);
            ticket=OrderSend(Symbol(),cmd,OrdSnd_Stavka,Bid,144,0,0,"BO exp:60");
            LastError=GetLastError();
            Print("99.LastError: ",LastError);
            if(LastError == 0) break;
//            z++;
//            }
         if(LastError != 0)
            {
            if(IsTradeAllowed())
               {
               DealString="Sleeping 60H  ....  Error in OrderSend() function. "+ErrorDescription(LastError);
               minutes=600;MyComment();
               }
            }
//            ticket=OrderSend(Symbol(),cmd,OrdSnd_Stavka,Bid,144,0,0,"1");
         if((LastError == 132) || (LastError == 4109))
            {
            DealString="Sleeping 1H .... Market is closed, or Trade is not allowed.";
            minutes=60;sec1=1;sleep1=60;MyComment();
            }
         if(LastError == 131)
            {
            DealString="Sleeping 1H .... Invalid trade volume.";
            minutes=60;sec1=1;sleep1=60;MyComment();
            }
         }
      TicketVector[x]=ticket;
Print("7777. x: ",x," TicketVector[x]: ",TicketVector[x]," ticket: ",ticket);
      }

   ...

}

-------------------------------------------------------------------------------------------------

С уважением,

АрБат

 
reuvenb:

Уважаемые форумчане.

Объясните пожалуйста, каким образом происходит, что срабатывает "else", когда "alafim=0" ?

А строчка

           Print("222222222222. x: ",x," alafim: ",alafim);

                                     выдаёт:

                    "222222222222. x: 1 alafim: 0

                          ??????????????

ведь 1 больше чем 0

---------------------------------------------------------------------


Поэтому else и срабатывает, поскольку величины не равны.
 

Вопрос-то про осечку цикла for. Однажды было такое. Помогла перезагрузка компьютера.

Без причины так не должно быть. Ведь если alafim==0 (как показал Print), то цикл for(x=0;x <= alafim;x++) выполнится лишь раз для x=0.

Однако надо посмотреть, где меняется alafim и как описан массив TicketVector[x] и другие -

встречался с таким - причина была в выходе за пределы описанного массива.  Потому надо попробовать программу с директивой #property strict.

Однажды наткнулся на ошибку компилятора - переставил малозначащие строчки программы и вставил незначащий оператор вроде alafim=alafim;  и  все заработало.

Был случай процессор давал ошибку при сложении двух определенных чисел - выкинули сопроцессор и заработало. Попробовать на другом компьютере.

 Это шутка сумел: вот ВещДок

и программу приложил. Любой сможет повторить...

Файлы:
demo.mq4  1 kb
 
LRA:

Вопрос-то про осечку цикла for. Однажды было такое. Помогла перезагрузка компьютера.

Без причины так не должно быть. Ведь если alafim==0 (как показал Print), то цикл for(x=0;x <= alafim;x++) выполнится лишь раз для x=0.

Однако надо посмотреть, где меняется alafim и как описан массив TicketVector[x] и другие - возможная причина в выходе за пределы описанного массива.

Потому надо попробовать программу с директивой #property strict.

Но тоже сумел: вот ВещДок

и программу приложил. Любой сможет повторить...

А можно попонятнее? Ничего не понял!

Между прочим, код работает нормально, но иногда происходит эта осечка и всё портит.

Насчот "alafim":

------------------------------------------------------------------

int ticket,TicketVector[24],cmd,Tstavka,stavka,alafim;

int start()

{

.......

   alafim=0;
   if(stavka > MaxStavka)
      {
      Print("11111111111.    stavka: ",stavka);
      alafim=stavka/MaxStavka;
      stavka=stavka-MaxStavka*alafim;
      }
.....

}

------------------------------------------------------------------

 

1. Поставьте в начало #property strict

Без strict Ошибка Array out of range" (индекс за пределами массива) не приводит к критической ошибке

а при наличии strict "Array out of range" - критическая ошибка и приводит к остановке программы

Какое все-таки максимальное значение alafim ??? Дело в том, что в цикле for(x=0;x <= alafim;x++)   величина x  может достичь alafim

2. Если будет x=24 и больше, то TicketVector[x]=ticket; изменит переменную, следующую в памяти за массивом.  Увеличьте количество элементов TicketVector[100].

3.  Попробуйте контролировать величину alafim так что-ли

      if(stavka > MaxStavka)

      {
      alafim=stavka/MaxStavka;
      stavka=stavka-MaxStavka*alafim;

      Alertt("11111111111.    stavka: ",  stavka,  " alafim: ",  alafim);
      }

 

Пытался в MetaEditor получить справку по массивам. В разделе Сложные типы данных лишь:  Ожидал первым делом массивы

Нашел в разделе Операции и Выражения --> Другие операции --> Индексирование

 --->