Ошибки, баги, вопросы - страница 1034

 
TheXpert:
Как раз по сути это логично, ибо написанное выглядит немного бредовато.
С++ так не считает. А по поводу бреда - это максимально упрощенный пример, чтобы довести суть вопроса.
 
A100:
С++ так не считает.

Ага, С++ много чего не считает, но дело в том, что инициализация статических членов возможно происходит не в том порядке, в котором инициализация, а в том, в котором объявление.

Надо покурить стандарт по этому поводу.

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

Слишком упросил - не перенес const - как видно теперь все четко - одна константа инициализируется другой:

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 на public - то все работает как часы. Но защищенность по своей природе не имеет отношения ни к порядку инициализации ни к порядку присваивания, ни к возможности инициализации конкретным значением

 
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 - проходит)

Опять же я апеллирую к тому, что С++ копилирует это и правильно инициализирует.

Документация по 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 по аналогии с предыдущим. Не нормально чтобы для одних типов последовательность вызовов была одна, а для других - другая.
 
A100:
Вероятно ошибка в последовательности вызовов
В С++ порядок вычисления операндов выражения -- UB. Почему здесь вы рассчитываете на определенный порядок?
 
TheXpert:
В С++ порядок вычисления операндов выражения -- UB. Почему здесь вы рассчитываете на определенный порядок?
А Вы где нибудь видели, чтобы
 cout << "Hello " << "word";

выводился как "word Hello" ?

В данном случае так и происходит для перегруженного оператора для типа int , при том, что для типа string все выводится нормально.

Более того - здесь С++ ни при чем. Допустим вы написали в коде

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 );
}
 

Приветствую!

Помогите пофиксить 'invalid pointer access'.

В OnInit() имеем:

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

Метод CSymbolsCollection::RefreshRealSymbols() имеет вызов CleanSymbolsArray(myRealSymbols);

Эти метод и переменная объявлены в классе как:

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

Проблема в том, что RefreshRealSymbols() выполняются нормально, если вызываются в конструкторе CSymbolsCollection.

Однако, вызов SymbolsCollection.RefreshRealSymbols(); в OnInit(); приводит к:

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

Ошибка указывает в body метода CSymbolsCollection::RefreshRealSymbols() на строку CleanSymbolsArray(myRealSymbols);, позиция - сразу за открывающей скобкой.

 

Есть какие-нибудь идеи?

 
vlad_123:
...

Есть какие-нибудь идеи?

Не это?