mql5语言的特点、微妙之处以及技巧 - 页 148

 

你能告诉我为什么编译器开始骂人了吗(截图附后)?

一年前一切都很好,但现在我把最新的终端,编译和这个

我在哪里可以找到这些信息 的答案?

以及如何正确解决这个警告?

更新:添加了第三张截图--无害代码上的相同信息

和第四张截图

编译器的严格程度如何,如何解决这个问题?

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

我遇到了这样一个奇特的情况。


如果在定义带有静态字段的类时,其对象被立即创建,将会出现编译错误

在上一个版本中,编译器并没有抱怨类中没有类型的变量。但EA在启动时崩溃了

 

我偶然发现了一个 "功能"...我花了一个多小时把指标从4翻译成5。我想不出错误在哪里,因为代码似乎是跨平台的。最后,它在这里,一个不显眼的地方。由于某种原因,他们把两个参数换了。

改善?

有更多这样的情况吗?

 
有更多这样的情况吗?
字符串修剪左/右

字符串串联

可能还有更多,我也想知道这些功能的完整列表

---

可能值得在标准库中 搜索#endif

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
在fours中,可以通过iCustom调用指标本身来获得一个多时间框架。你能分享一个链接/五个例子吗? 出于某种原因,我不能通过类比来做 :(
 

但战斗中的议员遇到了一个情况,那就是议员停止了工作。设法弄清了原因。一个很酷的细微差别,这几乎是不可能注意到的。

你可以通过尝试在这段代码中看到问题,来真正体会到它。

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

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:

但战斗中的议员遇到了一个情况,那就是议员停止了工作。设法弄清了原因。一个很酷的细微差别,这几乎是不可能注意到的。

你可以通过尝试在这段代码中看到问题,来真正感受到它。

其中一个主要规则是,你在哪一级构建一个对象,你就必须在同一级别将其销毁。没有更高或更低。
 
Slava:
其中一个主要规则是,你在哪个层次上构建一个对象,就需要在同一个层次上将其销毁。没有更高或更低。

谢谢你,好的规则。成为我自己无能的受害者。真的,对于这样一个比较明显的案例,需要一些更多的规则。

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

input int Range = 0;

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

void OnInit() { A a; }


也许对于这两种情况来说,警告是聪明的做法?

 
fxsaber:

但战斗中的议员遇到了一个情况,那就是议员停止了工作。设法弄清了原因。一个很酷的细微差别,这几乎是不可能注意到的。

你可以通过尝试在这段代码中看到问题,来真正体会到它。

这个代码有什么问题?Deinit通过常数指针钉住了这个对象(我知道这里的句柄是什么)。以C++风格进行正常的肢体射击,否则创作者就会解散所有人)))。