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

 

В "обычных" сравнениях приводится к беззнаковому типу:

void OnStart()
{
  ulong i=0;
  while(true)
  {
    if(i<ULONG_MAX) {i++;}  //тут в условии так и остаётся тип ulong, преобразования к long не происходит
    else {break;}
  }
}
 
Fleder:

 Тогда как объяснить это:  

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
Побитовое сравнение - нет противоречия. А потом - сравнивать ulong и long некорректно только если long < 0
 
void OnStart()
{
  long n=0;
  uint g=UINT_MAX;
//for(int i=0;i<UINT_MAX;i++) {n++;}  //здесь получаем бесконечный цикл и предупреждение expression is always true
  for(int i=0;i<g;i++) {n++;}         //здесь получаем предупреждение sign mismatch и цикл в 4294967295 итераций
  Print("n = ",n);                    //n = 4294967295            
}

В проверяемом выражении первого цикла переменная типа int сравнивается с целочисленной константой типа uint:

неявного приведения типов нет, производится побитовое сравнение. Выражение - всегда истинно.

 

В проверяемом выражении второго цикла переменная типа int сравнивается с переменной типа uint:

происходит неявное приведение переменной i к типу uint. И после переполнения переменной i: uint(-1)= 4294967295 

выражение будет ложным. 


 

Конец эпохи (UNIX?) откладывается на 8 часов:

Целые типы

Тип

Размер в байтах

Минимальное значение

Максимальное значение

Аналог в языке С++

datetime

8

0 (1970.01.01 0:00:00)

32 535 244 799 (3000.12.31 23:59:59)

__time64_t

 

void OnStart()
{
  Print((datetime)32535244799);   //3001.01.01 07:59:59
}
 

Разработчики,

дайте ему уже формальное описание грамматик языка MQL, пускай  выискивает козявки :-)))

 

Простая штука:

double min,max;

i=Bars-1-period1;
while(max-min==0)
{
min=Low[i];
max=High[i];
i++;
}

На ТФ: Д1 и М4 отладчик бракует строку min=Low[i];, терминал "виснет". На других ТФ этой проблемы нет. Замена на  min=iLow(); ничего не даёт.  Подскажите где "дыра": в истории ,в новом редакторе МТ4 или в моей голове?

 
admoon:

Простая штука:

   double min,max;

   i=Bars-1-period1;
   while(max-min==0)
     {
      min=Low[i];
      max=High[i];
      i++;
     }

На ТФ: Д1 и М4 отладчик бракует строку min=Low[i];, терминал "виснет". На других ТФ этой проблемы нет. Замена на  min=iLow(); ничего не даёт.  Подскажите где "дыра": в истории ,в новом редакторе МТ4 или в моей голове?

Пожалуйста, при создании сообщения на форуме для вставки кода используйте кнопку "SRC"


 

Так будет удобнее читать Ваши сообщения. 

 

 
Fleder:

Конец эпохи (UNIX?) откладывается на 8 часов: 

Видимо в справке ошибка
Print( ulong(::StringToTime( "3000.12.31 23:59:59" ))); //32'535'215'999

или мы чего то не знаем, тут вроде даже вручную считал кто-то https://www.mql5.com/en/forum/16036  

 
A100:
Видимо в справке ошибка max=32'535'215'999

Просто предел  для типа datetime определен некорректно:

void OnStart()
{
  Print((datetime)32535244799);   //3001.01.01 07:59:59
  Print((datetime)32535244800);   //wrong datetime
}
 
Fleder:

Просто предел  для типа datetime определен некорректно:

32'535'244'799 != 32'535'215'999 - какое правильное?