Ссылки на массив - страница 6

 

Для информации:

  1. Все массивы в MQL5 передаются только по ссылке (4 или 8 байт в стеке), поэтому не надо бояться передавать массивы внутрь функций - никаких особых расходов нет.
  2. Хранить извлеченные реальные ссылки на память очень опасно, особенно ссылки на массивы, управляемые самым терминалом (индикаторные буферы, OHLC буферы), так как они реально изменяются/переаллоцируются. Тем более нельзя сохранять недокументирвоанные ссылки между вызовами (выход и вход в код скрипта) эксперта.
  3. При передаче массива в DLL указывается адрес начала блока данных, а размерности нужно указывать отдельно.
 
mql5:

Для начала нужно понять, ЗАЧЕМ? И какая от этого польза?

Ну вы не хотите делать ссылки -- мы сделаем их сами.

Да и спасибо участвующим, благодаря сообщениям в этой ветке обнаружил, что в справке описание устарело...

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

Может тогда уже расскажете о всех флагах?

Renat:

Для информации:

  1. Все массивы в MQL5 передаются только по ссылке (4 или 8 байт в стеке), поэтому не надо бояться передавать массивы внутрь функций - никаких особых расходов нет.

Я не боюсь, я прекрасно понимаю, что это недорого. Просто неудобно.

  1. Хранить извлеченные реальные ссылки на память очень опасно, особенно ссылки на массивы, управляемые самым терминалом (индикаторные буферы, OHLC буферы), так как они реально изменяются/переаллоцируются. Тем боее нельзя сохранять недокументирвоанные ссылки между вызовами (выход и вход в код скрипта) эксперта.

Про этот момент поподробнее пожалуйста -- разве во время OnCalculate может быть перераспределение памяти?? Этож пипец.

Про между вызовами это понятно конечно.

Не в моих интересах иметь фичу, которая крешит индюки или вообще терминал, так что выкладывать буду максимально безопасный вариант.

 
TheXpert:

Про этот момент поподробнее пожалуйста -- разве во время OnCalculate может быть перераспределение памяти?? Этож пипец.


не "во время" - а между.
 
TheXpert:

Про этот момент поподробнее пожалуйста -- разве во время OnCalculate может быть перераспределение памяти?? Этож пипец.

Про между вызовами это понятно конечно.

Конечно речь об возможном перераспределении между вызовами.

Проблема в том, что кто-нибудь обязательно по ошибке или явно будет сохранять ссылку между вызовами, в 99% случаев все будет работать до момента креша. После чего будут вполне ожидаемые мысли "Метаквотс виноват".

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

 
Renat:

Конечно речь об возможном перераспределении между вызовами.

Проблема в том, что кто-нибудь обязательно по ошибке или явно будет сохранять ссылку между вызовами, в 99% случаев все будет работать до момента креша. После чего будут вполне ожидаемые мысли "Метаквотс виноват".

"Вины бояться - вперёд не ходить" (с)

И ещё:  Лучше сожалеть о сделанном, чем о не сделанном.

Ренат, допустим я соглашусь, что ссылочные переменные - потенциальный источник проблем.  Но ведь это практицки про любой инструмент можно сказать. Люди вона отвёртками в других людей иногда тыкают. Не запрещать же теперь отвёртки?  И уж тем более бессмысленно просто снимать их с производства, поскольку и дома можно изготовить без особых проблем.

"Ссылки" как сущность mql крайне желательны, даже не в виде переменных, а в виде возможности вернуть ссылку ( lvalue ) из функции.  Это позволит делать хотя бы реально быстрые левые индексаторы для контейнеров и даст множество всяких других дополнительных возможностей.   Типа:

MyTree.Search(Key).GetElement() = NewVal;

И ведь я понимаю, что обязательно найдутся желающие вернуть из функции ссылку на локальную переменную !

И что теперь?  Забыть про ссылки, ибо дураки себе ими жизнь могут затруднить?  :)

--

Вот такие вот ограничения mql5 (подобные отсутствию ссылок) иногда сильно мотивируют "сбежать в DLL", превратив MT5 просто в "рыночный драйвер" обеспечивающий связь с брокером.  А ведь первоначальная идея была как раз противоположной - исключить необходимость использования внешних средств программирования, ибо "всё есть прямо здесь".

 

Обратного пути нет, так как мы нацелены на максимальную безопасность языка.

Работа с сырыми ссылками - это твердый и уверенный шаг к крешу. А падать программам с выносом всей системы виртуализации не позволено.

Наше решение полностью осознанное. MQL5 используется для написания программ, которые будут работать на огромном количестве компьютеров, причем без участия человека.

 

Вобщем кому надо, надеюсь принцип понятен. Реализацию я придержу пока, корысти для. Но она будет, и будет открытой.

Думаю не нужно объяснять, что ссылки на базовые типы, вроде int делаются гораздо легче и без особых проблем.

Единственный вопрос который вызывает сложности и вопросы в реализации -- область видимости базовой переменной. Здесь на самом деле очень широкое поле для реализаций и задумок.

________

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

 
lvalue ссылки планируются...
 
mql5:
lvalue ссылки планируются...
Блин, сказали бы сразу ) я б не мучался. Но это есть отлично.
 

Всех приветствую.


Интересно, что-то за восемь лет изменилось ?

Или по-прежнему адрес массива из OnCalculate() можно получить только путем использования msvcrt.dll и функции memcpy ?

Или все по-прежнему "тащат" через всю структуру классов ссылки на массивы (вариант - организуют свои массивы, и каждый раз копируют содержимое) ?

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