配列の参照

 

動機は?

ポイントは、七面鳥では、OnCalculateに渡される時系列にアクセスする必要があることがよくあるということです。

これらの関数のネストは非常に重要であり、OnCalculateからこの配列をパラメータとしてコールチェーン全体にドラッグする必要があります。

チェーンの重要な部分では、このアレイは地獄では必要ありませんが。

私たちが欲しいもの

このように、何らかの形で配列を参照することができます。

class TimeReference
{
//
   datetime Time[];
};

TimeReference TimeRef;

datetime F()
{
   return TimeRef.Time[0];
}

int OnCalculate(const int bars,
                const int counted,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& sprd[])
{
   TimeRef.Assign(time);
   F();
}

BUT.必須条件 -配列のコピーをしては ならない。

一見、非現実的な話に思えるかもしれません。でも、できるんじゃないかと思うんです。

どうですか、皆さん?

 

メモリの一部です。 MQLは明示的にメモリを指し示すことはありません。

しかし、memcpyを 使えば、必要なものを返してくれます。

そして、その値を好きなところにドラッグすることができる。そして、同じようにmemcpyを使う。

DLLに関する私の記事をチェックする

 
sergeev:
このポインターを元に戻すにはどうしたらいいのでしょうか?
 
同じmemcpyで、ポインタが渡されるところです。
 
sergeev:
をmemcpyで実行します。 そこでポインタが渡されます。

いや、ポインターは取れても、スリップは取れない。

___________

なるほど、だからちゃんとやるのは無理なんでしょうね。

 
TheXpert:
いいえ、ポインターを取ることはできても、滑らせることはできないのです。

を挿入し、テストする。

 
sergeev:

を挿入し、テストする。

例を挙げてください。
 
TheXpert:
例を示してください。

まあ、記事に書いてあるんでしょうけど。

コードを挿入しようとすると、サーバーがフリーズしてしまいます。

 
sergeev:

まあ、記事に書いてあるんでしょうけど。

記事にはないんですけどね。配列からあらかじめ用意された配列へのメモリコピーしかない。
 
https://www.mql5.com/ru/articles/364#3

第一例

int ソースが渡される - 実質的にはメモリアドレス

という配列にコピーされます。

Избавляемся от балласта самодельных DLL
Избавляемся от балласта самодельных DLL
  • 2012.01.31
  • o_O
  • www.mql5.com
Если MQL5-программисту недостаточно функционала языка, он вынужден обращаться к дополнительным инструментам. Для этого приходится использовать другой язык программирования и создавать промежуточную DLL. В MQL5 имеется механизм представления разных типов данных с помощью структур и передачи их в API, но к сожалению, MQL5 не отвечает нам на вопрос о том, как вытянуть данные из принятого указателя. В данной статье мы поставим точку в этом вопросе и покажем простые механизмы обмена сложными типами данных и работе с ними.
 

ということは、すべての型に対してmemcpyをオーバーロードしているのでしょうか?

ただ、アドレスサイズが64ビットと長いことを忘れてはいけません。

--------------

提案その1:long ArrayGetAddress( オブジェクト配列)のような ネイティブ関数を作るよう開発者に依頼するべきだと思いますか?

もし彼らがやらないのであれば、提案2:#ifdefを押すべきです。 Renatはそれを実装すると約束しました。