エラー、バグ、質問 - ページ 326

 
Urain:

最初の投稿では、割り当て操作を行っていますが、複数のカスケード割り当てでも問題ありません。ここでは、複数の比較を行おうとしています。


比較の方法は知っていますが、if(a<b<c)はヘルプには何も書いていないのに、動作して見た目がきれいになっています。どうしたら速く動作するのでしょうか?
 
sergey1294:
比較の方法は知っていますが、if(a<b<c)はヘルプには何も書いてありませんが、動作して見た目もきれいです。 でも、どうしたら速く動作するのでしょうか?

あなたの表現は、この表現と同じです

if(a<(b<c))
bとcを比較すると、その結果は0か1になり、この結果とaを比較します。
 
sergey1294:
比較の方法は知っていますが、if(a<b<c)はヘルプには何も書いていないのに、動作して見た目がきれいになります。 どうしたら速く動作するのでしょうか?

このような仕組みになっています。

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");

とか、これじゃダメだ。

 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"); //Вот нежелание работать этого примера для меня странно (хотя может так и задумано)
ウラン です。

あなたの表現は、これと同じです

bとcを比較すると、その結果は0か1になり、その後にaと比較することになります。
このロジックですべてが明らかになるのですが、なぜかaとbが先に比較されるような気がするのです(もちろん間違っているかもしれませんが)......。
 
Urain:

表情がこれと同じですね。

bとcを比較し、その結果が0か1か、そしてこの結果とaを比較する。

なるほど、でも、この式では、こんな仕掛けがあるのですが、うまくいきません。

void OnStart()
  {
//---
   int a=1;
   int b=2;
   int c=3;
   int d=3;
//---   
   if(a!=b<c==d)Alert("");
   else Alert("Условие не верно");
//---
  }
 
Interesting:
...ただ、なんとなくaとbが先に比較されるような気がするのですが...(もちろん間違っているかもしれませんが)。
そうですね、機械的に間違っているだけで、まず左側の比較があって、次に右側の比較があるんです。
 
sergey1294:

なるほど、でも、この式では、こんな仕掛けがあるのですが、うまくいきません。

いや、運営の優先順位やウラ インのコメントも考慮した上でということなのですが。

この表現も問題はないのですが、非常に不具合が発生します。

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

この問題については、編集の「優先順位と操作の順序」の 項で詳しく説明しています。(優先順位や操作の順番を考慮する必要があります)。

つまり、私の理解が正しければ、コンパイラによる比較は次のようになります(Nikolayのコメントを考慮に入れています)。

if((a!=(b<c))==d)Alert("")
 
Interesting:
リストの大きさはどのくらいですか?リストのサイズに制限があるのかもしれませんが...。
ちょうど100行。
 
-Alexey-:
ちょうど100行。

私のライブラリの1つ(110関数)で実験、リストに100から106を表示(常に違う数字が表示され、110は表示されない)。

 

.csvファイルを読み込む際、いくつかの問題が一度に発生しました。誤作動の原因を探るため、簡単なスクリプトを書いてみた。このスクリプトは、"test.csv "というファイルからデータを読み込む。ファイルの終端に到達すると、forループの反復回数、ファイルサイズ、ファイルポインタの位置をログに出力します。ファイル "test.csv "は15行しかないので、ループ "for "の反復回数は14回でなければならないのに、ジャーナルは0回を生成しているのだ。ファイルサイズは正しく表示されるが、ファイルエンドポインタの位置がなぜかファイルそのものより大きなサイズになっている。スクリプトコードです。

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

"test.csv "ファイルとログを添付しました。この質問について、どなたかご意見をお聞かせください。

P.S. 最も興味深いのは、このスクリプトがMT4でエラーなしに動作することです。

ファイル:
test.zip  1 kb
 
DenisR:

.csvファイルを読み込む際、いくつかの問題が一度に発生しました。誤作動の原因を探るため、簡単なスクリプトを書いてみた。このスクリプトは、"test.csv "というファイルからデータを読み込む。ファイルの終端に到達すると、forの繰り返し回数、ファイルサイズ、ファイルポインタの位置をログに出力します。ファイル "test.csv "は15行しかないので、ループ "for "の反復回数は14回でなければならないのに、ジャーナルは0回を生成しているのだ。ファイルサイズは正しく表示されるが、ファイルエンドポインタの位置がなぜかファイルそのものより大きなサイズになっている。スクリプトコードです。

"test.csv "ファイルとログを添付しました。この質問について、どなたかご意見をお聞かせください。

P.S. 最も興味深いのは、このスクリプトがMT4でエラーなしに動作することです。

一見すると、ファイル全体が str...に書き込まれているように見えます。
FILE_ANSIフラグを追加、デフォルトでunicodeを読み込むため:)
また、最後に空白行があるため、iは15になります。