エラー、バグ、質問 - ページ 2564

 
Igor Makanu:

?

クラス以外のものはずっとスタ一クで動いていたのに、私が騒いでいるだけという不思議な状況です......。試しに、自分でコードを再現してみてください。

オブジェクトのインスタンスが表示されますか?で、MQLに存在する;)

SZZ:しかも、ヘルプレベルで存在する......何が不満なんだ?

https://www.mql5.com/ru/docs/basis/oop/staticmembers

抉る


小悪魔

 
Andrey Barinov:

静的なもの(private, protected, public)にも同じルールが 適用されますが、オブジェクトの作成が 必要ないだけです。

一般的ではない: 例えば、public statik は派生クラスで制限することはできない。

 
Andrey Barinov:



ふむふむその不条理をどう説明するか...。管理人(開発者)の書き込みを読むように勧めたし、彼らが書いたヘルプも見せたのに、写真で何を求めているんだ?

なぜそうなるのかは考えず、フォーラムやヘルプを読み、開発者が推奨するとおりにしています。必要だと思う人は、「C++標準の保護に関する委員会」、「UN...」宛に手紙を書いてください。まあ、少なくともPMの管理者は、あなたができない場合ですが、その後、開発者のメッセージをロックし、あなたの方法を取得する

ZSY: 私はどうにかして写真ではなくソースコードを挿入することができましたが、なぜあなたのはそうしなかったのでしょうか?

int print(int value)
{  Print(value,":",__FUNCTION__); 
 return(value);
}
class A
{
private:
   static int        a1;
   static void       inc_a1(){a1++; Print("a1 = ", a1);}
protected:
   static int        a2;
public:
   static int        a3;

};
//+------------------------------------------------------------------+
static int A::a1 = print(1);
static int A::a2 = print(2);
static int A::a3 = print(3);

//+------------------------------------------------------------------+
void OnStart()
{

A::inc_a1();
A::inc_a1();
A::inc_a1();

}

2019.09.17 22:11:49.534 tst (EURUSD,H1) 1:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 2:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) 3:print

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 2

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 3

2019.09.17 22:11:49.535 tst (EURUSD,H1) a1 = 4

ZS: 滑稽な状況ですね。手伝いたかったのに、言い訳をしている...。なんで- まあ、真実のためにレールを打てよ...熊手を踏めよ...。
 
Igor Makanu:

コードに 含まれる唯一のバグは、private-methodのアクセスにあります。このバグは、最近出現したものです。

 

ChartOpen関数は、サービスでは常に0を返します。チャート自体は開くものの

#property service

//int OnInit()
void OnStart()
  {
   long Otvet= ChartOpen(Symbol(),PERIOD_D1);
   Print("Otvet=",Otvet);

  // return(INIT_SUCCEEDED);
  }
 
fxsaber:

コードに 含まれる唯一のバグは、private-methodのアクセスにあります。このバグは最近現れました。

何か忘れているような気がしたので、C#で静的がどのように動作するかを読み直したhttps://metanit.com/sharp/tutorial/3.6.php

静的なクラスメンバは、クラスのすべてのオブジェクトに共通なので、クラス名で参照する必要があります。

静的メソッドは、静的クラスのメンバのみを参照することができることに注意してください。静的メソッドの内部で、非静的メソッド、フィールド、プロパティを扱うことはできません。


MQLでは、スタティックはOnInit()を実行する前に初期化されますが、ここではスタティックのプライベートメソッドのグローバルな可視化について説明します。MQLのスタティックは、このような挙動をします。スタティックを使うということは、クラスのデータ保護機能を使わないということだと思います。

どの程度のバグなのか?- コンテキスト操作の動作はプログラマが決める(コンテキスト解決演算子は言語内で最も優先順位の高い演算子!)と言いましたが、開発者はどうするのでしょうか?)、コンパイラは正しく支援します - まあ、たまたまですが)))

は、このように動作するのでしょうか?

class A
  {
private:
   static void              My_function()
     {
      Print("^_^");
     }
  };
  
A a;
void OnStart()
  {
   A::My_function();
   a.My_function();  // 'A::My_function' - cannot access private member function        
  }

全体的に見れば、十分な機能を備えている


追記:2145に更新しました。静止画のコードは同じ挙動をしますが、もし半年間このままなら、これが静止画の予定された挙動であることが判明するでしょう ;)

UPD:このすべてを表すスラングとして、「ダーティートリック」と呼ばれていることを思い出してください。)))- この動作が言語標準として受け入れられているところや、メーカーの特定のコンパイラと結びついているところなど、ウェブ上で多くの例を探してみてください。Pythonでは、eval()は事実上、線形コード実行を壊しているのではないでしょうか?- というのも、動作が予測できないので、する人としない人がいるのです。


UPD: 2145で確認 1ヶ月前の私の質問https://www.mql5.com/ru/forum/320733#comment_12989063

https://www.mql5.com/ru/forum/320733#comment_12958594

void OnStart()
  {
   double x=100.0;
   f(x);
  }
//_______________________________________________________________________
void f(bool v)
  {
  }
//_______________________________________________________________________

MQLコンパイラは常に型の一致をチェックすると思っていたのに、自分のコードにエラーがないか探していたのです。

 
Igor Makanu:

どの程度のバグなのか?- 開発者がどう転ぼうが、そういうことだ。

バグが修正されるのは当然です。

何も変わっていません。コンパイラは型チェックの際にboolに対する警告をどう書くか学んで いません。

ポインタや数値型からboolへの自動キャストは非常に便利です。

 
Igor Makanu:

MQLコンパイラは常に型の一致を厳密に監視していると確信していたのに、私はすでに自分のコードにエラーがないか探していたのです。

このキャスティングの際にデータが失われることはありません。0か0でないかのどちらかである。

もう一つのケースは、double -> 任意の整数型(int32 まで)である場合です。

 
Slava:

このキャスティングでは、データの損失はありません。0か0でないかのどちらかである。

もう一つは、double -> 任意の整数型(int32まで)にキャストする場合です。

が、その逆は?

自分のコードのバグを探した

最初、私はテストを書きましたが、最初にintを使い、次にboolを使うのをあきらめましたが、私はコード全体を修正しませんでした、私は覚えていませんが、それは次のようなものでした。

void OnStart()
{  int x=100.0;
   f(x); }
//_______________________________________________________________________
void f(int  v)  //так тестил
{
   if(v>0) v++;

}

//_______________________________________________________________________
void f(bool  v)  // потом решил, что мне нужен флаг, а ниже забыл исправить код
{
   if(v>0) v++;

}
//_______________________________________________________________________


そのような動作はもうなんとなくわかっているのですが、なぜ書いているかというと、if()でのMQLの条件チェックで、型を厳密に制御しているか、ブール演算以外の使用は警告が出るか。- さて、VS2017でC#で書いたのと同じように、私のサンプルコードはコンパイルされず、MQLは警告を投げない。私見ですが、MQLでプログラミングを始めたばかりの人にとって、このような動作は驚きをもたらすと思います。

 
fxsaber:

バグが修正されるのは当然です。

議論するつもりはありませんが、私の意見は、コンテキスト解決演算子を使うのと同様に、静的を介してクラスを離れるときに、コンパイラからのコントロールに頼るべきではないということです。

静的なメソッドやフィールドを書いたり、:: を使ったりする場合は、コンパイラに依存しないようにしましょう。