mql5言語の特徴、微妙なニュアンスとテクニック - ページ 148

 

なぜコンパイラが悪態をつき始めたのか、教えてください(スクリーンショットを添付します)。

1年前は何も問題なかったのですが、今は最新の端末を入れてコンパイルすると、このようになります。

これらのメッセージに対する 答えはどこにあるのでしょうか?

また、この警告を正しく解決するにはどうしたらよいでしょうか。

3枚目のスクリーンショットを追加 - 無害なコードでも同じメッセージが表示されるようになりました。

と4枚目のスクリーンショット

コンパイラの制約とその解決方法について教えてください。

Компиляция - Разработка программ - Справка по 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へのインジケータを翻訳するのに1時間以上費やしました。コードはクロスプラットフォームのようだったので、どこにエラーがあるのかわかりませんでしたが、結局、目立たないところにありました。

改善?

はまだあるのでしょうか?

 
はまだあるのでしょうか?
StringTrimLeft / Right

ストリングコンカテネート

他にもいろいろあると思うので、そのような機能の完全なリストも欲しいところです

---

標準ライブラリの#endifを検索してみるのもいいかもしれません。

 
// Альтернативное создание папки.
bool FolderCreate2( const string FolderName, const int CommonFlag = 0 )
{
  return(FileOpen(FolderName + "\\", FILE_WRITE | (CommonFlag ? FILE_COMMON : 0)) == INVALID_HANDLE);
}
 
foursでは、iCustom経由でインジケータ自体を呼び出してマルチタイムフレームを取得することが可能でした。5のリンク/例を教えてください。 なぜか類推でできない :(
 

しかし、戦闘参謀が動かなくなる事態に遭遇した。なんとか原因を突き止める。ほとんど気づかないような、クールなニュアンス。

このコードで問題を見てみると、実感がわくと思います。

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

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:

しかし、戦闘参謀が動かなくなる事態に遭遇した。なんとか原因を突き止める。ほとんど気づかないような、クールなニュアンス。

このコードで問題を見てみると、本当に実感がわきますよ。

主なルールの1つは、どのレベルでオブジェクトを構築したら、同じレベルでオブジェクトを破棄しなければならないということです。高くても低くてもダメ。
 
Slava:
主なルールの1つは、どのレベルでオブジェクトを構築しても、同じレベルでそれを破壊する必要があることです。高くても低くてもダメ。

ありがとうございます、良いルールですね。自分の無能さの犠牲者になった。本当に、もっと分かりやすいルールが必要ですね。

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

input int Range = 0;

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

void OnInit() { A a; }


たぶん、どちらの場合にも Warning clever to do?

 
fxsaber:

しかし、戦闘参謀が動かなくなる事態に遭遇した。なんとか原因を突き止める。ほとんど気づかないような、クールなニュアンス。

このコードで問題を見てみると、本当に実感がわきますよ。

このコードのどこが問題なのでしょうか?Deinitは定数ポインタによってオブジェクトを釘付けにした(ここでハンドルが何であるかは分かっている)。C++スタイルで普通に手足を撃つとか、クリエイターがみんなを溶かしたのか)))
理由: