Arrays 如何在MQL5中打印多维数组中的值?
在MQL4中,我可以使用以下函数打印二维数组中的值:Arrays 如何在MQL5中打印多维数组中的值?,arrays,mql5,Arrays,Mql5,在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++) {
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;
}
来源:
这没有道理
假设我不知道数组的大小(因为我想对多种数组类型重复使用此函数,并且为每种大小定义几十个单独的函数是荒谬的),那么现在如何能够从存储双值的多维数组(例如二维数组)打印值呢?我知道这并不理想,但是我们可以使用
ArrayPrint()
来打印数组。
这里是将多维数组传递给函数的另一种方法,它同样不理想,但工作正常
//+------------------------------------------------------------------+
//| 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;
}
是的,我们确实不能将多维数组传递给函数,但是如果您只需要打印数组,您可以使用
ArrayPrint()
函数@laststark。您认为ArrayPrint()
支持二维数组吗?从文档中看,这并不清楚。是的,我已经尝试过了,MQL5函数与多维数组一起工作。您也可以将其作为答案发布(至少它回答了主要标题问题),因为我不知道。遗憾的是,你无法从中提取字符串(因此你不能将其用于文件,比如以普通格式存储数组值),这会迫使你打印它。我确实添加了它作为答案,但你是对的,看到他们设置了此限制,也有点悲哀,我很想知道为什么限制仅限于MQL5。如果您能帮我解决这个问题,我将非常感激。我非常感谢您的帮助。我已经为这个问题提供了额外的信息。请看一看
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