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

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

64비트 Windows에는 SysWOW64 폴더가 있습니다. 이 폴더는 64비트 OS에서 실행되는 32비트 응용 프로그램을 위한 것이며 System32 폴더는 일반적인 64비트 라이브러리와 드라이버를 저장합니다. 프로그램이 32비트로 실행되면 System32 폴더에 대한 호출이 SysWOW64로 리디렉션됩니다.

짧게는 아니더라도 MT5에서는 32/64비트 문제가 심각해졌습니다.

이 문제 는 매우 중요 하며 해결해야 할 때입니다.

또는 터미널 자체가 둘 중 하나를 얻을 위치를 이해할 수 있도록 라이브러리64 폴더를 추가하십시오.
또는 Windows 폴더 System32 / SysWow64 에 DLL을 분산시키는 방법을 제공하십시오.
또는 #ifdef 를 제공하십시오

https://www.mql5.com/ru/forum/6729#comment_199764

추신.
SD #381730 의 애플리케이션

 
MetaDriver :

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

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

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

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

글쎄, 커뮤니티가 조용하기 때문에 나는 계속할 것입니다 ...

N차원(이중) 배열 클래스의 스케치 및 이를 검증하기 위한 테스트.

차원은 생성자의 (int) 배열로 설명됩니다.

 //+------------------------------------------------------------------+
class CNXdouble
{
         double                   value [];
         int                     size[];
         int                     index;
         int                     ivalue;
public :
                               CNXdouble( const int &n[]);
                              ~CNXdouble()   { ArrayFree( value ); ArrayFree(size);}
         double       operator []   ( long x_);
        CNXdouble  * operator []  ( int x_)      { ivalue+=x_*size[index++]; return (GetPointer( this ));}
         void         operator =    ( double d)    { value [ivalue]=d; index= 0 ; ivalue= 0 ;}
};
//+------------------------------------------------------------------+
CNXdouble::CNXdouble( const int &n[])
{
         int m= 1 , k=ArraySize(n);
        ArrayResize(size,k);
        size[k- 1 ]= 1 ;
         for ( int i=k- 2 ; i>= 0 ; i--) size[i]=n[i+ 1 ]*size[i+ 1 ];
         for ( int i= 0 ; i<k; i++) m*=n[i];
        ArrayResize( value ,m);
        index= 0 ;
        ivalue= 0 ;
}
//+------------------------------------------------------------------+
double CNXdouble:: operator [] ( long x_) 
{
        index= 0 ;
         int i=ivalue;
        ivalue= 0 ;
         return ( value [i+( int )x_]);
}
//+------------------------------------------------------------------+
void OnStart()
{
    int n[]={ 2 , 3 , 4 , 2 };       //описание 4-х мерного массива
    int a1=n[ 0 ], a2=n[ 1 ], a3=n[ 2 ], a4=n[ 3 ];
   CNXdouble d2(n);
    //запись в массив
    int c= 0 ;
    for ( int i= 0 ; i<a1; i++)
        for ( int j= 0 ; j<a2; j++) 
            for ( int x= 0 ; x<a3; x++) 
                for ( int y= 0 ; y<a4; y++)
                   d2[i][j][x][y]=( double )c++;
    //чтение из массива
    string s= "" ;
   for ( int i= 0 ; i<a1; i++)
        for ( int j= 0 ; j<a2; j++) 
            for ( int x= 0 ; x<a3; x++)
                for ( long y= 0 ; y<a4; y++)
                   s+=( string )d2[i][j][x][y]+ " " ;
   Print(s);
}
//+------------------------------------------------------------------+
파일:
 

N차원(이중) 배열의 두 번째 버전입니다. 배열 구조는 다른 (int) 배열에 의해 생성자에서도 설정됩니다.

이 옵션은 이전 옵션보다 약간 빠릅니다. 그리고 이 변형에서는 하위 배열로 작업을 만드는 것이 더 쉽습니다.

 class CNArray
{
        CNArray                    *array[];
         double                       value[];
         bool                         last;
         int                          ivalue;
public :
                                   CNArray( const int &n[]);
                                  ~CNArray();
         double       operator[]      ( long x);
        CNArray*   operator[]      ( int x);
         void         operator=       ( double d) { if (last)value[ivalue]=d;}
};
//+------------------------------------------------------------------+
CNArray::CNArray( const int &n[])
{
         int k= ArraySize (n);
         if (k> 1 )
        {
                 ArrayResize (array,n[ 0 ]);
                 int n1[];
                 ArrayResize (n1,k- 1 );
                 for ( int i= 0 ; i<k- 1 ; i++) n1[i]=n[i+ 1 ];
                 for ( int i= 0 ; i<n[ 0 ]; i++) array[i]= new CNArray(n1);
                 ArrayFree (n1);
                last= false ;
        } else if (k== 1 )
        {
                 ArrayResize (value,n[ 0 ]);
                last= true ;
        }
}
//+------------------------------------------------------------------+
CNArray::~CNArray()
{ 
         if (!last)
        {
                 int n= ArraySize (array);
                 for ( int i= 0 ; i<n; i++) delete array[i];
                 ArrayFree (array);
        } else ArrayFree (value);
}
//+------------------------------------------------------------------+
double CNArray::operator[]( long x) 
{
         if (last) return (value[( int )x]); else return ( 0 );
}
//+------------------------------------------------------------------+
CNArray* CNArray::operator[]( int x)
{ 
         if (last)
        {
                ivalue=x; 
                 return ( GetPointer ( this ));
        } else return (array[x]);
}
 
Yurich :

N차원(이중) 배열의 두 번째 버전입니다. 배열 구조는 다른 (int) 배열에 의해 생성자에서도 설정됩니다.

이 옵션은 이전 옵션보다 약간 빠릅니다. 그리고 이 변형에서는 하위 배열로 작업을 만드는 것이 더 쉽습니다.

유리, 당신은 멋지다. 나는 며칠 동안 포럼에서 약간 산만 해져서 이미 몇 가지 옵션을 알아 냈습니다.

텍사스 첫 인상에서 - 첫 번째 옵션은 인덱스 수가 적은 잘못된 호출의 경우 결함으로 가득 차 있습니다. 예를 들어 double x=A[i][j][k]; 4차원 배열 에 대한 "3차원 호출"은 아무 일도 없었던 것처럼 두 배를 반환하지만 동시에 사용자가 꿈꾸던 배열의 위치에서 반환됩니다. 또한 이러한 오류를 추적하고 처리하는 방법이 명확하지 않습니다. 그러나 첫 번째 구현의 확실한 이점은 메모리 절약입니다. 두 번째 옵션은 훨씬 더 낭비입니다. 그러나 올바르게 지적했듯이 그 안에 있는 하위 배열에 접근하려고 할 수 있으며 그 과정에서 발생하는 모든 어려움은 완전히 극복할 수 있습니다.

다른 것을 생각해야 합니다. 아이디어가 있지만 오늘 거기에 도착하면 오늘 밤 늦게까지 여가 시간을 얻지 못할 것입니다. 그러나 우리는 주제를 마치겠습니다. 약속합니다. :)

--

주요 아이디어: "왼쪽 인덱스 컨트롤러"와 같은 다른 클래스를 사용하고 메인 클래스로 맨 오른쪽 인덱스를 처리해야 합니다(작동하는 경우 작동하지 않는 경우 오른쪽 인덱스에 대한 다른 클래스). 이 경우 기본 이중 배열(1차원 및 고유)을 기본 CNArray 클래스의 구성원으로 만들어야 합니다. 이 같은.

 
MetaDriver

텍사스 첫 인상에서 - 첫 번째 옵션은 인덱스 수가 적은 잘못된 호출의 경우 결함으로 가득 차 있습니다. 예를 들어 더블 x=A[i][j][k]; 4차원 배열에 대한 "3차원 호출"은 아무 일도 없었던 것처럼 두 배를 반환하지만 동시에 사용자가 꿈꾸던 배열의 위치에서 반환됩니다. 또한 이러한 오류를 추적하고 처리하는 방법이 명확하지 않습니다.

Yurich의 첫 번째 방법을 비틀면 다음과 같이 배열의 순위를 제어할 수 있는 것 같습니다.

 class DinArr_Double{
         double                  value [];
         int                     size[];
         int                     index;
         int                     ivalue;
         int                     range;
         bool                    checkerror;
public :
                               DinArr_Double( const int &n[]);
                              ~DinArr_Double()   { ArrayFree( value ); ArrayFree(size);}
         double            operator []( long x_);
        DinArr_Double*   operator []( int x_);
         void              operator = ( double d)    { value [ivalue]=d; index= 0 ; ivalue= 0 ;}
};
//+------------------------------------------------------------------+
DinArr_Double::DinArr_Double( const int &n[]){
         int m= 1 , k=ArraySize(n);
        range = ArraySize(n);
        ArrayResize(size,k);
        size[k- 1 ]= 1 ;
         for ( int i=k- 2 ; i>= 0 ; i--) size[i]=n[i+ 1 ]*size[i+ 1 ];
         for ( int i= 0 ; i<k; i++) m*=n[i];
        ArrayResize( value ,m);
        index= 0 ;
        ivalue= 0 ;
        checkerror = false ;
}
//+------------------------------------------------------------------+
double DinArr_Double:: operator []( long x_){
        index= 0 ;
         int i=ivalue;
        ivalue= 0 ;
         return ( value [i+( int )x_]);
}
//+------------------------------------------------------------------+
DinArr_Double*  DinArr_Double:: operator []( int x_){
      ivalue+=x_*size[index++];
       if (index!=range)checkerror = true ; else checkerror = false ;
       return (GetPointer( this )); } //+------------------------------------------------------------------+ void OnStart(){    int n[]={ 2 , 3 , 4 , 2 };       //описание 4-х мерного массива    int a1=n[ 0 ], a2=n[ 1 ], a3=n[ 2 ], a4=n[ 3 ];    DinArr_Double d2(n);    //запись в массив    int c= 0 ;    for ( int i= 0 ; i<a1; i++)        for ( int j= 0 ; j<a2; j++)            for ( int x= 0 ; x<a3; x++)                for ( int y= 0 ; y<a4; y++)                    d2[i][j][x][y]=( double )c++;    //чтение из массива    string s= "" ;    for ( int i= 0 ; i<a1; i++)        for ( int j= 0 ; j<a2; j++)            for ( int x= 0 ; x<a3; x++)                for ( long y= 0 ; y<a4; y++)                    s+=( string )d2[i][j][x][y]+ " " ;    Print(s); } //+------------------------------------------------------------------+
 

일:

- EA에서 표시기로 숫자 배열을 전송합니다.


정황.

데이터 전송에 사용하지 마십시오
- 차트 이벤트,
- 파일,
- 전역 변수 (파일임),
- DLL

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
sergeev :

일:

- EA에서 표시기로 숫자 배열을 전송합니다.


정황.

- 데이터 전송을 위해 차트 이벤트, 파일, dll을 사용하지 마십시오.

전역 터미널 변수 가 작동합니까?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
그런 다음 명명된 파이프가 있습니다.
 
sandex :
그런 다음 명명된 파이프가 있습니다.
서버는 누구입니까?
 
sergeev :

일:

- EA에서 표시기로 숫자 배열을 전송합니다.


정황.

데이터 전송에 사용하지 마십시오
- 차트 이벤트,
- 파일,
- 전역 변수 (파일임),
- DLL

글쎄, 악용을 위해 누군가를 돌리지 마십시오 :)

그런 다음 하위 차트와 ChartSetString() 및 ChartGetString() 함수를 사용하는 다른 옵션을 제공합니다.