さあどうぞ、私が先よ。:)
最も "マジック "な場所は、むしろ遅いのですが......。もしかしたら、mql5のウィザードの誰かが、それを高速化する方法を見つけるかもしれませんね。// どれほど遅いかは、自分の目で確かめてください。このテストは、その速度を測定することに専念しています。
このコードは、2次元配列を使用する通常の構文にしたがって動作します。
void OnStart() { float FA[5][3]; long st=GetTickCount(); for(int t=0;t<1000000;t++) { for(int i=0;i<5;i++) { for(int j=0;j<3;j++) { FA[i][j] = (i+1.5)*(j+1.3); } } } Print("====",GetTickCount()-st," ms ===="); st=GetTickCount(); C2DMagicArray MA(5,3); for(int t=0;t<1000000;t++) { for(int i=0;i<MA.SizeL();i++) { for(long j=0;j<MA.MaxR();j++) { MA[i][j] = (i+1.5)*(j+1.3); // ^ ^ Как это сделано ??? Можете повторить ? :)) } } } Print("====",GetTickCount()-st," ms ===="); st=GetTickCount(); for(int t=0;t<1000000;t++) { for(int i=0;i<MA.SizeL();i++) { for(long j=0;j<MA.MaxR();j++) { MA.Set(i,j,float((i+1.5)*(j+1.3))); } } } Print("====",GetTickCount()-st," ms ===="); for(int i=0;i<MA.SizeL();i++) { for(int j=0;j<MA.MaxR();j++) { Print( MA[i][j] ); // ^ ^ Как это сделано??? :)) Жду Вашу версию! } } }
まだコンパイルはできません:インライン化は後回しです...- でないと面白くない。:)
では、誰がその偉業を再現できるのか。
ウラジミールが私たちからの答えを待っている間、私は偉業を成し遂げるにふさわしい質問をします ;)
一つのex5で32と64のDLLから関数をインポート するにはどうしたらいいですか?
例えば、2端子(32/64)分のex5を作る場合を考えてみましょう。
- www.mql5.com
また例外を求めるのか?
いや、今まで例外を要求したことはない。 おそらくそういうことではなく、#ifdefについて だ。
もしVladimirが彼のコードを使って操作をオーバーロード できるなら、彼の方法は必要なDLLを自動的に有効にするために使えるのではないかと期待していましたo_O。
define 内の #import の一種。
さあどうぞ、私が先よ。:)
では、誰がその偉業を再現できるのか。
偉業を繰り返すのに時間がかかっている :)ドキュメントに似たような例がありますが。
//--- перебираем строки для сложения for(int i=0;i<rows;i++) { //--- запишем результаты сложений строк матриц в массив for(int k=0;k<cols;k++) { arr[k]=this[i][k]+m[i][k]; } //--- поместим массив в строку матрицы res[i]=arr; }
偉業を繰り返すのに時間がかかっている :)ドキュメントに似たような例がありますが。
だからその例えでやってください!大したことないですよ!...。:-))
そして、見てみる。;)
また、端末のビットレートに応じて、異なる機能を呼び出す条件をコードに記述します。
ターミナルは最初の呼び出しでDLLをロードするようです。コールなし-ロードを試みず、致命的な流産もなし。
端末のビット数はTerminalInfoInteger()で返されるため、他の方法はありません。
bool x64 = TerminalInfoInteger(TERMINAL_X64);
これらはすべて、MyLib.ex5ライブラリで直接行うことができます。
void MyLibMultibitFunc() // библиотечная универсальная обёртка для DLL-функции { if(x64) { MyDll64Func(); } else { MyDll32Func(); } }
また、端末のビットレートに応じて、異なる機能を呼び出す条件をコードに記述します。
ターミナルは最初の呼び出しでDLLをロードするようです。コールなし-ロードを試みず、致命的な流産もなし。
端末のビット数はTerminalInfoInteger()で返されるため、他の方法はありません。
これらはすべて、MyLib.ex5ライブラリで直接行うことができます。
ええ、同じ意見です、ターミナルは最初の呼び出しの時だけDLL-functionオブジェクトを作成します。
また、ビット数については、フォーラムで数値の表現の違いについて言及されていたようですが、変数のビットフィールドがある結果を与える場合、それは32になり、他の場合は64になります。経験によって判断することができる。
そして、コード中に、端末のビットレートに応じて、参照する関数を変えて、条件付きで呼び出すようにします。
ターミナルは最初の呼び出しでDLLをロードするようです。コールなし-ロードと致命的な流産を試みない。
いや、皆さん、この問題を理解していない。 TERMINAL_X64や_Is64での可能性は知られている。
でも、残念ながら端末は違うんです。
- グラフに突進すると、使用されているDLLのリストをチェックし、インポートされた関数の リストを[依存関係]ウィンドウに表示します
On those DLL's that don't match the bitness it writays a warning MQL5Libraries Tiexomedll64.dllis not 32-bit version
- しかし、OKを押してExpert Advisorがなんとなく起動したら、本当に困ったことになります。
端末がエラー193を発生し、EX5をアンロードする
EX5の読み込みに失敗
そして、このコードにはDLLの宣言だけが含まれており、そこから関数がインポートされていないことに注目してほしい
#import "somedll64.dll"。
#インポート
- www.mql5.com
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
私は、このような、あらゆる種類のmql5の「不可能性」を投稿し、分析することを提案します:条件付きコンパイル.
好奇心旺盛な人々を翻弄し、読者自身の創造性を刺激するために、最初に(実装を明らかにせず)可能性を示すことは可能である。
しかし、最終 的には、その秘密を明かし、 実装サンプルを提供 することが必要(義務!)なのです。
もちろん、このような「二相性」の形態はデマも多いが、「身を引く」覚悟で奇跡を起こす人たちの正直な発言に頼ろう。:)
--
ということは......。HERE WE GO !