Download MetaTrader 5

I don't understand this array problem (potential bug)

To add comments, please log in or register
Mihai Ionescu
1354
Mihai Ionescu 2010.09.27 18:59 

Here is some code I made (a test script):

double a[10];

void OnStart()
  {
//---
   for (int i=0;i<10;i++) {
      a[i] = i;
      printf("initial state: a[%d]=%d",i,a[i]);
   }
   
   double sum;
   
   for (int i=0;i<10;i++) {
      addElements(a,i,sum);
   }
   
   for (int i=0;i<10;i++) {
      printf("final state: a[%d]=%d",i,a[i]);
   }
   
  }
  
bool addElements(double& a[], int i, double& sum) {
   int len = ArraySize(a);
   
   sum = 5*a[i];
   return (true);   
}

 Why all values are 0 in initial state and final state? 

Even if it's something I don't get about arrays in MQL5, I really don't even know where to start to understand this situation. 

Half of my code is broken because of this stuff.

Help pls? 

Bogdan Caramalac
1112
Bogdan Caramalac 2010.09.27 19:29  

Hmm... first, never assign an integer value to a double. You can make that a[i] = i*1.0 ; would be better for the compile.

Second, you should refrain from having formal parameters (double& a[]) with the same name as public variables (double a[10]), because the compiler would be confused between the public variable and the formal parameter. It would choose what is instructed to choose and it won't give a damn on what you actually want. 

Plus that in the second for cycle, you do not reassign the values of the array with something like a[i]=sum; after you call addElements.

In the end, I don't use printf.

I put a normal Print("a[",i,"]=",a[i]); and I got something else.

Mihai Ionescu
1354
Mihai Ionescu 2010.09.27 19:39  
TheEconomist:

Hmm... first, never assign an integer value to a double. You can make that a[i] = i*1.0 ; would be better for the compile.

Second, you should refrain from having formal parameters (double& a[]) with the same name as public variables (double a[10]), because the compiler would be confused between the public variable and the formal parameter. It would choose what is instructed to choose and it won't give a damn on what you actually want. 

Plus that in the second for cycle, you do not reassign the values of the array with something like a[i]=sum; after you call addElements.

In the end, I don't use printf.

I put a normal Print("a[",i,"]=",a[i]); and I got something else.

Phew... Good pointers... I'm getting back to the code to see if names of the arrays are different. 

Very nice remark about printf 

I thought about assigning 1.0*i, but with no changed results (just an usual warning at compilation).

Thank you very very much for your comment. At least now I have a track.

I will come back with results. 

Mihai Ionescu
1354
Mihai Ionescu 2010.09.27 20:05  

In my code, The array names were different altogether. When I created the test script, I made the mistake of declaring array a and formal parameter array with the same name.

I was confused about printf messages. Print function works. printf doesn't work in this case.

It seems the code works actually. But I will double check everything and post here back if something related to arrays eventually pops up. 

 

But now another little thing appeared, not related to my problem, but still a bug (from my point of view). 

This is the new code (a little changed).

 

double a[10];

void OnStart()
  {
//---
   for (int i=0;i<10;i++) {
      a[i] = i;
      //printf("initial state: a[%d]=%d",i,a[i]);
      Print("initial state: a[",i,"]=",a[i]);
   }
   
   double sum;
   
   for (int i=0;i<10;i++) {
      addElements(a,i,a[i]); //THIS DOESN'T WORK
      //a[i] = sum; // THIS WORKS
   }
   
   for (int i=0;i<10;i++) {
      //printf("final state: a[%d]=%d",i,a[i]);
      Print("final state: a[",i,"]=",a[i]);
   }
   
  }
  
bool addElements(double& inputArray[], int i, double& inputSum) {
   int len = ArraySize(inputArray);
   
   inputSum = 5*inputArray[i];
   return (true);   
}

 why addElements(a,i,a[i]) doesn't work? Weird values appear there. I guess it's about pointers.

Am I missing something or it's a bug ?

Documentation on MQL5: Common Functions / Print
  • www.mql5.com
Common Functions / Print - Documentation on MQL5
Bogdan Caramalac
1112
Bogdan Caramalac 2010.09.27 20:37  

I get this, running this script:

2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[9]=9
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[8]=8
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[7]=7
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[6]=6
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[5]=5
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[4]=4
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[3]=3
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[2]=2.000000000000028
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[1]=4.056481920730334e+031
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[0]=0

 Yes, we have a bug confirm. Works perfectly with the other line:

2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[9]=45
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[8]=40
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[7]=35
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[6]=30
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[5]=25
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[4]=20
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[3]=15
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[2]=10
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[1]=5
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[0]=0

Rashid Umarov
Admin
11989
Rashid Umarov 2010.09.27 21:48  

Your code has one a little but fatal mistype. Try this

double a[10];

void OnStart()
  {
//---
   for (int i=0;i<10;i++) {
      a[i] = i;
      printf("initial state: a[%d]=%G",i,a[i]);
   }
   
   double sum;
   
   for (int i=0;i<10;i++) {
      addElements(a,i,sum);
   }
   
   for (int i=0;i<10;i++) {
      printf("final state: a[%d]=%G",i,a[i]);
   }
   
  }
  
bool addElements(double& a[], int i, double& sum) {
   int len = ArraySize(a);
   
   sum = 5*a[i];
   return (true);   
}

Mihai Ionescu
1354
Mihai Ionescu 2010.09.27 22:01  
TheEconomist:

I get this, running this script:

2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[9]=9
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[8]=8
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[7]=7
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[6]=6
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[5]=5
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[4]=4
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[3]=3
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[2]=2.000000000000028
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[1]=4.056481920730334e+031
2010.09.27 17:36:21 ifmihai (USDCAD,D1) final state: a[0]=0

 Yes, we have a bug confirm. Works perfectly with the other line:

2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[9]=45
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[8]=40
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[7]=35
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[6]=30
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[5]=25
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[4]=20
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[3]=15
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[2]=10
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[1]=5
2010.09.27 17:38:58 ifmihai (USDCAD,D1) final state: a[0]=0

Same here. a[2] and a[1] have exactly the same values in my case too. 
Mihai Ionescu
1354
Mihai Ionescu 2010.09.27 22:02  
Rosh:

Your code has one a little but fatal mistype. Try this


Very good remark. Really helped. 
Bogdan Caramalac
1112
Bogdan Caramalac 2010.09.27 22:27  

Yes, but the mistype was in printf. This doesn't cancel the fact there is something fishy about passing an array item to a procedure expecting a double as reference. 

To add comments, please log in or register