Erreurs, bugs, questions - page 2258

 
fxsaber:

Faites une béquille à travers le minuteur.

Vous ne voulez pas faire une béquille. Les développeurs MQ peuvent élargir les possibilités.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bugs, bugs, questions

Anatoli Kazharski, 2018.08.20 08:11

Je veux pouvoir suivre les changements de propriétés de tous les graphiques, et pas seulement de celui où se trouve le programme MQL.

Actuellement, l'événementCHARTEVENT_CHART_CHANGE ne contient pas d'autres paramètres :

Événement

Valeur du paramètre id

valeur du paramètre lparam

valeur du paramètre dparam

Valeur du paramètre sparam

L'événement de changement des dimensions du graphique ou de changement des propriétés du graphique via le dialogue des propriétés.

CHARTEVENT_CHART_CHANGE

-

-

-

//---

Pour suivre cet événement sur d'autres graphiques ouverts, le suivi pourrait être activé en spécifiant l'ID du graphique souhaité.

Par exemple, comme ceci :

ChartSetInteger(chart_id,CHART_EVENT_CHART_CHANGE,true);
//---


Comme lparam-paramètre pourrait être l'identifiant du graphique sur lequel les changements ont été effectués. Le paramètre sparam pourrait être le nom du symbole.

 
A100:

Erreur pendant l'exécution :

Résultat : Attendu :

A::f<int>:1 A::f<int>:1
A::f<int>:753790661 A::f<int>:2
A::f<int>:Erreur:4007

Autrement :

Bien. Quelle est la différence ? Pourquoi la taille du tableau est soudainement devenue 753790660 (au lieu de un) et par conséquent la mémoire s'est soudainement épuisée (4007) ? MT5\1881\32

De plus... si vous supprimez littéralement trois caractères de la classe dans le premier cas, le résultat sera également correct.

Merci pour le message.

Fixe.


Pour fonctionner dans la version actuelle, ne spécifiez pas la classe scop lorsque vous déclarez ses méthodes.


Les autres rapports de bogue sont liés à celui-ci et ne seront pas reproduits une fois les corrections apportées.

 

l'exemple de l'aide ne fonctionne pas :

https://www.mql5.com/ru/docs/basis/function/operationoverload

l'exemple tout en bas de la page ne fonctionne pas, à partir des mots :

Другой пример перегрузки операции индексирования - работа с матрицами. Матрица представляет собою двумерный динамический массив, размеры массивов заранее неопределены. Поэтому нельзя объявить массив вида array[][] без указания размера второго измерения и затем передавать этот массив в качестве параметра. Выходом может служить специальный класс CMatrix, который содержит в себе массив объектов класса CRow.

le compilateur écrit :

l'objet 'CMatrix' ne peut être renvoyé, la copie du constructeur 'CMatrix::CMatrix(const CMatrix &)' n'a pas été trouvée tst.mq5 244 14

l'objet 'CMatrix' ne peut être renvoyé, la copie du constructeur 'CMatrix::CMatrix(const CMatrix &)' n'a pas été trouvée tst.mq5 261 11

l'objet 'CMatrix' ne peut être renvoyé, la copie du constructeur 'CMatrix::CMatrix(const CMatrix &)' n'a pas été trouvée tst.mq5 281 14

l'objet 'CMatrix' ne peut être renvoyé, la copie du constructeur 'CMatrix::CMatrix(const CMatrix &)' n'a pas été trouvée tst.mq5 303 11

4 erreur(s), 0 avertissement(s) 5 1




Документация по MQL5: Основы языка / Функции / Перегрузка операций
Документация по MQL5: Основы языка / Функции / Перегрузка операций
  • www.mql5.com
Перегрузка операций позволяет использовать операционную нотацию (запись в виде простых выражений) к сложным объектам - структурам и классам. Запись выражений с использованием перегруженных операций упрощает восприятие исходного кода, так как более сложная реализация сокрыта. Для примера рассмотрим широко применяемые в математике комплексные...
 

Erreur de compilation (ME\1881\32)

template<typename T>
class B;
template<typename T>
class A {
        B<int> *f() { return NULL; }
};
template<typename T>
class B : public A<T> {}; //Error: 'A' - struct undefined
void OnStart()
{
        A<int> *a;
        B<int> *b;
}

Et donc :

void OnStart()
{
        B<int> *b;
        A<int> *a;
}
bien. Quelle différence cela fait-il ?
 
fxsaber:

Ce n'est pas la raison.

cela aide beaucoup lors de la lecture du code et permet d'éviter les erreurs dans certaines situations.

Notez que cela ne fonctionne pas partout dans MQL :

class A { protected:
        int a;
};
class B : public A {
        int a;
        void f1() { this.a    = 0; } //нормально
        void f2() { this.A::a = 0; } //Error: '::' - syntax error
};

qu'en C++ il compile sans erreur

 
A100:

Notez que cela ne fonctionne pas partout dans MQL :

qui en C++ compile sans erreur

Le C++ a un don pour la perversion. Peut-être que quelque part dans les macros, cela pourrait être utilisé, mais pas directement.

 
Dans le coin supérieur droit, je vois toujours une icône indiquant que j'ai des MP non lus. Il n'y a aucun moyen de le réinitialiser - c'est lu. Veuillez ajouter un bouton "Faire tout lire".
 
fxsaber:

Il est possible de l'utiliser quelque part dans les macros, mais pas directement.

Les macros n'ont rien à voir avec cela - remplacez-les par un pointeur normal et vous aurez exactement la même syntaxe :

struct A {
        int x;
};
struct B : A {
        int x;
};
void OnStart()
{
        B b;
        b.A::x = 1; //Error: '::' - syntax error
}
En MQL, vous ne pouvez pas faire explicitement référence à b.A::x, alors qu'en C++ vous le pouvez. Pourquoi une telle restriction ?
 
A100:

Les macros n'ont rien à voir avec cela - remplacez-les par un pointeur ordinaire et vous aurez exactement la même syntaxe :

Dans ce cas, c'est justifié. Le problème, c'est qu'il n'est pas évident de savoir pourquoi l'écrire de cette façon. Quand A: : dit déjà tout.

 
fxsaber:

L'option avec ceci - on ne sait pas pourquoi vous l'écrivez de cette façon. Quand A: : dit déjà tout.

Que dit le A: : mis en évidence dans ce cas ?

class A { public:
    static int a;
};
int A::a;
class C { public:
        int a;
};
class D : public C {};
class B : public D {
        int a;
        void f1() { this.a    = 0; }
        void f2() {      A::a = 0; }
        void f3() { this.C::a = 0; }
};