Caractéristiques du langage mql5, subtilités et techniques - page 148

 

Pouvez-vous me dire pourquoi le compilateur a commencé à se plaindre à ce sujet (captures d'écran jointes) ?

il y a un an tout allait bien, mais maintenant je mets le dernier terminal, compile et ceci

où puis-je trouver des réponses à ces messages?

et comment résoudre correctement cet avertissement ?

mise à jour. ajout de la 3ème capture d'écran - même message sur le code inoffensif

et 4ème capture d'écran

quelle est la rigueur du compilateur et comment la résoudre ?

Компиляция - Разработка программ - Справка по MetaEditor
Компиляция - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Компиляция — это процесс перевода исходного кода MQL4/MQL5-программы на машинный язык. Ее результатом является создание исполняемого файла программы (*EX4 или *.EX5), который может быть запущен в торговой платформе. Скомпилировать можно любой файл (*.MQ4, *.MQ5 или *.MQH), однако исполняемый файл (*.EX4 или *.EX5) может быть получен только в...
Dossiers :
22.png  6 kb
3.png  4 kb
4.png  5 kb
 
/+------------------------------------------------------------------+
TT
class cl_search_: public cl_search_b<T>
  {
#define  ME cl_search_<T>
#define  THIS &this
public:
   atype             adres;lin;//Ошибка тут компилятор молчит
   ME               *m[2],*par;
   atype Adress()                            {return par==NULL? adres :(adres|(par.m[1]==THIS? (par.lin^(par.lin<<1))>>1: 0)|par.Adress()); }
   string AdressStrBit(int move=0)           {return  "|| "+IntToBitString(adres)+" "+(string)lin+(par==NULL? "\n": ((" "+(string)(par.m[1]==THIS ?(par.lin^(par.lin<<1))>>1 :0))+" \n"+(par.AdressStrBit())));}
   string IntToBitString(atype s=0)          {if(s==0) {s=adres;} string itog ="W"; atype a=1; uchar ss=sizeof(atype)*8; for (char i=ss-1; i>=0; i--) itog+=(string)(uint)((s&a<<i)>0); return itog;}
   void CorrectPar()                         {if(m[0]!=NULL) m[0].par=THIS; if(m[1]!=NULL) m[1].par=THIS;}

   ME *Select(bool next=true) {return par==NULL ?  par:((par.m[next]==THIS || par.m[next]==NULL) ?  par.Select(next) :par.m[next].Start(!next)); }
   
   
   ME *Port(atype a,bool write=true)
     {
#define  PORT(A) Port(A&linre,write)
#define  NEW new ME(THIS)
      if(m[1]==NULL && m[0]==NULL)
        {
         if(!write) return NULL;
         //lin=(~(atype)0)<<1;
          adres=a&lin;
         return m[a&1]=NEW;
        }
      atype h111=(lin&a)^adres;
      atype linre=(~lin)>>1;
      if(h111==0)
fxsaber
:

J'ai rencontré une telle particularité.


Si lors de la définition d'une classe avec des champs statiques son objet est créé immédiatement, il y aura une erreur de compilation.

Dans la dernière version, le compilateur ne se plaignait pas de la variable sans type dans la classe. Mais l'EA a planté au démarrage

 

Je suis tombé sur une "fonctionnalité"... j'ai passé plus d'une heure à traduire l'indicateur de 4 à 5. je n'arrivais pas à trouver où se trouvait l'erreur, car le code semblait être multiplateforme. finalement, la voici, à un endroit peu visible. pour une raison quelconque, ils ont échangé deux paramètres :

amélioration ?

Y en a-t-il d'autres ?

 
Y en a-t-il d'autres ?
StringTrimLeft / Right

StringConcatenate

il y en a probablement plus, je suis également intéressé par une liste complète de ces fonctions

---

cela peut valoir la peine de chercher #endif dans la bibliothèque standard

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
Dans quatre, il était possible d'appeler l'indicateur lui-même via iCustom pour obtenir un multitimeframe. Pouvez-vous partager un lien/exemple pour cinq ans ? Pour une raison quelconque, je n'arrive pas à le faire par analogie :(
 

Mais le conseiller de combat s'est retrouvé dans une situation où le conseiller a cessé de travailler. J'ai réussi à trouver la cause du problème. Une nuance cool, qui est presque impossible à remarquer.

Vous pouvez vraiment vous en faire une idée en essayant de voir le problème dans ce code.

// В коде содержится ошибка, которая остановит выполнение этого советника.

input int Range = 0;

class A
{
public:
  void f() {}
};

A* const a = new A;

void OnInit() { a.f(); }

void OnDeinit( const int ) { delete a; }
 
fxsaber:

Mais le conseiller de combat s'est retrouvé dans une situation où le conseiller a cessé de travailler. J'ai réussi à trouver la cause du problème. Une nuance cool, qui est presque impossible à remarquer.

Vous pouvez vraiment vous en faire une idée en essayant de voir le problème dans ce code.

L'une des principales règles est qu'à quel niveau vous construisez un objet, vous devez le détruire au même niveau. Pas plus haut ou plus bas.
 
Slava:
L'une des principales règles est qu'au niveau où vous construisez un objet, au même niveau vous devez le détruire. Pas plus haut ou plus bas.

Merci, bonne règle. Je suis devenu une victime de ma propre incompétence. Vraiment, il faut un peu plus de règles pour un cas aussi évident.

// В коде содержится ошибка, которая остановит выполнение этого советника.

input int Range = 0;

class A
{
  void f() {}
public:
  A()
  {
    static A* Tmp = &this;
    
    Tmp.f();
  }
};

void OnInit() { A a; }


Peut-être pour les deux cas Avertissement intelligent à faire ?

 
fxsaber:

Mais le conseiller de combat s'est retrouvé dans une situation où le conseiller a cessé de travailler. J'ai réussi à trouver la cause du problème. Une nuance cool, qui est presque impossible à remarquer.

Vous pouvez vraiment vous en faire une idée en essayant de voir le problème dans ce code.

Quel est le problème avec ce code ? Deinit a cloué l'objet par pointeur constant (je sais ce qu'est le handle ici). Tirer sur des membres normaux dans le style C++, ou alors les créateurs ont dissous tout le monde))).
Raison: