Ссылки на массив

 

Мотив:

Дело в том, что довольно часто в индюках требуется доступ к таймсериям, которые передаются в OnCalculate.

Вложенность этих функций может быть довольно значительной, и приходится тащить этот массив из OnCalculate по всей цепочке вызовов в качестве параметра.

При том что в значительной части цепочки этот массив нафиг не нужен.

Что хочется:

Некоторое подобие ссылок на массив, типа такого:

class TimeReference
{
//
   datetime Time[];
};

TimeReference TimeRef;

datetime F()
{
   return TimeRef.Time[0];
}

int OnCalculate(const int bars,
                const int counted,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& sprd[])
{
   TimeRef.Assign(time);
   F();
}

НО. Обязательное условие -- копирования массивов быть не должно.

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

Что скажете, господа?

 

это ж кусок памяти. в МQL нет явно указателей на память.

но можешь получить через memcpy. она возвращает что надо.

дальше можешь тягать то значение куда нужно. и аналогично юзать memcpy по её значению.

глянь мою статью про DLL

 
sergeev:
Как этот указатель обратно подсунуть?
 
тем же memcpy. в него ведь указатель и передается.
 
sergeev:
тем же memcpy. в него ведь указатель и передается.

Нет, им можно взять указатель но не подсунуть.

___________

Ладно, короче видимо таки нереально сделать нормально.

 
TheXpert:
Нет, им можно взять указатель но не подсунуть.

и подсунуть, проверено.

 
sergeev:

и подсунуть, проверено.

Покажи пример.
 
TheXpert:
Покажи пример.

ну дык в статье же ж

я пытаюсь код вставить.  сервак зависает.

 
sergeev:

ну дык в статье же ж

В статье нету как раз. Там только копирование памяти есть из массива в заранее заготовленный массив.
 
https://www.mql5.com/ru/articles/364#3

первый пример

передается int Source  - по сути адрес памяти

и копируется в массив char Dest[10]

Избавляемся от балласта самодельных DLL
Избавляемся от балласта самодельных DLL
  • 2012.01.31
  • o_O
  • www.mql5.com
Если MQL5-программисту недостаточно функционала языка, он вынужден обращаться к дополнительным инструментам. Для этого приходится использовать другой язык программирования и создавать промежуточную DLL. В MQL5 имеется механизм представления разных типов данных с помощью структур и передачи их в API, но к сожалению, MQL5 не отвечает нам на вопрос о том, как вытянуть данные из принятого указателя. В данной статье мы поставим точку в этом вопросе и покажем простые механизмы обмена сложными типами данных и работе с ними.
 

ну как, получилось получить?  ты теперь memcpy наверно перегружаешь для всех типов?

только не забудь, что для 64 битной размер адреса long.

--------------

Предложение номер раз:  как думаешь, стоит ли попросить разрабов сделать нативную функцию типа long ArrayGetAddress(object array) ?

Если на такое не пойдут, то предложение два: надо проталкивать #ifdef.  Ренат обещался вроде внедрить.

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