Слишком упросил - не перенес const - как видно теперь все четко - одна константа инициализируется другой:
class A {
protected: //если заменить на public: то все работает
staticconstint s1;
staticconstint s2;
};
constint A::s1 = 0x1;
constint A::s2 = A::s1; //ошибка компиляции
Компилятор в качестве ошибки указывает именно на защищенность члена s1. Если заменить protected на public - то все работает как часы. Но защищенность по своей природе не имеет отношения ни к порядку инициализации ни к порядку присваивания, ни к возможности инициализации конкретным значением
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 ); }
voidOnStart()
{
Print( "" );
A a;
int x = 3;
a << "(1)" << "(2)" << "(3)"; // Результат: (1) (2) (3) //нормально
a << x << f( x ) << x; // Результат: 4 4 3 ??? как же так?
}
В последнем случае ожидал результат: 3 4 4 по аналогии с предыдущим. Не нормально чтобы для одних типов последовательность вызовов была одна, а для других - другая.
Кстати - последовательность операций сдвига слева-направо определен и в самом MQL5, что подтверждает пример:
voidOnStart()
{
int a = 0x1;
int b = a << 2 << a; //b = 8int c = (a << 2) << a; //c = 8int d = a << (2 << a); //d = 16Print ( "b=", b, ", c=", c, ", d=", d );
}
Проблема в том, что RefreshRealSymbols() выполняются нормально, если вызываются в конструкторе CSymbolsCollection.
Однако, вызов SymbolsCollection.RefreshRealSymbols(); в OnInit(); приводит к:
invalid pointer access in 'SymbolsCollection.mqh' (55,22)
Ошибка указывает в body метода CSymbolsCollection::RefreshRealSymbols() на строку CleanSymbolsArray(myRealSymbols);, позиция - сразу за открывающей скобкой.
Ещё б пригодилась "команда" програмного насильственного обнуления всех prev_calculated для выбpaннoгo cимвoлa. С последующей генерацией тика хорошо бы комбинировалось.
Господа разработчики, на эту тему ничего в планах нет?
https://www.mql5.com/ru/docs/basis/variables/initialization
Слишком упросил - не перенес const - как видно теперь все четко - одна константа инициализируется другой:
Компилятор в качестве ошибки указывает именно на защищенность члена s1. Если заменить protected на public - то все работает как часы. Но защищенность по своей природе не имеет отношения ни к порядку инициализации ни к порядку присваивания, ни к возможности инициализации конкретным значением
Надо покурить стандарт по этому поводу.
Согласен, в общем случае компилятор компилятору - рознь и нужно разбираться.
Еще пример
Здесь MQL компилятор не хочет инициализировать массив значением const int (enum - проходит)
Опять же я апеллирую к тому, что С++ копилирует это и правильно инициализирует.
Вероятно ошибка в последовательности вызовов
В С++ порядок вычисления операндов выражения -- UB. Почему здесь вы рассчитываете на определенный порядок?
выводился как "word Hello" ?
В данном случае так и происходит для перегруженного оператора для типа int , при том, что для типа string все выводится нормально.
Более того - здесь С++ ни при чем. Допустим вы написали в коде
А у Вас эти функции выполнились в обратной последовательности или вообще для разных типов аргументов - в произвольной последовательностиПриветствую!
Помогите пофиксить 'invalid pointer access'.
В OnInit() имеем:
SymbolsCollection = new CSymbolsCollection(); SymbolsCollection.RefreshRealSymbols();Метод CSymbolsCollection::RefreshRealSymbols() имеет вызов CleanSymbolsArray(myRealSymbols);
Эти метод и переменная объявлены в классе как:
Проблема в том, что RefreshRealSymbols() выполняются нормально, если вызываются в конструкторе CSymbolsCollection.
Однако, вызов SymbolsCollection.RefreshRealSymbols(); в OnInit(); приводит к:
Ошибка указывает в body метода CSymbolsCollection::RefreshRealSymbols() на строку CleanSymbolsArray(myRealSymbols);, позиция - сразу за открывающей скобкой.
Есть какие-нибудь идеи?
...
Есть какие-нибудь идеи?
А Вы где нибудь видели, чтобы выводился как "word Hello" ?
Перечитайте внимательно, что я вам написал. Вычисление, а не вывод.
Это выражение из разряда i += ++i + i++
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
MetaDriver, 2013.08.03 17:55
"Может. Только луче б вообще без изменений таймфрейма. По хорошему для индикаторов нужна тупо генерация тика.
Для мои целей это не всегда пригодно, а общем случае множество "проблем выходного дня" бы сняло.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
MetaDriver, 2013.08.03 18:02
...
Ещё б пригодилась "команда" програмного насильственного обнуления всех prev_calculated для выбpaннoгo cимвoлa. С последующей генерацией тика хорошо бы комбинировалось.
Господа разработчики, на эту тему ничего в планах нет?