Erros, bugs, perguntas - página 1128

 

Nas comparações "normais", é dada ao tipo não assinado:

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

Então como o explica:

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
Comparação bitwise - não há contradição. E depois - comparar ulong e long só é incorrecto se 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            
}

Na expressão testada do primeiro laço, uma variável do tipo int é comparada a uma constante inteira do tipo uint:

não há nenhuma conversão de tipo implícita, é feita uma comparação bitwise. A expressão é sempre verdadeira.

Na expressão do segundo laço a ser verificada, uma variável do tipo int é comparada a uma variável do tipo uint:

é realizada uma conversão implícita da variável i para o tipo uint. E após o transbordo da variável i: uint(-1)= 4294967295

a expressão será falsa.


 

O fim de uma era(UNIX?)é adiado por 8 horas:

Tipos inteiros

Tipo

Tamanho em bytes

Valor mínimo

Valor máximo

Analógico em C++

data/hora

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
}
 

Desenvolvedores,

Dê-lhe uma descrição formal da gramática MQL, deixe-o procurar macacos de macacos :-)))

 

Coisa simples:

double min,max;

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

Sobre a TF: D1 e M4 o depurador rejeita a linha min=Low[i]; o terminal "pendura". Em outras TF, este problema não existe. Substituir por min=iLow(); não faz nada. Por favor, informe, onde está o "buraco": na história, no novo editor MT4 ou na minha cabeça?

 
admoon:

Coisas simples:

   double min,max;

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

Sobre a TF: D1 e M4 o depurador rejeita a linha min=Low[i];, o terminal "pendura". Em outras TF, este problema não existe. Substituição em min=iLow(); não me dá nada. Por favor, avise onde está o "buraco": na história, no novo editor MT4 ou na minha cabeça?

Por favoruse o botão "SRC" quando criar uma mensagem no fórum para inserir o código


Isto tornará mais fácil a leitura das suas mensagens.

 
Fleder:

O fim de uma era(UNIX?)é adiado por 8 horas:

Deve haver um erro na ajuda
Print( ulong(::StringToTime( "3000.12.31 23:59:59" ))); //32'535'215'999

Ou não sabemos alguma coisa, acho que alguém até o contou à mão aqui https://www.mql5.com/en/forum/16036

 
A100:
Aparentemente há um erro na ajuda max=32'535'215'999

É que o limite para o tipo de data/hora não está definido correctamente:

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

O limite para o tipo de data/hora simplesmente não é definido correctamente:

32'535'244'799 != 32'535'215'999 - o que é correcto?