Errori, bug, domande - pagina 1128

 

Nei confronti "normali", è dato al tipo senza segno:

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

Allora come lo spiega?

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
Confronto bitwise - non c'è contraddizione. E poi - il confronto tra ulong e long è errato solo 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            
}

Nell'espressione testata del primo ciclo, una variabile di tipo int viene confrontata con una costante intera di tipo uint:

non c'è una conversione di tipo implicita, viene eseguito un confronto bitwise. L'espressione è sempre vera.

Nell'espressione del secondo ciclo che viene controllata, una variabile di tipo int viene confrontata con una variabile di tipo uint:

viene eseguita una conversione implicita della variabile i al tipo uint. E dopo l'overflow della variabile i: uint(-1)= 4294967295

l'espressione sarà falsa.


 

La fine di un'era(UNIX?)è ritardata di 8 ore:

Tipi interi

Tipo

Dimensione in byte

Valore minimo

Valore massimo

Analogico in C++

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
}
 

Sviluppatori,

Dategli una descrizione formale della grammatica MQL, lasciatelo cercare le caccole :-)))

 

Una cosa semplice:

double min,max;

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

Su TF: D1 e M4 il debugger rifiuta la linea min=Low[i]; il terminale si "blocca". Su altri TF questo problema non esiste. La sostituzione con min=iLow(); non fa nulla. Per favore, consigliatemi, dov'è il "buco": nella storia, nel nuovo editor MT4 o nella mia testa?

 
admoon:

Roba semplice:

   double min,max;

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

Su TF: D1 e M4 il debugger rifiuta la linea min=Low[i];, il terminale si "blocca". Su altri TF questo problema non esiste. La sostituzione su min=iLow(); non mi dà nulla. Per favore, consigliatemi dov'è il "buco": nella storia, nel nuovo editor MT4 o nella mia testa?

Si prega diutilizzare il pulsante "SRC" quando si crea un post nel forum per inserire il codice


Questo renderà più facile la lettura dei vostri messaggi.

 
Fleder:

La fine di un'era(UNIX?)è ritardata di 8 ore:

Ci deve essere un errore nella guida
Print( ulong(::StringToTime( "3000.12.31 23:59:59" ))); //32'535'215'999

Oppure non sappiamo qualcosa, credo che qualcuno l'abbia anche contato a mano qui https://www.mql5.com/en/forum/16036

 
A100:
Apparentemente c'è un errore nell'aiuto max=32'535'215'999

È solo che il limite per il tipo datetime non è definito correttamente:

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

Il limite per il tipo datetime semplicemente non è definito correttamente:

32'535'244'799 != 32'535'215'999 - quale è corretto?