Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 148

 

Können Sie mir sagen, warum der Compiler in diesem Fall zu fluchen begann (Screenshots im Anhang)?

vor einem Jahr war alles in Ordnung, aber jetzt habe ich die neueste Terminal, kompilieren und diese

Wo kann ich Antworten auf diese Meldungen finden?

und wie lässt sich diese Warnung korrekt beheben?

Aktualisierung: 3. Screenshot hinzugefügt - gleiche Meldung bei harmlosem Code

und 4. Bildschirmfoto

Wie streng ist der Compiler und wie kann man das Problem lösen?

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

Ich bin auf eine solche Besonderheit gestoßen.


Wenn bei der Definition einer Klasse mit statischen Feldern ihr Objekt sofort erstellt wird, kommt es zu einem Kompilierungsfehler.

In der letzten Version hat sich der Compiler nicht über die Variable ohne Typ in der Klasse beschwert. Aber der EA stürzt beim Starten ab

 

Ich bin über ein "Feature" gestolpert... Ich habe über eine Stunde damit verbracht, den Indikator von 4 nach 5 zu übersetzen. Ich konnte nicht herausfinden, wo der Fehler lag, da der Code plattformübergreifend zu sein schien. am Ende ist er hier, an einer unauffälligen Stelle:

Verbesserung?

Gibt es noch mehr davon?

 
Gibt es noch mehr davon?
StringTrimLeft / Right

StringConcatenate

es gibt wahrscheinlich noch mehr, ich bin auch an einer vollständigen Liste solcher Funktionen interessiert

---

es könnte sich lohnen, in der Standardbibliothek nach #endif zu suchen

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
In fours war es möglich, den Indikator selbst über iCustom aufzurufen, um einen Multitimeframe zu erhalten. Können Sie einen Link/ein Beispiel für fünf angeben? Aus irgendeinem Grund kann ich es nicht analog machen :(
 

Doch der Schlachtrat geriet in eine Situation, in der das Ratsmitglied nicht mehr arbeitete. Es ist gelungen, der Ursache auf den Grund zu gehen. Eine kühle Nuance, die fast nicht zu bemerken ist.

Sie können ein Gefühl dafür bekommen, wenn Sie versuchen, das Problem in diesem Code zu erkennen.

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

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:

Doch der Schlachtrat geriet in eine Situation, in der das Ratsmitglied nicht mehr arbeitete. Es ist gelungen, der Ursache auf den Grund zu gehen. Eine kühle Nuance, die fast nicht zu bemerken ist.

Sie können ein Gefühl dafür bekommen, wenn Sie versuchen, das Problem in diesem Code zu erkennen.

Eine der wichtigsten Regeln ist, dass ein Objekt, egal auf welcher Ebene es konstruiert wird, auch auf der gleichen Ebene zerstört werden muss. Nicht höher oder niedriger.
 
Slava:
Eine der wichtigsten Regeln ist, dass man ein Objekt auf der Ebene, auf der man es konstruiert, auch auf der gleichen Ebene zerstören muss. Nicht höher oder niedriger.

Danke, gute Regel. Ich wurde ein Opfer meiner eigenen Inkompetenz. Für einen so offensichtlichen Fall braucht man wirklich mehr Regeln.

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

input int Range = 0;

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

void OnInit() { A a; }


Vielleicht für beide Fälle Warnung klug zu tun?

 
fxsaber:

Doch der Schlachtrat geriet in eine Situation, in der das Ratsmitglied nicht mehr arbeitete. Es ist gelungen, der Ursache auf den Grund zu gehen. Eine kühle Nuance, die fast nicht zu bemerken ist.

Sie können ein Gefühl dafür bekommen, wenn Sie versuchen, das Problem in diesem Code zu erkennen.

Was ist das Problem mit diesem Code? Deinit nagelte das Objekt durch konstanten Zeiger (ich weiß, was das Handle hier ist). Normales Gliedmaßenschießen im C++-Stil, sonst haben die Macher alle aufgelöst)))