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

 
A100:

要するに、.mqhで関数実装を定義して、どの.ex5でも問題なく使えるというわけではありません。

:)

しかし、ある .ex5 を使って別の .ex5 の関数を呼び出す 場合、その名前の関数が両方に存在するにもかかわらず、名前空間を正確に指定する必要があります。つまり、 ::In() は理論的には問題を解決するはずです。 そして、もし解決しないなら - これは修正されるべきバグなのです。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

ServiceDeskの回答はやめましょう。

"1.mq5をコンパイルする際、関数B()の内部で、
imported A() とexported A() のどちらの関数が呼ばれるべきかが不明です - コンパイラは同じ関数を意味していると理解していないためです。"

形としては正しいのですが、もしその気になれば、コンパイル時のモジュール名が利用可能(#importで指定)なので、コンパイラに同じ関数であることを伝えることも可能(であるべき)なのです。

さらに言えば、最初に :: をある場所に置いてコンパイルし、次に削除して別の場所に :: を置くと、すべてがうまくいきますが、あなたも同意するはずです - 非常に不便なので、10~15回このように強制的に並べ替えた後、私は #define に切り替えたのです。

 
A100:

ServiceDeskの回答はやめましょう。

"1.mq5をコンパイルする際、B()関数内部で、どの関数が呼ばれるべきかが不明確です。

インポートされたA()またはエクスポートされたA() - コンパイラが同じ関数を意味していることを理解できないため".

絶対に、そういうことです。


しかし、コンパイラはその気になれば、コンパイル時にモジュール名が利用可能である(#importで指定する)ことを繰り返すので、同じ関数であることを伝えることができる(はずだ)のです。

このようなヒントのために、コンテキスト解決演算子「::」がありますが、この場合はモジュール(ファイル)名も同じであるため適用されません。

アドバイスは適切で、プログラムの構造を変更することです。

さらに言えば、ある場所に :: を置いてコンパイルし、その後 :: を削除して別の場所に置くと、すべてがうまくいくのですが、非常に不便です。

不便なだけでなく、「人種差別的」、「不謹慎」、「醜い」、「鼻につく」といったこともあります。 コンパイラをごまかす試みは、あなたが望むものを実装するための他の選択肢がない場合にのみ存在する権利があります。 この場合、多くの選択肢があります。


で、10~15回ほど無理やり並べ替えた後、#defineに切り替えた。

パラメータ化されたdefineは、型検出が望ましくない場合や、パラメータを「冗長な」テキストの塊に置き換える場合にのみ有用です。 インライン関数の代用として、defineはプログラムの健全性に害を及ぼすことは間違いありません。

--

.ex5のライブラリの使用は拒否して、すべて問題なく動作します。実用的な使用は、隠蔽実装(販売時)だけで、他のケースでの使用は見当たりません。

売り物として書いているのでしょうか?

 
MetaDriver:

売り物として書いているのでしょうか?

自分のために。

.ex5がないとできないんです。F( string& [] ) のような関数もありますが、なぜか.dllには収まりません :)

セパレーターに通せばいいのかもしれませんが、まだ試していません。

 
A100:
MQL5にはちょうどインライン関数がなく(フォームで)、代わりにパラメトリックマクロを使っていますが、これは型制御ができないので、ちょっと正しくないですね。

また、コンパイラは式を最適化しないので、さらにスピードのペナルティが発生します。確認したほうがいい。

ところで、インライン化についてですが、これはうまくいきます。そのせいでデバッガーに問題があった。

 
TheXpert:

ところで、インライン化についてですが、うまくいっていますよ。また、そのためにデバッガーに問題が発生することもありました。

つまり、コンパイラーレベルで動作するわけです。そして、私はそれが言語レベルで動作するようにしたいと思います。 私は上記の例を与えた - すべてが不可解な "コンパイラをバイパス "を通じて動作し、直接の仕事は、余分な手順、時には重要な必要としながら、あなたが1つのファイルに1と同じ関数の説明と実装を含まないように提案したように確かに可能ですが、その後10完了.mqhは100小さな.mqhに分割されているため。

まだ、スピードを追いかけてはいないんです。主なものは利便性と、コードの量が指数関数的に 増加しないことです。

MQL5で#if #elseのアナログを使う必要性にも直面しました(今のところちょっと厄介ですが、あちこちでうまくいっています)

 
A100:

スピードはまだ求めていない。主なものは利便性と、コードの量が指数関数的に増加しないことです。

それはあなた次第です。しかし、病的なまでのメタクオーツ好きからすると、このようなマクロでレーキを獲る確率はゼロには程遠い。
 

A100:

.ex5がないと動きません。F( string& [] ) のような関数もありますが、どうにも.dllに収まりません :)

....

げっ... :)

私は、.ex5ライブラリの代わりにDLLを使うことを勧めていません。 たくさんの.mqhと1つの実行可能な.mq5だけで、それ以上ではありません。

 
MetaDriver:

たくさんの.mqhと1つの実行可能な.mq5だけで、他には何もありません。

1つのコードを3つの異なる端末で使用する場合、少なくとも1つの.ex5(すべてで共有)が必要ということです。もしそうなら、上記の問題に戻りますが、モジュールは2つしかないのに、正常にコンパイルされないのです。
 
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, 0, true )
ChartGetInteger( chart_ID, CHART_BRING_TO_TOP, true )
非取引時間帯には動作しません。非取引時に、他のチャートの上にチャートを配置することを妨げるものは何ですか?