Как присвоить указатель на массив структур в MQL?

У меня есть 3 отдельных массива struct одного типа, для пример:

MqlTradeRequest orders1[];
MqlTradeRequest orders2[];
MqlTradeRequest orders3[];

Аналогично описанному для C здесь.

Предполагая, что эти массивы будут заполнены позже, как я могу создать общий указатель на один из них?


Так что я могу сделать что-то вроде: orders_ptr = &orders1 или *orders_ptr = orders1.

Вот мой нерабочий код:

MqlTradeRequest orders1[];
MqlTradeRequest orders2[];
MqlTradeRequest orders3[];

enum ORDERS_POOL {
  POOL1,
  POOL2,
  POOL3
};

void start(ORDERS_POOL _pool = POOL1) {
  MqlTradeRequest (*orders_ptr)[]; // Error: Invalid operation use.
  switch (_pool) {
    case POOL1: orders_ptr = &orders1; break; // Error: Invalid array access, class type expected.
    case POOL2: orders_ptr = &orders2; break; // Error: Invalid array access, class type expected.
    case POOL3: orders_ptr = &orders2; break; // Error: Invalid array access, class type expected.
  }
  for (int i = 0; i < ArraySize(orders_ptr); i++) {
    Print(orders_ptr[i].order);
  }
};

А вот еще попытка:

  MqlTradeRequest *orders_ptr; // Error: Invalid operation use.
  switch (_pool) {
    case POOL1: *orders_ptr = GetPointer(orders1); break; // Error: Object pointer expected.
    case POOL2: *orders_ptr = GetPointer(orders2); break; // Error: Object pointer expected.
    case POOL3: *orders_ptr = GetPointer(orders2); break; // Error: Object pointer expected.
  }

Под другим пулом я подразумеваю что-то похожее на то, что сделано в OrderSelect с его пулом аргумент, но мои пулы совершенно другие.

Однако приведенный выше код дает сбой с множеством ошибок, которые не имеют никакого смысла, я включил некоторые из них в комментарии.

Какой подход будет правильным?

Моя цель - назначить указатель на массив структур, чтобы я мог пройти через выбранный массив.


person kenorb    schedule 17.01.2017    source источник
comment
[ не для записи ] ваши недавние проблемы кажутся действительно творческой пыткой внутренних границ Нового-MQL4/5 синтаксиса. Удачи на охоте! Всегда вдохновляю толпу, чувак +1!   -  person user3666197    schedule 18.01.2017


Ответы (2)


Мне кажется, в MQL5 этого сделать нельзя.
Для динамических объектов указатели можно использовать только как классы, для структур это статический указатель, такой же, как массив или примитив, а MqlRates — это структура, а не класс.
Если вам очень нужна такая магия - создавайте классы, в которых есть массив Mql-структур.

person Daniel Kniaz    schedule 18.01.2017

Согласно ответу службы поддержки MQL, невозможно создать указатели на объекты типа структуры и невозможно получить указатель на массив.

Вместо этого предлагается обернуть массив MqlTradeRequest в объект класса (например, CTradeReqArray), после чего можно выбрать нужный массив и получить указатель на объект CTradeReqArray, как это предлагается в Ответ Даниэля.

person kenorb    schedule 13.02.2017