Fehler, Irrtümer, Fragen - Seite 1128

 

Bei "normalen" Vergleichen wird sie dem vorzeichenlosen Typ zugeordnet:

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

Wie erklären Sie das dann?

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
Bitweiser Vergleich - es gibt keinen Widerspruch. Und dann - der Vergleich von ulong und long ist nur dann falsch, wenn 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            
}

Im getesteten Ausdruck der ersten Schleife wird eine Variable vom Typ int mit einer Integer-Konstante vom Typ uint verglichen:

keine implizite Typumwandlung stattfindet, wird ein bitweiser Vergleich durchgeführt. Der Ausdruck ist immer wahr.

In dem zu prüfenden Ausdruck der zweiten Schleife wird eine Variable vom Typ int mit einer Variablen vom Typ uint verglichen:

wird eine implizite Umwandlung der Variablen i in den Typ uint durchgeführt. Und nach dem Überlauf der Variablen i: uint(-1)= 4294967295

wird der Ausdruck falsch sein.


 

Das Ende einer Ära(UNIX?)wird um 8 Stunden verzögert:

Ganze Typen

Typ

Größe in Bytes

Minimaler Wert

Maximaler Wert

Analog 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
}
 

Die Entwickler,

Geben Sie ihm eine formale Beschreibung der MQL-Grammatik und lassen Sie ihn nach Popeln suchen :-)))

 

Einfache Sache:

double min,max;

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

Zu TF: D1 und M4 lehnt der Debugger die Zeile min=Low[i] ab; das Terminal "hängt" sich auf. Bei anderen TF gibt es dieses Problem nicht. Das Ersetzen durch min=iLow(); bringt nichts. Bitte beraten Sie mich, wo das "Loch" ist: in der Historie, im neuen MT4-Editor oder in meinem Kopf?

 
admoon:

Einfaches Zeug:

   double min,max;

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

Zu TF: D1 und M4 lehnt der Debugger die Zeile min=Low[i]; ab, das Terminal "hängt" sich auf. Bei anderen TF gibt es dieses Problem nicht. Die Ersetzung von min=iLow(); bringt mir nichts. Bitte beraten Sie mich, wo das "Loch" ist: in der Geschichte, im neuen MT4-Editor oder in meinem Kopf?

Bittebenutzen Sie den "SRC"-Button beim Erstellen eines Forumsbeitrags, um den Code einzufügen


Das erleichtert das Lesen Ihrer Nachrichten.

 
Fleder:

Das Ende einer Ära(UNIX?)wird um 8 Stunden verzögert:

Da muss ein Fehler in der Hilfe vorliegen
Print( ulong(::StringToTime( "3000.12.31 23:59:59" ))); //32'535'215'999

Oder wir wissen etwas nicht, ich glaube, hier hat sogar jemand von Hand nachgezählt https://www.mql5.com/en/forum/16036

 
A100:
Offenbar gibt es einen Fehler in der Hilfe max=32'535'215'999

Es ist nur so, dass der Grenzwert für den Typ datetime nicht korrekt definiert ist:

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

Der Grenzwert für den Typ datetime ist einfach nicht korrekt definiert:

32'535'244'799 != 32'535'215'999 - was ist richtig?