MQL5では、常に悪用される可能性があるのです。 ;) - ページ 8 123456789 新しいコメント Alexander Gandzyuk 2016.12.27 21:48 #71 ペール缶の中で水をかき混ぜているようなものです。 変数へのポインタ、関数へのポインタ、参照によるアドレスの取得はすべて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カーネルが負荷に応じて望むものです。 がんばれ、ハッカーたち ))) In MQL5 there is --- 2016.12.27 22:39 #72 alexsis78: 曖昧な表現ではなく、例えば、4バイトのポインタだけを使い、memcpyをインポートすれば、端末プロセス内のメモリを操作することができます は、ちょっと枝葉末節を間違えていますね。 Alexey Volchanskiy 2016.12.28 09:12 #73 Henry Warrenの古い本に "Algorithmic tricks for programmers "というのがあり、そのようなトリックがたくさん載っている。しかし、C++のポインタがないため、ほとんどの例はMQLで動作しません。何か楽しいことを探してみます。 Alexander Gandzyuk 2016.12.28 09:43 #74 私の例と似たようなものは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 プロトタイプが動作) この方法が役に立つことを願っています ))) In MQL5 there is 自作 DLL の排除 --- 2016.12.28 10:16 #75 alexsis78: Cに私の例のような類似性は見当たりません)) ご参考になれば幸いです ))))の人、何かを書くために書いてはいけない。memcpyを 使ったこれらの亜種はすべて数年前に咀嚼されたもので、今回のトピックにはふさわしくありません。 Alexey Volchanskiy 2016.12.28 11:01 #76 o_O:人間、何かを書くために書くのではありません。 これらのmemcpyオプションはすべて数年前に咀嚼されたもので、今回のトピックには適しません。 私もそう思いますし、さらにポインタ演算のないバリアントが記述されていた、つまり不良品だったのです。C#では、ポインターは必要ありません。安全性は確保されていますが、あくまで個人利用であり、ネットワーク経由でのインストールは禁止されているなど、多くの制約があります。 Vadim Konyaev 2016.12.28 16:21 #77 コードベースに載せたかったのですが、気が変わりました。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 Georgiy Merts 2016.12.28 16:25 #78 o_O:人間、何かを書くために書くのではありません。 これらのmemcpyオプションはすべて何年も前から咀嚼されており、このトピックには適していません。なぜ「不適切」なのか? もうどこにあったのか忘れてしまって、見つけられませんでした...。 ちなみに、外部DLLを呼び出さずに配列へのポインタを保存するのは、技ありだと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい。 Alexey Volchanskiy 2016.12.28 19:42 #79 George Merts:なぜ「ふさわしくない」のか? もうどこにあったのか忘れてしまって、見つけられませんでした...。 ちなみに、外部DLLを介さずに配列へのポインタを保存するのは、偉業だと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい 配列をクラスでラップすると、その配列へのMQL疑似ポインタをnew Georgiy Merts 2016.12.30 05:18 #80 Alexey Volchanskiy: 配列をクラスで囲むと、MQLの疑似ポインタをnewAlexey、OnCalculate()関数で 発行された配列をクラスにラップする方法も教えてください。この場合、ポインタをコピーしないとできません。 今のところ、データをクラス配列にコピーして、このオブジェクトへのポインタを引っ張ってきているだけです。しかし、そうすると、余計にコピーすることになり、私の見るところ、頻繁なティックと多数のチャートでかなり顕著な「重さ」が加わります。このコピーから解放されたい。しかし、DLL(標準または自作)経由の松葉杖を除いて、提案できることはありません。サービスデスクでは、「オブジェクトは削除されている可能性があります」と何度も押し戻されます。しかし、これらは独自のアレイなのです私が「オブジェクトを作って、それを削除するとポインタが無効になるかもしれない」と言うと、「その責任を取るのは私だ」と返されます。ここには「二重の道徳」が働いているのだ。 DLLはどうでもいいんだけどさー、こういうインジケータは実行時に常に確認が必要なんだよねー、面倒くさいなー...。 123456789 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
変数へのポインタ、関数へのポインタ、参照によるアドレスの取得はすべてMQLの制限事項です。
構文で用意されていないものでもなく、メモリの扱いを禁止しているのです。
void*ポインタも、通常のC言語的な意味でのポインタではありません。
クラスオブジェクトがコピーされないように作業するためのオブジェクトです。
同一参照&はアドレスの取り方ではなく、コンパイラがオブジェクトをスタックにコピーせずに渡すための指定子である。
Syakhで書きたい、Syakhで書いてDLを取り込みたい、それでいいんです。
もし、本当にかゆいところに手が届く、foregn dllができないのであれば、ネイティブdllからのインポートは大きな罪にはなりませんし、これによってMQL製品が損なわれることもありません。
大騒ぎするわけではありませんが、例えば、4バイトのポインタとimport memcpyだけでターミナルプロセス内のメモリを操作することができます。
ラッパー・クラスのようなものです。
こうすれば、メモリを自由に操ることができる...。いつものCポインターではなく、やはり
どのように役立つのでしょうか?
まあ、例えば、GlobalAllocというインポート機能を使えば、モジュール間のデータ転送にグローバル変数を使う必要がなくなるわけです。
GlobalAllocは、フクロウや誘導の仕事のためのヒープや内部静的仮想に関連付けられていない、プロセスにメモリを割り当てます。
その中に任意のサイズの配列を配置し、インデックス付けにmemcpyを使用することができます。
輸入例です。
#define HANDLE int
#定義 LPVOID int
使用方法の一例です。
// 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カーネルが負荷に応じて望むものです。
がんばれ、ハッカーたち )))
曖昧な表現ではなく、例えば、4バイトのポインタだけを使い、memcpyをインポートすれば、端末プロセス内のメモリを操作することができます
Henry Warrenの古い本に "Algorithmic tricks for programmers "というのがあり、そのようなトリックがたくさん載っている。しかし、C++のポインタがないため、ほとんどの例はMQLで動作しません。
何か楽しいことを探してみます。
プラスを知っている人のためにもう少し明確に説明します。
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 プロトタイプが動作)
この方法が役に立つことを願っています )))
Cに私の例のような類似性は見当たりません)) ご参考になれば幸いです ))))
の人、何かを書くために書いてはいけない。
memcpyを 使ったこれらの亜種はすべて数年前に咀嚼されたもので、今回のトピックにはふさわしくありません。
人間、何かを書くために書くのではありません。
これらのmemcpyオプションはすべて数年前に咀嚼されたもので、今回のトピックには適しません。
コードベースに載せたかったのですが、気が変わりました。
MQL5をKaggleで使用、数字認識タスク
人間、何かを書くために書くのではありません。
これらのmemcpyオプションはすべて何年も前から咀嚼されており、このトピックには適していません。
なぜ「不適切」なのか?
もうどこにあったのか忘れてしまって、見つけられませんでした...。
ちなみに、外部DLLを呼び出さずに配列へのポインタを保存するのは、技ありだと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい。
なぜ「ふさわしくない」のか?
もうどこにあったのか忘れてしまって、見つけられませんでした...。
ちなみに、外部DLLを介さずに配列へのポインタを保存するのは、偉業だと思います。インジケータを起動するたびに、DLLから関数をインポート することに同意するかどうか確認する必要がないようにしたい
配列をクラスで囲むと、MQLの疑似ポインタをnew
Alexey、OnCalculate()関数で 発行された配列をクラスにラップする方法も教えてください。この場合、ポインタをコピーしないとできません。
今のところ、データをクラス配列にコピーして、このオブジェクトへのポインタを引っ張ってきているだけです。しかし、そうすると、余計にコピーすることになり、私の見るところ、頻繁なティックと多数のチャートでかなり顕著な「重さ」が加わります。このコピーから解放されたい。しかし、DLL(標準または自作)経由の松葉杖を除いて、提案できることはありません。
サービスデスクでは、「オブジェクトは削除されている可能性があります」と何度も押し戻されます。しかし、これらは独自のアレイなのです私が「オブジェクトを作って、それを削除するとポインタが無効になるかもしれない」と言うと、「その責任を取るのは私だ」と返されます。ここには「二重の道徳」が働いているのだ。
DLLはどうでもいいんだけどさー、こういうインジケータは実行時に常に確認が必要なんだよねー、面倒くさいなー...。