MQL5では、常に悪用される可能性があるのです。 ;) - ページ 8

 
ペール缶の中で水をかき混ぜているようなものです。
変数へのポインタ、関数へのポインタ、参照によるアドレスの取得はすべてMQLの制限事項です。
構文で用意されていないものでもなく、メモリの扱いを禁止しているのです。
void*ポインタも、通常のC言語的な意味でのポインタではありません。
クラスオブジェクトがコピーされないように作業するためのオブジェクトです。
同一参照&はアドレスの取り方ではなく、コンパイラがオブジェクトをスタックにコピーせずに渡すための指定子である。
Syakhで書きたい、Syakhで書いてDLを取り込みたい、それでいいんです。

もし、本当にかゆいところに手が届く、foregn dllができないのであれば、ネイティブdllからのインポートは大きな罪にはなりませんし、これによってMQL製品が損なわれることもありません。

大騒ぎするわけではありませんが、例えば、4バイトのポインタとimport memcpyだけでターミナルプロセス内のメモリを操作することができます。

#import "msvcrt.dll"
int memcpy(short&,short&,int)。
int memcpy(int&,int&,int)。
int memcpy(double&,double&,int)。
int memcpy(string&s,string&int)。
#インポート

ラッパー・クラスのようなものです。

構造体TPtr
{
int addr;
TPtr():addr(0){}となります。
TPtr(const TPtr& r):addr(r.addr){}となります。
template<typename _T> TPtr operator =(_T& r) {.
addr = memcpy(r,r,0);
はこれを返します。
}
};


とユサゲの例です。

文字列 sval = "123";
short bval = 123;
int ival = 123;
double dval = 123;

TPtr p = sval;
int ptrs = p.addr;
p = bval;
int ptrb = p.addr;
p=イバル。
int ptri = p.addr;
p = dval;
int ptrd = p.addr;

こうすれば、メモリを自由に操ることができる...。いつものCポインターではなく、やはり

どのように役立つのでしょうか?
まあ、例えば、GlobalAllocというインポート機能を使えば、モジュール間のデータ転送にグローバル変数を使う必要がなくなるわけです。
GlobalAllocは、フクロウや誘導の仕事のためのヒープや内部静的仮想に関連付けられていない、プロセスにメモリを割り当てます。
その中に任意のサイズの配列を配置し、インデックス付けにmemcpyを使用することができます。

輸入例です。

#define HANDLE int
#定義 LPVOID int

#import "kernel32.dll"
HANDLE GlobalAlloc(uint flags, uint cnt)。
LPVOID GlobalLock(HANDLE hmem)。
int GlobalUnlock(HANDLE hmem);
HANDLE GlobalFree(HANDLE hmem)。
#import "ntdll.dll".
// GetLastErrorはMTに既に存在するので、WinAPIから使用する。
int RtlGetLastWin32Error();
#インポート


使用方法の一例です。

// owl N1, レートの配列を用意する。

MqlRatesレート[123]。
// ここでは
HANDLE memid = GlobalAlloc(GMEM_MOVEABLE, 123*sizeof(MqlRates));
LPVOID ptr=GlobalLock(memid);
memcpy(ptr,rates[0].time, 123*sizeof(MqlRates)); // ここでは、コンパイルするために、プロトタイプ int memcpy(int&,const datetime&,int) が必要です。
GlobalUnlock(memid)。
// メモリディスクリプタを送信する
EventChartCustom(CID, MY_SEND_DATA, memid, 0, "");

// フクロウ N2
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if( id ==CHARTEVENT_CUSTOM+MY_SEND_DATA)
{
LPVOID ptr = GlobalLock((HANDLE)lparam);
MqlRatesレート[123]。
// レートがある
memcpy(rates[0].time,ptr,123*sizeof(MqlRates)); // ここにプロトタイプがあります int memcpy(datetime&,const int&,int)
GlobalUnlock(memid)。
GlobalFree(memid)。
}
}

以上、パイプ、外部ファイル、余ったDLLのインポートなどはありません。
私は、大きな可能性を秘めた小さなサンプルを急いだだけなのですが、私の心はどこまでも広がっています。
そうですね、GlobalAllocに関しては、GMEM_MOVEABLEを使用して、ロックとメモリのアンロークを行い、特定の操作のためにポインタを取得し、それを返すことをお勧めします。
グローバルメモリを固定で使用する場合、オープンディスクリプタがN個になるとフラグメンテーションが発生する可能性があります...
OSカーネルが負荷に応じて望むものです。
がんばれ、ハッカーたち )))
 
alexsis78:

曖昧な表現ではなく、例えば、4バイトのポインタだけを使い、memcpyをインポートすれば、端末プロセス内のメモリを操作することができます
は、ちょっと枝葉末節を間違えていますね。
 

Henry Warrenの古い本に "Algorithmic tricks for programmers "というのがあり、そのようなトリックがたくさん載っている。しかし、C++のポインタがないため、ほとんどの例はMQLで動作しません。

何か楽しいことを探してみます。

 
私の例と似たようなものはCにはないでしょう )))まずMQLであること、次にCのポインタ構文のワークアラウンドであること。

プラスを知っている人のためにもう少し明確に説明します。

C の場合:
int var = 0; // 変数 var の宣言
int* ptr = &var; // 変数 var へのポインタの取得
int var2 = *ptr; // var へのポインタによる値を var2 にコピー

MQL の場合:
#import "msvcrt.MQL" #import "msvcrt.dll"
uint memcpy(int& destination, const int& source, int cnt); // 変数destinationのアドレスを取得するmemcpyのプロトタイプ
uint memcpy(int& destination, uint ptr, int cnt);// アドレス ptr からコピーする memcpy プロトタイプ
// コンパイラは,第2引数の型差により,2つのプロトタイプのうち1つを代入する
// ポインタ型、例えば uint とします
#import

int var = 0;
uint ptr = memcpy(var,var,0); // 変数 var へのポインタ ptr を取得します(ここでは memcpy は何もコピーせず、アドレス var を返します)
int var2
memcpy(var2, ptr, 4); // ポインタ ptr から変数 var2 に 4 バイトまたは sizeof(int) をコピーする (memcpy の第 2 プロトタイプが動作)

この方法が役に立つことを願っています )))
 
alexsis78:
Cに私の例のような類似性は見当たりません)) ご参考になれば幸いです ))))

の人、何かを書くために書いてはいけない。

memcpyを 使ったこれらの亜種はすべて数年前に咀嚼されたもので、今回のトピックにはふさわしくありません。

 
o_O:

人間、何かを書くために書くのではありません。

これらのmemcpyオプションはすべて数年前に咀嚼されたもので、今回のトピックには適しません。

私もそう思いますし、さらにポインタ演算のないバリアントが記述されていた、つまり不良品だったのです。C#では、ポインターは必要ありません。安全性は確保されていますが、あくまで個人利用であり、ネットワーク経由でのインストールは禁止されているなど、多くの制約があります。
 

コードベースに載せたかったのですが、気が変わりました。

MQL5をKaggleで使用、数字認識タスク

Digit Recognizer | Kaggle
  • www.kaggle.com
Kaggle is your home for data science. Learn new skills, build your career, collaborate with other data scientists, and compete in world-class machine learning challenges.
ファイル:
sampleMNIST.mq5  25 kb
 
o_O:

人間、何かを書くために書くのではありません。

これらのmemcpyオプションはすべて何年も前から咀嚼されており、このトピックには適していません。

なぜ「不適切」なのか?

もうどこにあったのか忘れてしまって、見つけられませんでした...。

ちなみに、外部DLLを呼び出さずに配列へのポインタを保存するのは、技ありだと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい。

 
George Merts:

なぜ「ふさわしくない」のか?

もうどこにあったのか忘れてしまって、見つけられませんでした...。

ちなみに、外部DLLを介さずに配列へのポインタを保存するのは、偉業だと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい

配列をクラスでラップすると、その配列へのMQL疑似ポインタをnew
 
Alexey Volchanskiy:
配列をクラスで囲むと、MQLの疑似ポインタをnew

Alexey、OnCalculate()関数で 発行された配列をクラスにラップする方法も教えてください。この場合、ポインタをコピーしないとできません。

今のところ、データをクラス配列にコピーして、このオブジェクトへのポインタを引っ張ってきているだけです。しかし、そうすると、余計にコピーすることになり、私の見るところ、頻繁なティックと多数のチャートでかなり顕著な「重さ」が加わります。このコピーから解放されたい。しかし、DLL(標準または自作)経由の松葉杖を除いて、提案できることはありません。

サービスデスクでは、「オブジェクトは削除されている可能性があります」と何度も押し戻されます。しかし、これらは独自のアレイなのです私が「オブジェクトを作って、それを削除するとポインタが無効になるかもしれない」と言うと、「その責任を取るのは私だ」と返されます。ここには「二重の道徳」が働いているのだ。

DLLはどうでもいいんだけどさー、こういうインジケータは実行時に常に確認が必要なんだよねー、面倒くさいなー...。