错误、漏洞、问题 - 页 1034

 
TheXpert:
事实上,这是有道理的,因为所写的东西看起来有点痴心妄想。
C++并不这么认为。至于胡说八道,这是一个尽可能简化的例子,以表达我的观点。
 
A100:
C++并不考虑这种方式。

是的,C++没有计算很多东西,但问题是,静态成员 的初始化可能不是按照它们被初始化的顺序,而是按照它们被声明的顺序。

我必须阅读关于这个问题的标准。

Документация по 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成员是受保护的,这是一个错误。 如果我们用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编译器不想用常量的int值来初始化数组(enum - passes)。

我再次呼吁,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与前者类似。有些类型有一个调用序列,而其他类型有一个不同的调用序列,这是不正常的。
 
A100:
可能是调用序列中的一个错误
在C++中,表达式的操作数被评估的顺序是UB。你为什么要在这里依赖一个特定的顺序?
 
TheXpert:
在C++中,对表达式的操作数进行评估的顺序是UB。你为什么要在这里依赖一个特定的顺序?
你有没有在任何地方看到过
 cout << "Hello " << "word";

被输出为 "word Hello"?

在这种情况下,对于int类型 的重载运算符会发生这种情况,而对于字符串类型,一切都会正常输出。

此外,它与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[]);

问题是,如果在CSymbolsCollection 构造函数中调用RefreshRealSymbols(),会正常执行。

然而,在OnInit()中调用SymbolsCollection.RefreshRealSymbols();会导致。

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

错误指向CSymbolsCollection::RefreshRealSymbols() 方法正文中的CleanSymbolsArray(myRealSymbols); 行,位置就在开头括号后。

有什么想法吗?

 
vlad_123:
...

有什么想法吗?

不是这个