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

 

関数の引数が 右から左へ計算されない

int i = 0;
int _etLastError() { return i; }
int _tringGetCharacter( string, int ) { i = 5041; return 0; }
void OnStart()
{
    string abc = "ABC";
    ResetLastError();
    Print( ::StringGetCharacter( abc, 1024 ), ":", GetLastError()); //(*)слева направо
    Print(   _tringGetCharacter( abc, 1024 ), ":", _etLastError()); //   справа налево
}

文字列の結果 (*) : 0:5041

いずれの場合も期待される0:0

 
A100:

関数の引数が 右から左へ計算されない

文字列の結果 (*) : 0:5041

どちらも想定内でした。0:0

これはエラーではありません。コンパイラは、どの順番で引数を計算するかを自ら決定する。

それを考慮すればいいんです。

 
Koldun Zloy:

これはエラーではありません。どの順番で引数を計算するかは、コンパイラが自ら決定する。

このエラーは次のようなものです。最近まで、https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(日付とドキュメントからの抜粋に注意してください:保証されて います)により、順序が厳密に定義されていました。その後、順番は静かに変更され(ドキュメントを含めて)、文明的な方法で変更できるようになりました - インラインhttps://www.mql5.com/ru/forum/1111/page2042#comment_5860752 を介して しかし、ユーザーはどのようにそれを知るべきでしょうか?ユーザーはそれを推測すべきなのでしょうか?あるいは、何かツールを使う前に、ドキュメントに目を通すことでしょうか。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.04
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

コンパイルエラーなど

#define MACRO( X )      #X
void OnStart()
{
        Print( MACRO( AC/DC    )); //нормально
        Print( MACRO( AC\\DC   )); //error: '\' - illegal escape sequence
        Print( MACRO( ABC\nDEF )); //error: '\' - illegal escape sequence
        Print( MACRO( 'ABC'    )); //error: '' - single quote needed
        Print( MACRO( "ABC     )); //error: '' - double quotes are needed
        Print( MACRO( "ABC"    )); //Результат: ABC вместо "ABC"
        Print( MACRO( '"'ABC   )); //нормально
}
 
A100:

間違いはこれです。最近まで、https://www.mql5.com/ru/forum/1111/page2040#comment_5858419(日付とドキュメントからの抜粋に注意:保証されて います)により、順序が厳密に定義されていたのです。その後、(ドキュメントを含めて)静かに順序が変更され、インラインhttps://www.mql5.com/ru/forum/1111/page2042#comment_5860752 を介して、文明的な方法で変更することが可能になりました。しかし、ユーザーはどのようにそれを知るべきでしょうか?ユーザーはそれを推測すべきなのでしょうか?あるいは、ツールを使用する前にドキュメントに目を通す?

引数の計算順序に依存するようなコードを書かなければいいだけです。

C++では、たとえinlineキーワードがなくても、コンパイラは関数をインライン化する権利があります。

MQLではインラインキーワードはなく、コンパイラが任意に関数を挿入します。

右から左へ計算する順番は、この順番で引数をスタックに載せるためだったようだ。

が、レジスタを通過することもある。

また、組み込み関数では、そのような引数の受け渡しは全くありません。

 
Koldun Zloy:

1.引数の計算順序に依存するようなコードを書かなければいいだけです。

2.C++では、inlineキーワードがなくても、コンパイラは関数をインライン化する権利を持っています。

3.MQLではインラインキーワードはなく、コンパイラが任意に関数を埋め込むだけです。

4.右から左へという計算順序は、引数がこの順序でスタックに置かれることと関係があるようだ。

が、レジスタを経由して渡すこともできます。

5.また、組み込み関数には引数の受け渡しが一切ありません。

1.ドキュメントで逆順が保証されており、今回のコードの方がシンプルでわかりやすいのに、なぜそうしてはいけないのでしょうか?5 + (2*3)操作の優先順位を 使うことを否定し、どこにでも括弧(5 + (2*3))をつけるよう要求したほうがいいかもしれない。- 急遽、変更になった場合

2.C++コンパイラは埋め込み関数に一定の要件を課しており、そのような状況を排除しています。https://www.mql5.com/ru/forum/1111/page2136#comment_6454818

3.このように導入が提案されました。

4.レジスタでは(スタックとは異なり)引数は逆順も含め、どのような順番でも置くことができる

5.重要なのは渡す順番ではなく、引数を計算する順番であり、これは複数の引数を持つどのような関数でも同じです。そして、C++は関数をインライン化する(しない)前にそれを考慮します(項目2参照)。

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.01.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

1.ドキュメントで逆順が保証され、コードがよりシンプルで明確になるのであれば、なぜそうしないのでしょう。5 + (2*3) 使用を否定し、どこにでも(5 + (2*3))の括弧を付けるよう要求した方がいいかもしれない。- 急遽、変更になった場合

2.C++コンパイラは埋め込み関数に一定の要件を課しており、そのような状況を排除しています。https://www.mql5.com/ru/forum/1111/page2136#comment_6454818

3.このように導入が提案されました。

4.レジスタでは(スタックとは異なり)引数は逆順も含め、どのような順番でも置くことができる

5.重要なのは渡す順番ではなく、引数を計算する順番であり、これは引数が2つ以上ある関数の順番です。そして、C++は関数をインライン化する(しない)前にそれを考慮します(ポイント2参照)。

3.それで何が得られるのかわからない。コンパイラがinlineを明示的に指定せずに関数を埋め込むことを禁止したいのでしょうか?

2.意味がわからないんですけど。

4.私は、あの注文とそのキャンセルが何に関係しているのかを示唆しただけです。たまたまそうなったのではなく、これから先もずっとそうなのだと思います。恐ろしいことは何もない。

5.あなたは勘違いしています。C++では、引数の計算順序は定義されていない。

1.私は長年C++で書いていますが、これが問題だと思ったことはありません。


 
Koldun Zloy:

3.これで何ができるのかわからない。コンパイラがinlineを明示的に指定せずに関数を埋め込むのを防ぎたいのでしょうか?

4.私は、この注文とそのキャンセルがどのような関係にあるのかを示唆したに過ぎません。たまたまそうなったのではなく、今もずっとそうなのだと思います。ひどいことはないんですよ。

5.あなたは勘違いしています。C++では、引数の計算順序は未定義である。

3.インラインのない関数の引数の計算順序をコンパイラが変更することは許されないと言いたかったのです。

5.計算の順番は実装(コンパイラ)によって定義され、かなり具体的(右から左か、左から右か)であり、例えばここです。

void OnStart()
{
    ResetLastError();
    Print( GetLastError(), ":", StringGetCharacter( "abc", 1024 ), ":", GetLastError());
}

2-1-3なのか2-3-1なのか、どの順番なのかがはっきりしない。

結果:5041:0:5041。

期待値:左から0:0:5041または

5041:0:0 右から左へ

 
A100:

2-1-3なのか2-3-1なのか、どの順番なのかが不明です。

明らかに曖昧なコードを書く理由がわからないのですが?

 
fxsaber:

明らかに曖昧なコードを書く理由がわからないのですが?

同様の質問をあなたにもhttps://www.mql5.com/ru/forum/1111/page2037#comment_5842347

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2017.10.02
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы