class XX
{
int xx;
};
double func1(const XX *&array[])
{
return0;
}
voidOnStart()
{
XX *a[1];
func1(a); // cannot convert type 'XX *' to reference of type 'const XX *'
}
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Возможно немного неправильно вас понял. Константные указателиобъекты тоже можно, но почему-то только наряду с константным массивом
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
*/return0;
}
voidOnStart()
{
XX *a[1];
func1(a);
}
Дополнение 2.
Ваш код в MT4 компилируется. В MT5 раньше тоже так можно было, судя по всему (пост из кармана ниже). Ну, уже так нельзя, получается (только вместе с константным массивом)
// Non-const array of pointers to const objectsvoid 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
}
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Потому что это ссылка! Это ограничение MQL, поскольку в качестве ссылки можно передавать только массив.
Константные указателиобъекты тоже можно, но почему-то только наряду с константным массивом
Понятно. В 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), и т.д.
Попробуйте отключить по максимуму в настройках терминала галочки используемых сервисов в Community. что в трех в одном из которых и была проблема эта галка на сигналах таки снята. 635 Terminal MetaTrader 5 x64 build 5200 started for MetaQuotes Ltd
Добрый день! почему нельзя нормально закодить платформу под UNIX системы, чтоб он работал везде на любой платформе полноценно без всяких эмуляторов типа wine.
Также почему ордера в самом метатрейдере исполняются медленее с задержкой, нежели при коннекте через python, почему к метатрейдеру коннектится только python-3.12 и новее версия неконнектится, хотя новее гораздо шустрее.
Просим сделать нативную кроссплатформенность без эмуляторов, которые работают с задержкой
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Так и не решена эта проблема в MQL5?
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Так и не решена эта проблема в MQL5?
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Подробнее здесь: https://www.mql5.com/en/forum/457825
Дополнение.
Возможно немного неправильно вас понял. Константные указатели объекты тоже можно, но почему-то только наряду с константным массивом
Дополнение 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
Так и не решена эта проблема в MQL5?
Функция задекларирована, как не меняющая объекты по указателям в массиве. В неё передается массив неконстантных указателей (что не должно ограничивать применимость функции). Почему функция не подходит по прототипу? Если бы было в обратную сторону (массив константных объектов передавался бы в другую функцию, меняющую объекты) - это была бы ошибка.
Пробовал разные явные касты прописать - жалоб компилятора становится только больше.
Потому что это ссылка! Это ограничение MQL, поскольку в качестве ссылки можно передавать только массив.
Константные указатели объекты тоже можно, но почему-то только наряду с константным массивом
Понятно. В 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.
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) , но работает!
может отсюда и глюки моего терминала?
Добрый день! почему нельзя нормально закодить платформу под UNIX системы, чтоб он работал везде на любой платформе полноценно без всяких эмуляторов типа wine.
Также почему ордера в самом метатрейдере исполняются медленее с задержкой, нежели при коннекте через python, почему к метатрейдеру коннектится только python-3.12 и новее версия неконнектится, хотя новее гораздо шустрее.
Просим сделать нативную кроссплатформенность без эмуляторов, которые работают с задержкой
у меня должно быть две папки :
~/Library/Application Support/Metatrader 5
~/Library/Application Support/net.metaquotes.wine.metatrader5