MQL5에는 항상 위업을 위한 장소가 있습니다! ;) - 페이지 2

 
sergeev :

그래서 1번 문제가 있습니다.

64 응용 프로그램은 user32.dll 등과 같은 32비트 dll에서 기능을 어떻게 가져 옵니까? 아니면 시스템에 해당 이름을 가진 복사본이 있고 OOP 공간이 생성됩니까?

음, 우선, x64 시스템에는 x86 프로그램의 에뮬레이트 실행이 있습니다. 문제는 x86에서 x64 프로그램을 실행하는 방법입니다.
 
Urain :
음, 우선, x64 시스템에는 x86 프로그램의 에뮬레이트 실행이 있습니다. 문제는 x86에서 x64 프로그램을 실행하는 방법입니다.

아마도 질문은 터미널에 전혀 없지만 이러한 동일한 DLL의 일종의 까다로운 컴파일에 있습니까?

결국 나사 API에서 DLL을 작동합니다. 예를 들어 32/64비트 터미널의 user32, kernel32 , winmm, wininet입니다.

문제의 해결책은 다른 차원의 어딘가에서 볼 수 있습니다.

 
Urain :
문제는 x86에서 x64 프로그램을 실행하는 방법입니다.
확실히 작동하지 않습니다. x86 프로세서는 64비트 명령어를 실행할 수 없습니다.
세르게예프 :

아마도 질문은 터미널에 전혀 없지만 이러한 동일한 DLL의 일종의 까다로운 컴파일에 있습니까?

결국 나사 API에서 DLL을 작동합니다. 예를 들어 32/64비트 터미널의 user32, kernel32, winmm, wininet.

문제에 대한 해결책은 다른 차원의 어딘가에서 볼 수 있습니다.

여기에 뭔가가 있습니다. 저것들. 이론적으로 32비트 DLL이 여기 저기에서 작동하도록 만들 수 있습니다.

아마도 개발자를 부를 때입니다.

// "순진한" 방식으로 컴파일된 32비트 DLL이 내 x64에서 작동을 멈췄습니다. 그러나 아마도 컴파일하는 더 까다로운 방법이 있을 수 있습니다. 어쨌든 "있다"(c)-

결국 나사 API에서 DLL을 작동합니다. 예를 들어 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 :
귀하의 경우에 가장 간단한 옵션입니다.

글쎄, 가장 간단한 경우 - 오프셋. "나는 당신을 녹음하고 있습니다"(c) :)

비교를 위해 매우 경제적이지는 않지만 기억에서

    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배입니다. 내가 float 버퍼를 가지고 있다고 가정하면 - 3. // 또한 암시적 메모리 강도가 있습니다. 시스템 클래스 설명자 테이블(이 예에서)은 1000*1000+1000이고 1(!)

작업 속도는 거의 동일합니다.

줄어들까요? ;)

--

추신 아마 거짓말을 했을 것이다. 하위 클래스는 모두 정적이므로 암시적 강도가 다소 과장됩니다. 나는 긋는다. :)

 
MetaDriver :

아마도 개발자를 부를 때입니다.
간단히.
x86(32비트) 프로세스용 시스템 라이브러리 함수에는 x64로 전달되고 실행되고 x86으로 다시 반환되는 특수 래퍼가 있습니다.
 
mql5 :
간단히.
x86(32비트) 프로세스용 시스템 라이브러리 함수에는 x64로 전달되고 실행되고 x86으로 다시 반환되는 특수 래퍼가 있습니다.

정보 주셔서 감사합니다.

그리고 직접 만드는 방법을 알려주실 수 있나요? 링크할 수 있습니다(있는 경우).

 
MetaDriver :


줄어들까요? ;)

아니요, 가능하면 1차원 배열을 사용합니다.
 
글쎄요, #ifdef가 문제에 대한 일반적인 해결책이 아닙니까?
 
Yurich :
아니요, 가능하면 1차원 배열을 사용합니다.

확인. 이 경우 최적화 문제는 부차적입니다. 위업은 어떤 식으로든 보호됩니다.

--

다음 문제를 제안할 수 있습니다.

임의 차원의 배열(확정성을 위해 ^16으로 제한).

차원은 일반 배열과 마찬가지로 생성 시 매개변수 수로 설정됩니다.

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

인덱서는 모든 차원에서 작동해야 합니다( A[i][j][k][n][m]....).

순전히 스포츠와 두뇌 훈련을 위한 것입니다. :)