在MQL5中,总是有漏洞可钻! ;) - 页 3

 
mql5:
简而言之。
x86(32位)进程的系统库函数有一个特殊的包装器,通过它传递给x64,执行后返回给x86。

64位Windows有一个名为SysWOW64的文件夹。这个文件夹是为在64位操作系统中启动的32位应用程序准备的,而常规的64位库和驱动程序则存储在System32文件夹中。 如果程序是作为32位启动的,对System32文件夹的引用会被重定向到SysWOW64。

简而言之,32/64位的问题在MT5中已经变得很严重。

这是一个非常重要的 问题 现在是解决这个问题的时候了。

或者添加一个libraries64 文件夹,以便终端知道从哪里获得库。
或者添加一些方法将DLLs分散到system32/SysWow64 文件夹中
或者使用
#ifdef

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

ZS。
申请到SD#381730

 
MetaDriver:

任何维度的数组(为了清楚起见,让我们说,将其限制在^16)。

维度在创建时由参数的数量来设定,和普通数组一样。

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

索引器应适用于所有尺寸( A[i][j][k][n][m]....)

好吧,既然社会上的人都不说话了,那我就继续...

一个N维(double)数组类的概要和一个测试它的测试。

维度由构造函数中的(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];对于四维数组 的 "三维调用 "将返回double,这没什么大不了的,但从用户想要的数组的任何其他位置返回。而如何跟踪和处理这样的错误并不明显。 但第一种实现方式无可争议的优势在于内存的经济性。 第二种方式则更为浪费。 但是,正如你所正确注意到的,你可以尝试在其中打通子数,在这种情况下,所有的困难都是相当可控的。

我有一些想法,但我要到前一天晚上才有空闲时间,如果我到达那里的话。但我们会到达那里的,我保证。:)

--

基本想法:多用一个类,类似于 "左边的索引控制器",最右边的索引由主类来处理(如果它能工作的话。 如果不能,那就多用一个类来处理右边的索引)。在这样做的时候,基础数组double(一维的,而且是唯一的)应该成为主类CNArray的一个成员。它是这样的。

 
MetaDriver

第一印象--第一种变体在索引数较少的情况下,充满了错误的调用:例如double x=A[i][j][k];四维数组的 "三维调用 "将返回double,好像什么都没发生过,但在用户想要的数组位置上。 而且不知道该如何追踪和处理这种错误。

我一直在玩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); } //+------------------------------------------------------------------+
 

任务。

- 从专家顾问向指标传递一个数字数组。


要求。

请勿使用
- 图表事件。
- 文件。
-全局变量(也被称为文件)。
- 袛小野的

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

任务。

- 从专家顾问向指标传递一个数字数组。


要求。

- 不要使用图表事件、文件、dll进行数据传输

终端的全局变量 会起作用吗?
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
然后,命名的通道仍然存在。
 
sandex:
然后,命名的通道仍然存在。
谁是服务器?
 
sergeev:

任务。

- 从专家顾问向指标传递一个数字数组。


条件。

请勿使用
- 图表事件。
- 文件。
-全局变量(又称文件)。
- 袛小野的

没有人去做这件事 :)

那么我提出另一个变体--使用子图表和ChartSetString()和ChartGetString() 函数。