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

 
TheXpert:
実のところ、書かれていることがちょっとした妄想に見えるから、納得がいくのです。
C++はそう思っていない。また、無意味なこととして、これは要点を伝えるためにできるだけ単純化した例です。
 
A100:
C++はそのように考えていない。

ああ、C++はいろいろ数えられないけど、要は、静的メンバの 初期化は、初期化順じゃなくて、宣言順なんだろうね。

この件に関しては、スタンダードを読む必要がありそうだ。

Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
Документация по MQL5: Основы языка / Объектно-ориентированное программирование / Статические члены класса
  • www.mql5.com
Основы языка / Объектно-ориентированное программирование / Статические члены класса - Документация по MQL5
 

定数が別の定数によって初期化されるのは、もうお分かりですね。

class A {
protected: //если заменить на public: то все работает
        static const int s1;
        static const int s2;
};

const int A::s1 = 0x1;
const int A::s2 = A::s1; //ошибка компиляции

コンパイラはs1メンバがprotectedであることをエラーとして表示します。 protectedをpublicに置き換えると、すべてが規則正しく動作するようになります。しかし、protectedであることは、初期化順や代入順、特定の値で初期化される可能性とは関係がない

 
TheXpert:

これについては、規格を読まないといけないですね。

そうですね、一般的にはコンパイラが違うので、それを整理する必要がありますね。

以下もその一例です。

enum _ENUM { en = 0x1 };
const int cc = 0x2;
static int s_array1[] = { cc }; //ошибка
static int s_array2[] = { en }; //нормально

class A {
public:
        static const int s;
        static int Array[];
};
const int A::s = 0x3;
int A::Array[] = {
        en,     //нормально
        A::s,   //ошибка
        cc      //ошибка
};

MQLコンパイラはここで、配列を const int値で初期化 することを望んでいません(enum - pass)。

ここでもC++がコピーして正しく初期化することをアピールしています。

Документация по MQL5: Операции с массивами / ArrayInitialize
Документация по MQL5: Операции с массивами / ArrayInitialize
  • www.mql5.com
Операции с массивами / ArrayInitialize - Документация по MQL5
 
コールシーケンスにエラーが発生した可能性があります
class A {
public:
        A *operator<<( int x ) { Print( x ); return ( GetPointer( this )); }
        A *operator<<( string s ) { Print( s ); return ( GetPointer( this )); }
};

int f( int& x ) { return ( x = 4 ); }

void OnStart()
{
        Print( "" );
        A a;
        int x = 3;
        a << "(1)" <<  "(2)" << "(3)"; // Результат: (1) (2) (3) //нормально
        a <<  x   << f( x ) <<  x;   // Результат:  4   4   3 ??? как же так?
}
最後のケースでは、前回と同様に3 4 4という結果を期待していたのですが。あるタイプは1つの呼び出しシーケンスを持ち、他のタイプは異なるシーケンスを持つということは通常ありえません。
 
A100:
コールシーケンスにエラーが発生した可能性があります
C++では、式のオペランドが評価される順序はUBである。なぜここで特定のオーダーに頼るのですか?
 
TheXpert:
C++では、式のオペランドを評価する順序はUBです。なぜここで特定のオーダーに頼るのですか?
というのをどこかで見たことがありませんか?
 cout << "Hello " << "word";

が "word Hello "と出力された?

この場合、int型 ではオーバーロードされた演算子が、string型ではすべて正常に出力されます。

しかも、C++とは何の関係もない。仮にあなたがコードにこう書いたとします。

f(); // a << x;
g(); // a << f( x );
h(); // a << x;
そして、これらの関数は、異なるタイプの引数に対して、逆順に、または全く順番に実行されます - 。
 
ちなみに、左から右へのシフト操作の順序は、例で確認したように、MQL5自体でも定義されています。
void OnStart()
{
        int a = 0x1;
        int b = a << 2 << a;   //b = 8
        int c = (a << 2) << a; //c = 8
        int d = a << (2 << a); //d = 16
        Print ( "b=", b, ", c=", c, ", d=", d );
}
 

ごあいさつ

無効なポインタへのアクセス」を修正するのを手伝ってください。

OnInit()では、次のようになります。

SymbolsCollection = new CSymbolsCollection();
SymbolsCollection.RefreshRealSymbols();

CSymbolsCollection::RefreshRealSymbols() メソッドにCleanSymbolsArray(myRealSymbols) コールを追加しました。

これらのメソッドと変数は、クラス内で次のように宣言されています。

public:
   CSymbol* myRealSymbols[];
   void CleanSymbolsArray(CSymbol* &inArray[]);

問題は、RefreshRealSymbols()はCsymbolsCollectionの コンストラクタ内で呼び出すと正常に実行されることである。

しかし、OnInit();の中でSymbolsCollection.RefreshRealSymbols();を呼び出すと、結果的に。

invalid pointer access in 'SymbolsCollection.mqh' (55,22)

CSymbolsCollection::RefreshRealSymbols() メソッド本体のCleanSymbolsArray(myRealSymbols); の行を指しており、その位置は開き括弧の直後であることがわかります。

何かアイデアはありますか?

 
vlad_123:
...

何かアイデアはありますか?

これじゃない