ГОСПОДА РАЗРАБОТЧИКИ MQL4! Функции ArraySize и ArrayRange не всегда работают!

 

Очень хочется пояснений по следующей ситуации:

Имеем 2 массива, у первого (Arr1) размер задан неявно, у второго (Arr2) - явно.

Для массива Arr1 функции ArraySize и ArrayRange возвращают "0". Почему? Ведь именно для массива такого типа они более востребованы.

--

Вот текст скрипта:

int start() {
int Arr1[][2] =
{
   110, 11,
   120, 12,
   130, 13,
   140, 14
};
int Arr2[4][2] =
{
   210, 21,
   220, 22,
   230, 23,
   240, 24
};

Print("ArraySize(Arr1)=",ArraySize(Arr1)," ArrayRange(Arr1,0)=",ArrayRange(Arr1,0));
Print("ArraySize(Arr2)=",ArraySize(Arr2)," ArrayRange(Arr2,0)=",ArrayRange(Arr2,0));

return(0);
}

Вот результат:

2009.09.17 15:14:20 TEST GBPJPY,H1: ArraySize(Arr1)=0 ArrayRange(Arr1,0)=0

2009.09.17 15:14:20 TEST GBPJPY,H1: ArraySize(Arr2)=8 ArrayRange(Arr2,0)=4

 

Имхо, эта запись некорректна

int Arr1[][2] = { 110, 11, 120, 12, 130, 13, 140, 14 };

 
TheXpert писал(а) >>

Имхо, эта запись некорректна

int Arr1[][2] = { 110, 11, 120, 12, 130, 13, 140, 14 };

Похоже, действительно некорректна, но при этом компиллятор не ругается :(

 
PapaYozh >>:

Очень хочется пояснений по следующей ситуации:

Имеем 2 массива, у первого (Arr1) размер задан неявно, у второго (Arr2) - явно.

Для массива Arr1 функции ArraySize и ArrayRange возвращают "0". Почему? Ведь именно для массива такого типа они более востребованы.

--

Вот текст скрипта:

Вот результат:

Arr1 у вас динамический

сначала распределите под него память!

 
PapaYozh >>:

Похоже, действительно некорректна, но при этом компиллятор не ругается :(

Это да

 
YuraZ писал(а) >>

Arr1 у вас динамический

сначала распределите под него память!

Я считал, что на этапе компилляции под него будет отведена необходимая память.

Для одномерных массивов все хорошо работает:

int start () {
  int   Arr1[] = { 110, 11, 120, 12, 130, 13, 140, 14 };
  int   Arr2[8] = { 210, 21, 220, 22, 230, 23, 240, 24 };
  
  Print("ArraySize(Arr1)=",ArraySize(Arr1)," ArrayRange(Arr1,0)=",ArrayRange(Arr1,0));
  Print("ArraySize(Arr2)=",ArraySize(Arr2)," ArrayRange(Arr2,0)=",ArrayRange(Arr2,0));
  Print("Arr1[2]=",Arr1[2]," Arr1[3]=",Arr1[3]);
  Print("Arr2[2]=",Arr2[2]," Arr2[3]=",Arr2[3]);

  return(0);
}

--

Результат:

15:46:49 TEST GBPJPY,H1: ArraySize(Arr1)=8 ArrayRange(Arr1,0)=8
15:46:49 TEST GBPJPY,H1: ArraySize(Arr2)=8 ArrayRange(Arr2,0)=8
15:46:49 TEST GBPJPY,H1: Arr1[2]=120 Arr1[3]=12
15:46:49 TEST GBPJPY,H1: Arr2[2]=220 Arr2[3]=22

 
PapaYozh писал(а) >>

Я считал, что на этапе компилляции под него будет отведена необходимая память.

Для одномерных массивов все хорошо работает:

--

Результат:

Видимо нельзя делать такое присваивание для многомерных массивов.

 
YuraZ писал(а) >>

Arr1 у вас динамический

сначала распределите под него память!

Мы здесь все еще о MQL4 =)

 
Integer >>:

Видимо нельзя делать такое присваивание для многомерных массивов.

Видимо. Из-за сложностей с вычислением размеров размерностей и непонятками, что делать если количество элементов неправильное, наверное.

Integer >>:

Мы здесь все еще о MQL4 =)

А разница?

 
Integer >>:

Мы здесь все еще о MQL4 =)

ну да :-), но память все равно надо распределить если динамика


int start() {
int Arr1[][2] =
{
   110, 11,
   120, 12,
   130, 13,
   140, 14
};
int Arr2[4][2] =
{
   210, 21,
   220, 22,
   230, 23,
   240, 24
};
int Arr3[][2] =
{
   110, 11,
   120, 12,
   130, 13,
   140, 14
};


Print("ArraySize(Arr1)=",ArraySize(Arr1)," ArrayRange(Arr1,0)=",ArrayRange(Arr1,0));
Print("ArraySize(Arr2)=",ArraySize(Arr2)," ArrayRange(Arr2,0)=",ArrayRange(Arr2,0)); // памяьть не распределена
Print (  " Arr3 "+ArrayResize(Arr3 ,8 ) ); // т к массив динамический под него надо сначала распределить память
Print("ArraySize(Arr3)=",ArraySize(Arr3)," ArrayRange(Arr2,0)=",ArrayRange(Arr3,0)); //  и как видим все ок огда


Print (  " Arr2 "+ArrayResize(Arr2 ,8 ) ); // т к массив динамический под него надо сначала распределить память
Print("ArraySize(Arr2)=",ArraySize(Arr2)," ArrayRange(Arr2,0)=",ArrayRange(Arr2,0)); // памяьть   распределена

// ну вот теперь все в норме

return(0);
}


2009.09.17 18:22:16 ttta NZDUSD,M15: ArraySize(Arr2)=16 ArrayRange(Arr2,0)=8
2009.09.17 18:22:16 ttta NZDUSD,M15: Arr2 16
2009.09.17 18:22:16 ttta NZDUSD,M15: ArraySize(Arr3)=16 ArrayRange(Arr2,0)=8
2009.09.17 18:22:16 ttta NZDUSD,M15: Arr3 16
2009.09.17 18:22:16 ttta NZDUSD,M15: ArraySize(Arr2)=8 ArrayRange(Arr2,0)=4
2009.09.17 18:22:16 ttta NZDUSD,M15: ArraySize(Arr1)=0 ArrayRange(Arr1,0)=0
2009.09.17 18:22:16 ttta NZDUSD,M15: loaded successfully
 

Пользы-то никакой от ресайза после присвоения значений, они не пояляются. Факт, что для одномерных массиво можно использовать конструкцию x[]={};, а для многомерных нет.

Причина обращения: