Características da linguagem mql5, subtilezas e técnicas - página 148

 

Pode dizer-me porque é que o compilador começou a jurar por isto (screenshots anexados)?

há um ano atrás estava tudo bem, mas agora ponho o terminal mais recente, compenso e isto

onde posso encontrar respostas a estas mensagens?

e como resolver correctamente este aviso?

upd. adicionada 3ª captura de ecrã - mesma mensagem em código inócuo

e 4º screenshot

qual é o rigor do compilador e como resolvê-lo?

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

Encontrei uma tal peculiaridade.


Se durante a definição de uma classe com campos estáticos o seu objecto for criado imediatamente, haverá um erro de compilação.

Na última versão, o compilador não se queixou da variável sem tipo na classe. Mas a EA falhou ao arrancar

 

Deparei-me com uma "característica"... Passei mais de uma hora a traduzir o indicador de 4 para 5. não consegui descobrir onde estava o erro, pois o código parecia ser transversal. no final, aqui está, um lugar discreto. por alguma razão trocaram os dois parâmetros:

melhoria?

há mais destes?

 
há mais destes?
StringTrimLeft / Right

StringConcatenate

provavelmente há mais, também estou interessado numa lista completa de tais funções

---

pode valer a pena procurar #endif na biblioteca padrão

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
Em quatro foi possível chamar o próprio indicador através do iCustom para obter um multitimeframe. Pode partilhar um link/exemplo por cinco? Por alguma razão não o posso fazer por analogia :(
 

Mas o conselheiro de batalha deparou-se com uma situação em que o conselheiro deixou de trabalhar. Gerido para chegar ao fundo da causa. Uma nuance fresca, que é quase impossível de notar.

Pode realmente ter uma ideia do problema tentando ver o problema neste código.

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

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:

Mas o conselheiro de batalha deparou-se com uma situação em que o conselheiro deixou de trabalhar. Gerido para chegar ao fundo da causa. Uma nuance fresca, que é quase impossível de notar.

Pode realmente ter uma ideia do problema tentando ver o problema neste código.

Uma das principais regras é que, a que nível se constrói um objecto, é necessário destruí-lo ao mesmo nível. Não mais alto ou mais baixo.
 
Slava:
Uma das principais regras é que a que nível se constrói um objecto, ao mesmo nível que se precisa para o destruir. Não mais alto ou mais baixo.

Obrigado, boa regra. Tornei-me uma vítima da minha própria incompetência. Realmente, é necessária mais alguma regra para um caso tão mais óbvio.

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

input int Range = 0;

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

void OnInit() { A a; }


Talvez para ambos os casos Alerta inteligente a fazer?

 
fxsaber:

Mas o conselheiro de batalha deparou-se com uma situação em que o conselheiro deixou de trabalhar. Gerido para chegar ao fundo da causa. Uma nuance fresca, que é quase impossível de notar.

Pode realmente ter uma ideia do problema tentando ver o problema neste código.

Qual é o problema com este código? Deinit pregou o objecto por ponteiro constante (eu sei qual é a pega aqui). Apanhar membros normais em estilo C++, ou então os criadores dissolveram toda a gente))))
Razão: