Erreurs, bugs, questions - page 2555

 
Влад:

Ne fonctionne pas, seulement individuellement si on l'accroche au tableau. Utilisé :

Tous résolus.Utilisés :

handle_write=FileOpen("checkbox_color.txt",FILE_READ|FILE_WRITE|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_TXT,';');
handle_read=FileOpen("checkbox_color.txt",FILE_READ|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_TXT,';');
 
Une nouvelle question s'est posée. Dans le premier graphique, je change la variable grâce à l'indicateur mentionné ci-dessus. Dans le deuxième graphique, les informations ne s'affichent que lorsque la TF change, et non pas instantanément comme je le voudrais. Comment le résoudre ? La simple mise à jour du tableau en appuyant sur le PCM n'est d'aucune utilité.
 

le build 2135 est cassé du tout

#define abort(ANY) do{printf("abort, file=%s,  line=%i", __FILE__, __LINE__); Alert(1/(uint)MathAbs(0));}while(false)

#define  GENERATE_VECTOR_GROWTH_FACTOR 2
#define  GENERATE_VECTOR(NAME, REF)                                         \
   template <typename T>                                                   \
   class NAME                                                              \
   {                                                                       \
      uint sz;                                                             \
   public:                                                                 \
      T a[];                                                               \
      NAME(): sz(0) {}                                                     \
      NAME(uint count): sz(0) {                                            \
         if (ArrayResize(this.a, count) == -1)                             \
            abort(0);                                                      \
         this.sz = count;                                                  \
      }                                                                    \
      uint size()const           {return this.sz;}                         \
      void clear()               {this.sz = 0;}                            \
      void push_back(T REF value) {                                        \
         if (this.sz == ArraySize(this.a)  &&                              \
             ArrayResize(this.a, this.sz*                                  \
                           GENERATE_VECTOR_GROWTH_FACTOR+1) == -1)         \
            abort(0);                                                      \
         this.a[this.sz++] = value;                                        \
      }                                                                    \
      void reserve(uint new_cap) {                                         \
         if ((int)new_cap > ArraySize(this.a))                             \
            ArrayResize(this.a, new_cap);                                  \
      }                                                                    \
      void erase(uint pos) {                                               \
         if ( ! ArrayRemove(this.a, (int)pos, 1) )                         \
            abort(0);                                                      \
         -- this.sz;                                                       \
      }                                                                    \
   };
#define  GENERATE_VECTOR_EMPTY
GENERATE_VECTOR(vector_fund, GENERATE_VECTOR_EMPTY);
GENERATE_VECTOR(vector_ref, const &);
#undef  GENERATE_VECTOR_EMPTY
#undef  GENERATE_VECTOR_GROWTH_FACTOR
#undef  GENERATE_VECTOR

'GENERATE_VECTOR' - unexpected token, probably type is missing?    1_mystd.mqh    74    1

GENERATE_VECTOR' - jeton inattendu, le type est probablement manquant ? 1_mystd.mqh 75 1

GENERATE_VECTOR' - variable déjà définie 1_mystd.mqh 75 1

Compilé depuis des lustres, cassé dans la nouvelle version.

 
Vict:

La version 2135 est cassée.

Il compile depuis des lustres, il est cassé dans la nouvelle version.

Je triche, c'est bon, un des avortements a été appelé sous forme de
abort();

avait l'habitude de manger le compilateur, mais dans la nouvelle build il a refusé, ils ont dû bidouiller quelque chose (enfin je ne pense pas avoir accidentellement supprimé un zéro).

 
J'ai remarqué que ME charge 2 cœurs (26%) du CPU lors de la compilation, une question se pose - s'agit-il de multithreading, alors pourquoi tous les cœurs ne seraient-ils pas utilisés pour la compilation ou est-ce une erreur sous forme de gaspillage de ressources?
 
Vict:
Je triche, c'est bon, un des avortements a été appelé sous forme de

Le compilateur avait l'habitude de le manger, mais dans la nouvelle version il a refusé, donc ils ont dû modifier quelque chose (enfin, je ne pense pas avoir accidentellement supprimé un zéro).

En passant, nous devrions demander aux développeurs d'introduire un avortement à temps plein, assert ... Idéalement, bien sûr, et les exceptions. Mais au moins, commencez petit.
 
Alexey Navoykov:
A propos, nous devons demander aux développeurs d'introduire une fonction inline abort, abort ... et idéalement, bien sûr, des exceptions. Mais commencez au moins par un petit.

Mettez un mot, si je ne me trompe pas, je l'ai demandé dans mon dernier cycle MQL, cela fait 4 ans, mais j'ai dû écouter un charivari de gens lettrés, qui disaient qu'ils n'en avaient pas besoin, qu'il suffisait de l'écrire comme ça.... Si vous voulez arrêter l'exécution du programme avec une erreur critique d'accès aux données OHLC ou à l'indicateur... J'ai cherché dans la moitié de kodobase, certains codeurs vérifient ces conditions, mais le traitement est absent, le maximum que je puisse faire est d'afficher poliment dans le journal de l'expert, comme s'il y avait un problème, ne vous inquiétez pas, je vais continuer à travailler avec des données invalides sur ce tic-tac ;)))

SZY : J'ai mal, j'ai besoin d'un moyen simple pour arrêter le traitement du tick actuel ! - pour arrêter le travail de l'expert, c'est possible, mais pour arrêter le traitement d'un tick, il faut l'inventer et le mettre au point - je soupçonne qu'au niveau du compilateur abort() n'est pas réalisé plus difficilement que ExpertRemove() - qui existe déjà

ZZZY : la tâche d'écrire un EA en MQL sans abort() dans un style procédural ressemble plus à une invention qu'à l'assemblage d'un code à partir de sous-routines prêtes à l'emploi. Je soupçonne que ces discussions constantes sur la façon d'écrire un indicateur capable de gérer correctement l'historique d'un autre TF seront également plus faciles à résoudre en utilisant abort() - je n'ai pas encore pris de décision à ce sujet.

 
Igor Makanu:

Si je ne me trompe pas, je l'ai demandé il y a quatre ans lors de mon dernier cycle MQL. Eh bien, tout est comme d'habitude

Vous avez raison, quand vous commencerez à dire cela, les personnes lettrées sortiront de tous les trous, en disant "ce n'est pas du C++").

vous avez besoin d'un moyen simple pour arrêter le traitement du tick actuel ! - cela signifie qu'il est possible d'arrêter le fonctionnement de l'EA, mais pour arrêter le traitement d'un tick, il faut l'inventer et le mettre au point - je soupçonne qu'au niveau du compilateur, abort() peut être implémenté de manière pas plus compliquée que ExpertRemove() - qui existe déjà

Eh bien, abort et assert sont implémentés de la même manière que dans le code ci-dessus. Bien que ce soit certainement laid et parfois déroutant, parce que je ne remarque pas toujours le message précédent dans le journal. Peut-être y a-t-il une autre erreur, qui renverrait quelque chose comme "erreur interne" dans le journal ? Au moins, ça n'aurait pas l'air si embarrassant).

 
Alexey Navoykov:

Vous avez raison, quand vous commencerez à dire cela, les personnes lettrées sortiront de tous les trous, en disant "ce n'est pas du C++").

Eh bien, abort et assert sont implémentés de la même manière que dans le code ci-dessus. Bien que ce soit certainement laid et parfois déroutant, parce que je ne remarque pas toujours le message précédent dans le journal. Peut-être y a-t-il une autre erreur, qui renverrait quelque chose comme "erreur interne" dans le journal ? Au moins, cela n'aurait pas l'air si embarrassant ;)

ici@Vict m'a aidé à faire une exception avec sortie vers l'OS via la substitution de macrohttps://www.mql5.com/ru/forum/318246/page10#comment_12651045

en général, une solution viable, mais... mais c'est moche et dégoûtant ! )))

 
Igor Makanu:

Ici,@Vict a aidé à faire une exception avec la sortie vers l'OS via la substitution de macro https://www.mql5.com/ru/forum/318246/page10#comment_12651045.

une solution généralement viable, mais... Mais ça a l'air effrayant et dégoûtant ! )))

C'est un vrai bordel... Pour envelopper le retour dans une macro - il faut en savoir beaucoup sur les perversions ;) Comment traiter un tel code alors... Nous devrions au moins rendre le nom de la macro plus descriptif, comme TRY_OR_RETURN.