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

 
sergeev:

そこで、1つ目の疑問があります。

user32.dllなどの32ビットDLLから64アプリケーションに関数をインポート するにはどうしたらよいですか?それとも、その名前でシステム内にコピーがあり、OOPスペースが作成されるのでしょうか?

まず、x64システムでは、x86のプログラムをエミュレートして起動することができます。問題は、x86でx64のプログラムを実行する方法です。
 
Urain:
まず、x64システムでは、x86プログラムの起動をエミュレートしています。問題は、x86でx64のプログラムを実行する方法です。

もしかしたら、質問は端末のことではなく、これらのDLLのトリッキーなコンパイルについてかもしれませんね。

DLLはWindowsのAPIを利用しています。例えば、32/64ビット端末ではuser32,kernel32, winmm, wininetです。

問題の解決は、別のところにあるようだ。

 
Urain:
問題は、x86でx64のプログラムを実行する方法です。
x86プロセッサーは64ビット命令を実行できないので、絶対にうまくいきません。
セルゲイ

もしかしたら、この質問は端末のことではなく、これらのDLLのトリッキーなコンパイルのことかもしれませんね。

例えば、user32, kernel32, winmm, wininetは32/64bitのターミナルで動作します。

この問題の解決は、別のところにありそうだ。

ですから、理論的には32ビットDLLをそこそこ動作させることができるかもしれません。

もしかしたら、開発者に連絡する時期かもしれませんね。

もしかしたら、もっと狡猾なコンパイル方法があるのかもしれません // x64で「素朴な」方法でコンパイルした32bit DLLで作業を中断しました。 とにかく、「ある」前例があるのです(c).

例えば、32/64ビット端末では、user32、kernel32、winmm、wininetなど。

 
MetaDriver:

だからその例えでやれよ!大したことないだろ!...と。:-))

見てみるよ。;)

//+------------------------------------------------------------------+
class Cdouble
{
public:
        double                  v;
        void    operator=       (double d) {v=d;}
};
//+------------------------------------------------------------------+
class C1Xdouble
{
        Cdouble                 v[];
public:
        
                                C1Xdouble() {}
                                C1Xdouble(int s) {ArrayResize(v,s);}
                               ~C1Xdouble(){ ArrayFree(v);}
        double operator[]       (int x) {return(v[x].v);}
        Cdouble *operator[]    (long x){return(GetPointer(v[(int)x]));}
        int                     Resize(int s){ return(ArrayResize(v,s));}
};
//+------------------------------------------------------------------+
class C2Xdouble
{
        C1Xdouble               v[];
public:
                                C2Xdouble() {}
                                C2Xdouble(int s1,int s2);
                               ~C2Xdouble(){ ArrayFree(v);}
        C1Xdouble *operator[]   (int x) { return(GetPointer(v[x]));}
};
C2Xdouble::C2Xdouble(int s1,int s2)
{
        ArrayResize(v,s1);
        for(int i=0; i<s1; i++) v[i].Resize(s2);
}
//+------------------------------------------------------------------+
最もシンプルな方法で、自分のケースに当てはめることができます。
 
Yurich:
あなたのケースに合わせた最もシンプルなバージョンです。

まあ、一番単純なケースとしては、クレジット。「あなたを書いています」 :)

記憶からですが、それに比べれば惜しくはないですね。

    C2Xdouble  X(1000,1000);
    Print("X(100,100).SizeOF() = ",X.SizeOf()); 
// добавил в ваши классы вычисление размера
-----
    C2DMagicArray  MA(1000,1000);
    Print("MA(100,100).SizeOF() = ",sizeof(MA)+MA.SizeOf()); 
// это мой. у меня MA.SizeOf() возвращает только размер чистого буфера, поэтому по честному добавил размер класса. :)

の結果です。

2012.05.23 12:59:05     CXDouble (AUDNZD,M1)    MA(100,100).SizeOF() = 4000112
2012.05.23 12:59:05     CXDouble (AUDNZD,M1)    X(100,100).SizeOF() = 24068068

その差は6倍、フロートバッファを考慮すると-3倍です。 // クラス記述子のシステムテーブルは(この例では)1000*1000+1000ですが、私のは1です(!)

スピードはほとんど変わりません。

縮んでしまうのでしょうか?;)

--

嘘です、あなたのサブクラスはすべてスタティックなので、暗黙の強盗はちょっと大げさです。掻い摘んで言うと:)

 
MetaDriver:

もしかしたら、開発者に連絡する時期かもしれませんね。
簡単に説明すると
x86(32ビット)プロセス用のシステムライブラリ関数は、特殊なラッパーを経由してx64に渡され、実行されてx86に戻される。
 
mql5:
簡単に説明すると
x86(32ビット)プロセス用のシステムライブラリ関数は、特別なラッパーを持ち、それを介してx64に転送され、実行されてx86に戻される。

情報をありがとうございました。

自分でも同じようにできる方法を教えてください。 リンクだけでも(あれば)。

 
MetaDriver:


縮んでしまうのでしょうか?;)

いいえ、私は可能な限り一次元の配列を使います。
 
普通に考えて#ifdefで解決するのでは?
 
Yurich:
いいえ、私は可能な限り一次元の配列を使います。

OKです。この場合、最適化の問題は二の次です。 とにかく偉業は守られます。

--

次のような問題を提供することができます。

配列は任意の次元を持つ(わかりやすくするために^16に限定しておく)。

次元数は、通常の配列と同様に、作成時にパラメータの数で設定する。

XXArray  xx2(5,7),  xx5(12,12,16,16,8);

すべての次元のインデクサ(A[i][j][k][n][m]...)で動作するはずです。

スポーツや脳トレにちょうどいい。:)