The new compiler is a big improvement on the old compiler and it has exposed at lot of issues with types and returned values, array underflow and array overflow.
For a couple of days I have been trying to understand what I had to change to solve this last issue. Initially, I thought it must be a misunderstanding on my part. This belief was reinforced when I searched and could not find anyone else reporting an issue with ArraySize of a multidimensional array passed by reference.
However, after writing a very simple test, I still can't see anything wrong with the code and I am starting to think it is a problem in Empty4, but it doesn't make sense that it has not been reported by others.
Anyway, here is my test code and results. Also I found that ArrayRange() seems to be OK so I'm working on a substitute ArraySizeMT4B600() for the time being.
Code: Select all
//+------------------------------------------------------------------+
//| Testb625ArraySize.mq4 |
//| Snailbeard |
//| |
//+------------------------------------------------------------------+
#property copyright "Snailbeard"
#property link ""
#property version "1.00"
#property strict
#define IntToStr IntegerToString
int glbArr1[5][2];
int glbTestDataIn[5][2]=
{
11,12,
21,13,
31,14,
41,15,
51,16
};
int glbTestDataOut[5][2]=
{
0,0,
11,12,
21,13,
31,14,
41,15
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void forceAppExit()
{
/*
int a = 1;
int b = 0;
int c = a/b; // force divide by zero
*/
ExpertRemove();
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void tryPassByRef(int &x,double &y,double &z[])
{
double offset=0.1;
int count=0;
int iSizeOfZ=0;
iSizeOfZ=ArraySize(z);
if(iSizeOfZ<1)
{
Print("testPassByRef(): iSizeOfZ < 1: ");
Print("ERROR z[] Array size is wrong!");
forceAppExit();
return;
}
for(count=0; count<10; count++)
{
if(count>=ArraySize(z))
break;
z[count]=count;
}
x = count;
y = offset + count;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void testTryPassByRef()
{
int ix=0;
double dy=0.0;
double az[5];
tryPassByRef(ix,dy,az);
Print("testTryPassByRef() results: ");
Print("ix: ",ix,", dy: ",dy,", az[ix-1]: ",(az[(ix-1)]));
Print("---");
}
//+------------------------------------------------------------------+
//| bwaShift2DimArrayOfInt() |
//+------------------------------------------------------------------+
bool bwaShift2DimArrayOfInt(int &arrData[][],int dim1,int dim2)
{
Print("Two dimensions: ");
int dim0=ArrayRange(arrData,0);
int dim1=ArrayRange(arrData,1);
PrintFormat("ArrayRange: dim1 = %d, dim2 = %d \n", dim0, dim1);
int maxsize=ArraySize(arrData);
if( maxsize == 0 )
{
Print("bwaShift2DimArrayOfInt(): maxsize == 0 ");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
Print("ERROR ArraySize returned Zero!");
forceAppExit();
return(false);
}
else if((dim1*dim2)>maxsize)
{
Print("bwaShift2DimArrayOfInt(): (dim1 * dim2) > maxsize: ");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
Print("ERROR Array size is wrong!");
forceAppExit();
return(false);
}
else {
Print("bwaShift2DimArrayOfInt(): ");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
Print("SUCCESS ArraySize() returned POSITIVE INT!");
}
for(int i1=0; i1<dim1; i1++)
{
int rIdxLast = dim1 - 1 - i1;
int rIdxPrev = rIdxLast - 1;
if(rIdxPrev<0)
break;
for(int i2=0; i2<dim2; i2++)
{
arrData[rIdxLast][i2]=arrData[rIdxPrev][i2];
if(rIdxPrev==0) arrData[0][i2]=0;
}
}
return(true);
}
//+------------------------------------------------------------------+
//| bwaCompare2DimArrayOfInt() |
//+------------------------------------------------------------------+
bool bwaCompare2DimArrayOfInt(int &arrData[][],int &arrData2[][],int dim1,int dim2)
{
bool bSuccess= true;
bool bReport = false;
int maxsize=ArraySize(arrData);
if( maxsize == 0 )
{
Print("bwaShift2DimArrayOfInt(): maxsize == 0 ");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
Print("ERROR ArraySize returned Zero!");
forceAppExit();
return(false);
}
else if((dim1*dim2)>maxsize)
{
Print("bwaCompare2DimArrayOfInt() : Array arrData[][] dimension error!");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
return(false);
}
int size2=ArraySize(arrData2);
if((dim1*dim2)>size2)
{
Print("bwaCompare2DimArrayOfInt() : Array arrData2[][] dimension error!");
Print(": maxsize: ",maxsize,", dim1: ",dim1,", dim2: ",dim2);
return(false);
}
int i1 = 0;
int i2 = 0;
for(i1 = 0; i1 < dim1; i1++ )
{
int rIdxLast=dim1-1-i1;
for(i2=0; i2<dim2; i2++)
{
if(arrData[rIdxLast][i2]!=arrData2[rIdxLast][i2])
{
bSuccess=false;
if(bReport)
{
Print("bwaCompare2DimArrayOfInt() : Arrays are different!!!");
Print("index: "
+IntToStr(rIdxLast)+", "
+IntToStr(i2)+" : arrData: "
+IntToStr(arrData[rIdxLast][i2])+", "+", arrData2 : "
+IntToStr(arrData2[rIdxLast][i2]));
}
}
}
}
Print("bwaCompare2DimArrayOfInt(): No. of Ints compared: ["
+IntToStr(i1)+"], ["
+IntToStr(i2)+"]");
if((bSuccess==false) && (bReport==true))
for(i1=0; i1<dim1; i1++)
for(i2=0; i2<dim2; i2++)
Print("index: "
+IntToStr(i1)+", "
+IntToStr(i2)+" : arrData: "
+IntToStr(arrData[i1][i2])+", "+", arrData2 : "
+IntToStr(arrData2[i1][i2]));
return(bSuccess);
}
//+------------------------------------------------------------------+
//| testbwaShift2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
void test_glbShift2DimArrayOfInt()
{
Print("\n\nTest using GLOBAL array:");
//-----------------------------------------------------------
int localDynArr1[5][2];
Print("\n\nUsing Dynamic array: test_glbShift2DimArrayOfInt():");
Print("ArraySize(localDynArr1) : ",(ArraySize(localDynArr1)));
Print("ArraySize(glbTestDataIn) : ",(ArraySize(glbTestDataIn)));
ArrayCopy(localDynArr1,glbTestDataIn,0,0,WHOLE_ARRAY);
bool bSuccess=bwaShift2DimArrayOfInt(localDynArr1,5,2);
if(bSuccess==false) Print("Test Failed: [glb] testbwaShift2DimArrayOfInt()");
else
{
bSuccess=bwaCompare2DimArrayOfInt(localDynArr1,glbTestDataOut,5,2);
if(bSuccess==false) Print("Test Failed: [glb] bwaCompare2DimArrayOfInt()");
else Print("Test Passed: [glb] bwaCompare2DimArrayOfInt()");
}
}
//+------------------------------------------------------------------+
//| testbwaShift2DimArrayOfDoubles() |
//+------------------------------------------------------------------+
void test_bwaShift2DimArrayOfInt()
{
static int testDataIn[5][2]=
{
11,12,
21,13,
31,14,
41,15,
51,16
};
static int testDataOut[5][2]=
{
0,0,
11,12,
21,13,
31,14,
41,15
};
//-----------------------------------------------------------
int localDynArr1[5][2];
Print("\n\nUsing Dynamic array: test_bwaShift2DimArrayOfInt():");
Print("ArraySize(localDynArr1) : ",(ArraySize(localDynArr1)));
Print("ArraySize(testDataIn) : ",(ArraySize(testDataIn)));
ArrayCopy(localDynArr1,testDataIn,0,0,WHOLE_ARRAY);
bool bSuccess=bwaShift2DimArrayOfInt(localDynArr1,5,2);
if(bSuccess==false) Print("Test Failed: testbwaShift2DimArrayOfInt()");
else
{
bSuccess=bwaCompare2DimArrayOfInt(localDynArr1,testDataOut,5,2);
if(bSuccess==false) Print("Test Failed: bwaCompare2DimArrayOfInt()");
else Print("Test Passed: bwaCompare2DimArrayOfInt()");
}
//-----------------------------------------------------------
/// Test again with static array
static int localStaticArr1[5][2];
Print("\n\nUsing Local Static array: test_bwaShift2DimArrayOfInt():");
Print("ArraySize(localStaticArr1) : ",(ArraySize(localStaticArr1)));
Print("ArraySize(testDataIn) : ",(ArraySize(testDataIn)));
ArrayCopy(localStaticArr1,testDataIn,0,0,WHOLE_ARRAY);
bSuccess=bwaShift2DimArrayOfInt(localStaticArr1,5,2);
if(bSuccess==false) Print("Test Failed: testbwaShift2DimArrayOfInt()");
else
{
bSuccess=bwaCompare2DimArrayOfInt(localStaticArr1,testDataOut,5,2);
if(bSuccess==false) Print("Test Failed: bwaCompare2DimArrayOfInt()");
else Print("Test Passed: bwaCompare2DimArrayOfInt()");
}
//-----------------------------------------------------------
Print("\n\nUsing Global array: test_bwaShift2DimArrayOfInt():");
Print("ArraySize(glbArr1) : ",(ArraySize(glbArr1)));
Print("ArraySize(testDataIn) : ",(ArraySize(testDataIn)));
ArrayCopy(glbArr1,testDataIn,0,0,WHOLE_ARRAY);
bSuccess=bwaShift2DimArrayOfInt(glbArr1,5,2);
if(bSuccess==false) Print("Test Failed: testbwaShift2DimArrayOfInt()");
else
{
bSuccess=bwaCompare2DimArrayOfInt(glbArr1,testDataOut,5,2);
if(bSuccess==false) Print("Test Failed: bwaCompare2DimArrayOfInt()");
else Print("Test Passed: bwaCompare2DimArrayOfInt()");
}
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
testTryPassByRef(); // Passed
///test_glbShift2DimArrayOfInt();
test_bwaShift2DimArrayOfInt();
Print("Leaving Oninit()\n\n");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
static bool bFirstRun = true;
if( bFirstRun )
{
Print("Entering OnTick() First Run...\n");
test_glbShift2DimArrayOfInt();
Print("\nLeaving OnTick() First Run...\n");
}
bFirstRun = false;
}
//+------------------------------------------------------------------+
Code: Select all
13:28:22 Testb625ArraySize test started
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: testTryPassByRef() results:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ix: 5, dy: 5.1, az[ix-1]: 4.0
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ---
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Using Dynamic array: test_bwaShift2DimArrayOfInt():
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(localDynArr1) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(testDataIn) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Two dimensions:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArrayRange: dim1 = 5, dim2 = 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: bwaShift2DimArrayOfInt(): maxsize == 0
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: : maxsize: 0, dim1: 2, dim2: 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ERROR ArraySize returned Zero!
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Test Failed: testbwaShift2DimArrayOfInt()
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Using Local Static array: test_bwaShift2DimArrayOfInt():
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(localStaticArr1) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(testDataIn) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Two dimensions:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArrayRange: dim1 = 5, dim2 = 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: bwaShift2DimArrayOfInt(): maxsize == 0
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: : maxsize: 0, dim1: 2, dim2: 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ERROR ArraySize returned Zero!
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Test Failed: testbwaShift2DimArrayOfInt()
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Using Global array: test_bwaShift2DimArrayOfInt():
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(glbArr1) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(testDataIn) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Two dimensions:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArrayRange: dim1 = 5, dim2 = 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: bwaShift2DimArrayOfInt(): maxsize == 0
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: : maxsize: 0, dim1: 2, dim2: 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ERROR ArraySize returned Zero!
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Test Failed: testbwaShift2DimArrayOfInt()
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Leaving Oninit()
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Entering OnTick() First Run...
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Test using GLOBAL array:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Using Dynamic array: test_glbShift2DimArrayOfInt():
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(localDynArr1) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArraySize(glbTestDataIn) : 10
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Two dimensions:
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ArrayRange: dim1 = 5, dim2 = 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: bwaShift2DimArrayOfInt(): maxsize == 0
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: : maxsize: 0, dim1: 2, dim2: 2
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: ERROR ArraySize returned Zero!
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1: Test Failed: [glb] testbwaShift2DimArrayOfInt()
13:28:22 2014.03.03 00:00 Testb625ArraySize EURUSD,M1:
Leaving OnTick() First Run...