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

 
Alexey Navoykov:
C#ではコンパイル段階で計算される定数式にのみconst 指定子が使われますが、C++にはそのアナログであるconstexprがあり、MQLには それがないのです。

一般的には、言語の構文構造の問題である。

自然言語における定数とは...まあ、恒例といえば恒例なんですけどね))

C++では,コンパイラが変数のスコープ(またはライフタイム)内に定数があるかどうかを機械的にチェックします

C#では、定数は自然言語のルールに近い構文的な意味を持つ


そして、この議論はそのためのものです。

const MqlTick _Tick; // Текущий _Symbol-тик.

少なくともMQL4にはBidとAskがあり、それが正当であるかどうか誰も疑問視していませんでした。




プロファイラーによると、SymbolInfoDouble()とSymbolInfoTick()への永久アクセスは、最適化速度を低下させることが分かっています。

 
Mihail Matkovskij:

コンパイラを変更するにはどうしたらよいですか?

900ビルドからMetaEditorにコンパイラが内蔵されていることがわかりました。https://www.mql5.com/ru/forum/21374

では、なぜVSがインストールされているディレクトリにつながる行があるウィンドウが表示されるのでしょうか?

コンパイラ

Обратите внимание, что компилятор переехал внутрь MetaEditor, начиная с 900 билда
Обратите внимание, что компилятор переехал внутрь MetaEditor, начиная с 900 билда
  • 2014.03.01
  • www.mql5.com
Консольный компилятор MQL4/MQL5 остался, обновляется вместе с платформами МетаТрейдер 4/5 и всегда доступен по ссылкам:.
 
Igor Makanu:

デマゴギーは抜きにして、現在の価格に できるだけ早くアクセスできるようにする必要があります。プロファイラーは、SymbolInfoDouble()とSymbolInfoTick()への一定の呼び出しが最適化速度を低下させていることを示しています。

さて、ここで先ほどから提案されている、現在のシンボル名の代わりにNULLを渡す機能を追加します。一般的には、シンボルのテキスト値ではなく、ハンドルでアクセスする必要があります。 しかし、開発者はそのような複雑なことはしないと思います。 問題が突飛なようです。

上記の測定では、テスターのアイドルラン(負荷なし)のわずか6%のコストでした。 また、実用的なコードでは一桁少なくなります。 このような些細なことに注意を払う価値はありませんし、ハンドラ内でこれらの関数を複数回呼ぶこと自体、誤った判断となります。

 
Alexey Navoykov:

さて、ここで以前、現在のシンボル名の代わりにNULLを渡す 可能性を追加することが提案されました。しかし、一般的には、文字のテキスト値ではなく、ハンドルでアクセスする必要があります。 しかし、開発者がそのような複雑なことをする可能性は低いと思います。 また、その価値はないように思います。 この問題は、かなり突飛なものです。

すでに動作しているが、加速がない(確認した) - どうやらすべてがすでに最大限に加速されているか、またはその逆である - 加速のためにまだ長い道のりである(開発者に下線を引くように依頼してください)。

 
A100:

したがって、厳密性を期すために、_Digitsの代わりにDigits()を使用する必要があります。そうすると、形式的に、論理矛盾は生じない。Digits()はconst修飾子によって束縛されない。

私の理解では、_DigitsはMT4との互換性のために必要であり、それ以上のものではありません。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

バグ、バグ、質問

イリヤス さん 2020.05.20 15:39

Symbol() の呼び出しは、Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason() と同様に、常にグローバル変数 _Symbol にアクセスする。

 
Mihail Matkovskij:

デバッグ中やインジケータが動作しているときに、ログに突然Stack overflowと書き込まれます。デバッグそのものは、「Critical error occurred, debugging stopped」というメッセージがポップアップ表示されます。以下は私の類似スレッドです。https://www.mql5.com/ru/forum/338301。 しかし、コンパイル中はコンパイラが叱ることもなく、すべてうまくいっています。デバッグの際、どの時点でプログラムがクラッシュしたかを判断することは不可能です。

コンパイラのせいかな?使っているコンパイラにはあまり興味がないのですが、私の設定だとこんな感じです。

VSをインストールしているので、設定にこのリンクがあります。ということは、コンパイラも適当なのか......?でも、VSがないときにどんなコンパイラがあったかというと、正直なところ手を出していないんです。もしかしたら、そのコンパイラーに戻って、そのコンパイラーでプロジェクトをコンパイルしてみるべきかもしれませんね。

どうにかならないかと考えているうちに、別の端末のアップデートが来て、デバッグが正常にできるようになりました。なんとかエラーを見つけることができました。一部のメソッドがループし、自分自身を呼び出していた。そのため、"Stack overflow "というメッセージを出してプログラムがクラッシュしてしまったのです。しかし、動作するデバッガーの助けを借りて、問題のある行をすべて見つけ出し、それを修正することができました。デバッグをしながら、迅速にバグフィックスしてくれた開発者に感謝します。

削除済み  

в естественном языке (в математике) константа это... ну как бы константа! ))

C++では、定数とは、変数のスコープ(またはライフタイム)における不変性をコンパイラが機械的にチェックするものである。

C++でもMQLでも、定数は作成時に一度定義すれば二度と変更することはありません。スコープは関係ない。

数学と大差ない。


削除済み  
Mihail Matkovskij:

900ビルドからMetaEditorにコンパイラが内蔵されていることがわかりました。https://www.mql5.com/ru/forum/21374

では、なぜこのウィンドウには、VSがインストールされているディレクトリにつながる行があるのでしょうか?


DLLを記述する場合は、VSコンパイラを使用します。

 
fxsaber:

このことから、_Digits,_Point , _Period, _LastErrorなどを直接 使う意味がないことが改めて確認できます(_SymbolもNULLで置き換えることができますし)。実際には、const volatileとして宣言する必要があります。

そして、あなたは逆に、追加することを提案しています。

 
A100:

このことから、_Digits,_Point , _Period, _LastErrorなどを直接使用 する意味がないことが改めて確認されました。また、_SymbolでもNULLに置き換えることができる。

そして、あなたは逆にこのシリーズの補足を申し出ているのです。

ポイントは、参照渡しが可能な点にある。