Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 148

 

Puoi dirmi perché il compilatore ha iniziato a lamentarsi di questo (screenshot allegati)?

un anno fa tutto era ok, ma ora metto l'ultimo terminale, compilo e questo

dove posso trovare risposte a questi messaggi?

e come risolvere correttamente questo avvertimento?

aggiornamento. aggiunto 3° screenshot - stesso messaggio su codice innocuo

e il 4° screenshot

qual è il rigore del compilatore e come risolverlo?

Компиляция - Разработка программ - Справка по MetaEditor
Компиляция - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Компиляция — это процесс перевода исходного кода MQL4/MQL5-программы на машинный язык. Ее результатом является создание исполняемого файла программы (*EX4 или *.EX5), который может быть запущен в торговой платформе. Скомпилировать можно любой файл (*.MQ4, *.MQ5 или *.MQH), однако исполняемый файл (*.EX4 или *.EX5) может быть получен только в...
File:
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
:

Ho incontrato una tale peculiarità.


Se durante la definizione di una classe con campi statici il suo oggetto viene creato immediatamente, ci sarà un errore di compilazione.

Nell'ultima versione, il compilatore non si lamentava della variabile senza tipo nella classe. Ma l'EA si è bloccato all'avvio

 

Mi sono imbattuto in una "caratteristica"... Ho passato più di un'ora a tradurre l'indicatore da 4 a 5. Non riuscivo a capire dove fosse l'errore, dato che il codice sembrava essere multipiattaforma. alla fine, eccolo qui, un posto poco appariscente. per qualche motivo hanno scambiato due parametri:

miglioramento?

ce ne sono altri?

 
ce ne sono altri?
StringTrimLeft / Right

StringConcatenate

probabilmente c'è di più, sono anche interessato a una lista completa di tali funzioni

---

potrebbe valere la pena cercare #endif nella libreria standard

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
In quattro era possibile chiamare l'indicatore stesso tramite iCustom per ottenere un multitimeframe. Puoi condividere un link/esempio per cinque? Per qualche ragione non riesco a farlo per analogia :(
 

Ma il consigliere di battaglia si è imbattuto in una situazione in cui il consigliere ha smesso di lavorare. Sono riuscito ad arrivare in fondo alla causa. Una sfumatura fresca, che è quasi impossibile da notare.

Potete davvero farvi un'idea provando a vedere il problema in questo codice.

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

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:

Ma il consigliere di battaglia si è imbattuto in una situazione in cui il consigliere ha smesso di lavorare. Sono riuscito ad arrivare in fondo alla causa. Una sfumatura fresca, che è quasi impossibile da notare.

Potete davvero farvi un'idea provando a vedere il problema in questo codice.

Una delle regole principali è che a quale livello si costruisce un oggetto, bisogna distruggerlo allo stesso livello. Non più in alto o più in basso.
 
Slava:
Una delle regole principali è che a quale livello si costruisce un oggetto, allo stesso livello bisogna distruggerlo. Non più in alto o più in basso.

Grazie, buona regola. Sono diventato vittima della mia stessa incompetenza. Davvero, c'è bisogno di qualche altra regola per un caso così ovvio.

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

input int Range = 0;

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

void OnInit() { A a; }


Forse per entrambi i casi Attenzione intelligente da fare?

 
fxsaber:

Ma il consigliere di battaglia si è imbattuto in una situazione in cui il consigliere ha smesso di lavorare. Sono riuscito ad arrivare in fondo alla causa. Una sfumatura fresca, che è quasi impossibile da notare.

Potete davvero farvi un'idea provando a vedere il problema in questo codice.

Qual è il problema con questo codice? Deinit ha inchiodato l'oggetto per puntatore costante (so cos'è l'handle qui). Normale tiro agli arti in stile C++, altrimenti i creatori hanno sciolto tutti)))