Новая версия платформы MetaTrader 5 build 5120: улучшения и исправления - страница 53

 

Так и не решена эта проблема в MQL5?

class XX
{
   int xx;
};

double func1(const XX *&array[])
{
   return 0;
}

void OnStart()
{
   XX *a[1];
   func1(a); // cannot convert type 'XX *' to reference of type 'const XX *'
}

Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.

Пробовал разные явные касты прописать - жалоб компилятора становится только больше.

 
Stanislav Korotky #:

Так и не решена эта проблема в MQL5?

Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.

Пробовал разные явные касты прописать - жалоб компилятора становится только больше.

Подробнее здесь: https://www.mql5.com/en/forum/457825
class XX
{
   int xx;
};

double func1(XX *const&array[])
{
   return 0;
}

void OnStart()
{
   XX *a[1];
   func1(a);
}
Passing an array of object pointers
Passing an array of object pointers
  • 2023.11.22
  • www.mql5.com
Using the const specifier I can protect an array of objects from being resized: Why doesn't this work for an array of pointers...
 
Vladislav Boyko #:
Подробнее здесь: https://www.mql5.com/en/forum/457825

Дополнение.

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

class XX
{
   int xx;
};

double func1(const XX *const&array[])
{
   /*
   array[0] = NULL;         // 'array' - constant cannot be modified
   ArrayResize(array, 123); // constant variable cannot be passed as reference
   */
   return 0;
}

void OnStart()
{
   XX *a[1];
   func1(a);
}

Дополнение 2.

Ваш код в MT4 компилируется. В MT5 раньше тоже так можно было, судя по всему (пост из кармана ниже). Ну, уже так нельзя, получается (только вместе с константным массивом)

Forum on trading, automated trading systems and testing trading strategies

Passing an array of object pointers

Vladislav Boyko, 2023.11.22 06:44

// Non-const array of pointers to const objects
void test(const Foo* &arr[])
  {
   ArrayResize(arr, 1); // [Changing an array]:    OK
   arr[0] = new Foo();  // [Changing the pointer]: OK
   arr[0].i = 1;        // [Changing an object]:   'i' - constant cannot be modified
  }

void test2(Foo const* &arr[]) // (It's the same thing)
  {
   ArrayResize(arr, 1); // [Changing an array]:    OK
   arr[0] = new Foo();  // [Changing the pointer]: OK
   arr[0].i = 1;        // [Changing an object]:   'i' - constant cannot be modified
  }
 
Stanislav Korotky # :

Так и не решена эта проблема в MQL5?

Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.

Пробовал разные явные касты прописать - жалоб компилятора становится только больше.

Потому что это ссылка! Это ограничение MQL, поскольку в качестве ссылки можно передавать только массив.

 
Vladislav Boyko #:

Константные указатели объекты тоже можно, но почему-то только наряду с константным массивом

Понятно. В C++ массивы передаются как ссылки, а в случае массива ссылок будет ссылка на ссылку. Поэтому там действительно нужно добавлять const к массиву (то есть второй ссылке), чтобы убедить компилятор, что вы не подмените указатели внутри функции на что-то константное, и тогда после возврата функции это можно будет редактировать, так как оно попадет в неконстантные внешние указатели. В MQL5 массив - это массив (а не двойной/тройной/итд указатель), но если он сам не константный, то получается, что функции разрешено в него записать другой константный указатель, и в результате - в вызывающем коде массив с неконстантными указателями станет содержать ссылку на константный (без явного каста).

Attention! Automatic translation makes the russian "pointer" into english "reference", which is incorrect and mixes these 2 different terms used in C++ and MQL5.

 
Stanislav Korotky #:
Attention! Automatic translation makes the russian "pointer" into english "reference", which is incorrect and mixes these 2 different terms used in C++ and MQL5.

Значит, нужно в русский текст к спорно-переводимым терминам в скобках добавлять английское соответствие правильному значению слова: "указатель" (pointer), "ссылка" (reference), и т.д.

Хм... гугл правильно переводит:


 

Здравсвуйте! в справке указано что после устанровки Metatrader5 на MacOs у меня должно быть две папки :

~/Library/Application Support/Metatrader 5
~/Library/Application Support/net.metaquotes.wine.metatrader5

но у себя я вижу. только эту папку :

~/Library/Application Support/net.metaquotes.wine.metatrader5


при этом терминал работает, правда с большим количеством глюков(я их описывал выше пост #520) , но работает!

может отсюда и глюки моего терминала?


Попробуйте переустиановку мт5 с чистым wine 10.
Попробуйте переустиановку мт5 с чистым wine 10.
  • 2025.08.01
  • www.mql5.com
Попробуйте отключить по максимуму в настройках терминала галочки используемых сервисов в Community. что в трех в одном из которых и была проблема эта галка на сигналах таки снята. 635 Terminal MetaTrader 5 x64 build 5200 started for MetaQuotes Ltd
 

Добрый день! почему нельзя нормально закодить платформу под UNIX системы, чтоб он работал везде на любой платформе полноценно без всяких эмуляторов типа wine.

Также почему ордера в самом метатрейдере исполняются медленее с задержкой, нежели при коннекте через python, почему к метатрейдеру коннектится только python-3.12 и новее версия неконнектится, хотя новее гораздо шустрее.

Просим сделать нативную кроссплатформенность без эмуляторов, которые работают с задержкой