Fehler, Irrtümer, Fragen - Seite 326

 
Urain:

Im ersten Beitrag führen Sie Zuweisungsvorgänge durch, eine mehrfache Kaskadenzuweisung ist akzeptabel. Hier versuchen Sie, einen Mehrfachvergleich durchzuführen.


Ich weiß, wie man vergleicht, aber if(a<b<c) funktioniert und sieht hübscher aus, obwohl die Hilfe nichts dazu sagt. wie funktioniert es schneller?
 
sergey1294:
Ich weiß, wie man vergleicht, aber if(a<b<c) funktioniert und sieht hübscher aus, obwohl die Hilfe nichts darüber sagt. Aber wie funktioniert es schneller?

Ihr Ausdruck ist gleich dem folgenden

if(a<(b<c))
Sie vergleichen b und c, das Ergebnis dieses Vergleichs wird 0 oder 1 sein, und dann vergleichen Sie dieses Ergebnis mit a.
 
sergey1294:
Ich weiß, wie man vergleicht, aber if(a<b<c) funktioniert und sieht hübscher aus, obwohl die Hilfe nichts darüber sagt. Wie funktioniert es schneller?

Das funktioniert folgendermaßen.

if(a&&b&&c==3)Alert("a=b=c=3");
if(a<b&&b<c)Alert("a<b<c");
  if(a==b)Alert("a=b");

und das hier nicht.

 if(a<b<c)Alert("a<b<c");
 if(a=b=c=3)Alert("a=b=c=3");
 if(a==b==c==3)Alert("a=b=c=3");
 if(a==b==c)Alert("a=b=c"); //Вот нежелание работать этого примера для меня странно (хотя может так и задумано)
Urain:

Ihr Ausdruck entspricht dem hier

Sie vergleichen b und c, das Ergebnis dieses Vergleichs wird 0 oder 1 sein, danach vergleichen Sie dieses Ergebnis mit a.
Mit dieser Logik wird alles klar, aber aus irgendeinem Grund denke ich, dass a und b zuerst verglichen werden (kann natürlich sein, dass ich falsch liege)...
 
Urain:

Ihr Ausdruck ist derselbe wie dieser.

Sie vergleichen b und c, das Ergebnis dieses Vergleichs ist 0 oder 1 und dann vergleichen Sie dieses Ergebnis mit a.

Ich verstehe, aber hier ist der Trick mit diesem Ausdruck, aber es funktioniert nicht

void OnStart()
  {
//---
   int a=1;
   int b=2;
   int c=3;
   int d=3;
//---   
   if(a!=b<c==d)Alert("");
   else Alert("Условие не верно");
//---
  }
 
Interesting:
... Nur denke ich irgendwie, dass a und b zuerst verglichen werden (ich kann natürlich falsch liegen)...
Ja, ich liege einfach mechanisch falsch, erst gibt es einen Linksvergleich, dann einen Rechtsvergleich.
 
sergey1294:

Ich verstehe, aber hier ist der Trick mit diesem Ausdruck, aber es funktioniert nicht

Nein, es ist nur so, dass man die Prioritäten der Operationen und den Kommentar von Urain berücksichtigen muss.

Auch mit diesem Ausdruck gibt es keine Probleme, aber er stört sehr stark.

if(a<b<c)Alert("a<b<c");

Dieser Punkt wird im Abschnitt "Prioritäten und Reihenfolge der Operationen" im Detail beschrieben. (Priorität und Reihenfolge der Vorgänge müssen berücksichtigt werden).

Wenn ich also richtig verstehe, sieht der Vergleich nach dem Compiler wie folgt aus (unter Berücksichtigung der Kommentare von Nikolai)

if((a!=(b<c))==d)Alert("")
 
Interesting:
Wie groß ist der ungefähre Umfang der Liste? Vielleicht gibt es eine Grenze für die Größe der Liste...
Genau 100 Zeilen.
 
-Alexey-:
Genau 100 Zeilen.

Ich habe mit einer meiner Bibliotheken (110 Funktionen) experimentiert und in der Liste 100 bis 106 angezeigt (und immer eine andere Zahl, aber nicht 110).

 

Beim Lesen der .csv-Datei traten gleich mehrere Probleme auf. Um zu versuchen, die Gründe für die Fehlfunktion herauszufinden, habe ich ein einfaches Skript geschrieben. Das Skript liest Daten aus der Datei "test.csv". Sobald das Ende der Datei erreicht ist, werden die Iterationsnummer der "for"-Schleife, die Dateigröße und die Position des Dateizeigers in das Protokoll geschrieben. Aber hier passieren unverständliche Dinge, nämlich: Die Datei "test.csv" hat nur 15 Zeilen, also muss die Anzahl der Iterationen der Schleife "for" 14 sein, aber das Journal erzeugt 0. Die Dateigröße wird korrekt ausgegeben, aber die Position des Dateiendzeigers ist aus irgendeinem Grund größer als die Datei selbst. Skript-Code:

void OnStart()
  {
   int handle;
   ulong i, size;
   double _Ask, _Bid;
   string str;
      
   handle = FileOpen("test.csv",FILE_CSV|FILE_READ,',');
   
   if (handle != INVALID_HANDLE)
     {
      size = FileSize(handle);
      
      for (i = 0; i < size; i++)
        {
         str = FileReadString(handle);
         _Ask = FileReadNumber(handle);
         _Bid = FileReadNumber(handle);
        
         if (FileIsEnding(handle))
           {
            Print(i," ",size," ",FileTell(handle));
            break;
           }
        }
     }   
      
   FileClose(handle);

   return;
  }

Datei "test.csv" und Protokoll im Anhang. Wer hat eine Meinung zu dieser Frage?

P.S. Das Interessanteste ist, dass dieses Skript im MT4 ohne Fehler funktioniert.

Dateien:
test.zip  1 kb
 
DenisR:

Beim Lesen der .csv-Datei traten gleich mehrere Probleme auf. Um zu versuchen, die Gründe für die Fehlfunktion herauszufinden, habe ich ein einfaches Skript geschrieben. Das Skript liest Daten aus der Datei "test.csv". Sobald er das Ende der Datei erreicht hat, gibt er die Iterationsnummer der "for"-Schleife, die Dateigröße und die Position des Dateizeigers in das Protokoll ein. Aber hier passieren unverständliche Dinge, nämlich: Die Datei "test.csv" hat nur 15 Zeilen, also muss die Anzahl der Iterationen der Schleife "for" 14 sein, aber das Journal erzeugt 0. Die Dateigröße wird korrekt ausgegeben, aber die Position des Dateiendzeigers ist aus irgendeinem Grund größer als die Datei selbst. Skript-Code:

Datei "test.csv" und Protokoll im Anhang. Wer hat eine Meinung zu dieser Frage?

P.S. Das Interessanteste ist, dass dieses Skript im MT4 ohne Fehler funktioniert.

Auf den ersten Blick wird die gesamte Datei in str...
FILE_ANSI Flag hinzufügen, da es standardmäßig Unicode liest:)
Außerdem werde ich 15 sein, da am Ende eine Leerzeile steht.