Как я могу заполнить динамический двумерный массив в цикле for

#algorithmic-trading #mql5 #metatrader5

Вопрос:

Многим это может показаться тривиальным, но, похоже, это берет надо мной верх, так как я не смог понять, как использовать ArrayResize() (что, я считаю, очень необходимо) для решения этой проблемы.

В приведенном ниже коде я хочу указать ar[][2] , когда isBody это true произойдет . Как я могу этого достичь?

 int ar[][2];

void CheckBody()   {

   for (int i = 20; i >= 0; i--) {
   
      if (isBody) {
         int a = i   1;
         int b = i - 3*i;
         
         // how to populate ar with [a,b] when isBody is true in this block
         
      }
   }
}

 

Ответ №1:

Попробуйте следующий код, он запрограммирован для работы в качестве советника, но может быть легко изменен при использовании в индикаторе (вам придется добавить свой код для isBody переменной).

 #property strict

int ar[][2];

// ------------------------------------------------------------------ 
//| Initialization function of the expert                            |
// ------------------------------------------------------------------ 
int OnInit()
{
   ArrayInitialize(ar,NULL);
   ArrayResize(ar,1);
return(INIT_SUCCEEDED);
}
// ------------------------------------------------------------------ 
//| Deinitialization function of the expert                          |
// ------------------------------------------------------------------ 
void OnDeinit(const int reason)
{

}
// ------------------------------------------------------------------ 
//| "Tick" event handler function                                    |
// ------------------------------------------------------------------ 
void OnTick()
{
   for(int i=20; i>=0; i--)
   {
      if(isBody)
      {
         if(ar[0][0]!=NULL) ArrayResize(ar,ArrayRange(ar,0) 1);
         int a=i 1;
         int b=i-3*i;
         ar[ArrayRange(ar,0)-1][0]=a; ar[ArrayRange(ar,0)-1][1]=b;
      }
   }
}
 

Комментарии:

1. Я попробовал код и получил ошибку компилятора, ’{’ - too many initializers указывающую на int ar[1][2] = {NULL,NULL}; то, что я изменил его int ar[1][2] = {NULL}; , и это решило проблему. После запуска кода я понял, что размер массива ar всегда равен 2, независимо от количества элементов, которые я добавляю в массив.

2. Я отредактировал свой ответ, и, надеюсь, теперь он должен сработать для вас

3. Извините, я давно здесь не был. Спасибо.

4. код , который вы предоставили выше, работает для int s, но когда я использую double , первая пара двойников дает мне некоторое значение мусора. Я всегда получаю 4.243991582918676 e-314 и 1.152034350044175 e-309 для первой пары, что далеко не правильно.

5. Я думаю, вам нужно опубликовать свой код в качестве нового вопроса.