【问题标题】:How to print values from a multidimensional array in MQL5?如何在 MQL5 中打印多维数组中的值?
【发布时间】:2019-06-10 20:54:40
【问题描述】:

在 MQL4 中,我可以使用以下函数来打印二维数组中的值:

string Arr2ToString(double& arr[][], string dlm = ",", int digits = 2) {
  string res = "";
  int i, j;
  for (i = 0; i < ArrayRange(arr, 0); i++) {
    res += "[";
    for (j = 0; j < ArrayRange(arr, 1); j++) {
      res += StringFormat("%g%s", NormalizeDouble(arr[i][j], digits), dlm);
    }
    res = StringSubstr(res, 0, StringLen(res) - StringLen(dlm));
    res += "]" + dlm;
  }
  res = StringSubstr(res, 0, StringLen(res) - StringLen(dlm));
  return res;
}

但是在 MQL5(版本 5.00,构建 1966)中,上述函数不再起作用,并且出现以下错误:

'[' - 无效的索引值 Array.mqh

在传递arr[][]时的第一行。

我已经检查过,MQL5 不再允许传递没有维度大小的数组。

将多维数组传递给函数时,应指定维度大小(第一个除外):

double var[][3][3];
void Func(double &arg[][3][3]){    // ... }

来源:MQL5 PROGRAMMING BASICS: ARRAYS

这没有意义。

假设我不知道数组的大小(因为我想将此函数重新用于多种数组类型,并且为每个大小定义数十个单独的函数是荒谬的),现在如何打印值来自存储双精度值的多维数组(例如二维数组)?

【问题讨论】:

  • 是的,我们不能将多维数组传递给我们的函数,但如果您只是需要打印数组,您可以使用ArrayPrint() 函数mql5.com/en/docs/array/arrayprint
  • @TheLastStark 你认为ArrayPrint() 支持二维数组吗?从文档中,不清楚。
  • 我试过了吗,MQL5 函数适用于多维数组
  • 您也可以将其作为答案发布(至少它回答了主要的标题问题),因为我不知道。遗憾的是,您无法从中获取字符串(因此您不能将它与文件一起使用,例如以纯格式存储数组值),它会迫使您打印它。
  • 我确实添加了它作为答案,但是你是对的,看到他们设置了这个限制也有点可悲,我很想知道为什么限制只针对 MQL5跨度>

标签: arrays mql5


【解决方案1】:

我知道这并不理想,但我们可以使用ArrayPrint() 来打印数组。 Refer here for the documentation

void  ArrayPrint( 
   const void&   array[],             // printed array 
   uint          digits=_Digits,      // number of decimal places 
   const string  separator=NULL,      // separator of the structure field values 
   ulong         start=0,             // first printed element index 
   ulong         count=WHOLE_ARRAY,   // number of printed elements 
   ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN     
   );

这是将多维数组传递给函数的另一种方法,同样不理想,但可以正常工作。

//+------------------------------------------------------------------+
//| Struct that is used to hold multi-dimentional array              |
//+------------------------------------------------------------------+
template<typename T>
struct MultiDimentionalArray
  {
   T                 index2[];      
  };
//+------------------------------------------------------------------+
//| Array print function that accepts MultiDimentionalArray struct   |
//+------------------------------------------------------------------+
string Arr2ToString(MultiDimentionalArray<double> &arr[],string dlm=",",int digits=2)
  {
   string res="";
   int i,j;
   for(i=0; i<ArraySize(arr); i++)
     {
      res+="[";
      for(j=0; j<ArraySize(arr[i].index2); j++)
        {
         res+=StringFormat("%g%s",NormalizeDouble(arr[i].index2[j],digits),dlm);
        }
      res = StringSubstr(res,0,StringLen(res) - StringLen(dlm));
      res+= "]" + dlm;
     }
   res=StringSubstr(res,0,StringLen(res)-StringLen(dlm));
   return res;
  }

这是一个执行示例

void OnStart()
  {
//--- Declaring an array
   MultiDimentionalArray<double> arr[];

//--- Adding values to the array
   for(int i=0;i<10;i++)
     {
      //--- Resizing the array - 1st dimention
      if(ArraySize(arr)<=i) ArrayResize(arr,ArraySize(arr)+1);

      for(int j=0;j<10;j++)
        {
         //--- Resizing the array - 2nd dimention
         if(ArraySize(arr[i].index2)<=j) ArrayResize(arr[i].index2,ArraySize(arr[i].index2)+1);
         arr[i].index2[j]=i*j;
        }
     }

//--- Getting the result as string
   string arrResult=Arr2ToString(arr);
//--- Printing the result string
   Print(arrResult);
  }

这是我在执行上述代码后在专家选项卡中得到的结果

2019.06.11 16:25:47.078 Arrays (EURUSD,H1)  [0,0,0,0,0,0,0,0,0,0],[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,10,12,14,16,18],[0,3,6,9,12,15,18,21,24,27],[0,4,8,12,16,20,24,28,32,36],[0,5,10,15,20,25,30,35,40,45],[0,6,12,18,24,30,36,42,48,54],[0,7,14,21,28,35,42,49,56,63],[0,8,16,24,32,40,48,56,64,72],[0,9,18

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2020-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
相关资源
最近更新 更多