Fehler, Irrtümer, Fragen - Seite 1087

 

Die abgekürzte Schreibweise des Postfix-Operators++ lässt sich nicht kompilieren, wenn eine explizite Umwandlung eines Zeigers einer Basisklasse in einen abgeleiteten

class A {
};

class B : public A {
public:
        void    operator++( int ) {}
        void    operator++()      {}
};

void f( A* a )
{
        ((B *)a).operator++( 0 ); //нормально
        ((B *)a).operator++();    //нормально
        ++((B *)a);               //нормально
        ((B *)a)++;               //ошибка
}
 
Zumindest sollte der Compiler warnen, dass a.f() keine Konstante ist
class A {
public:
        int f() { return ( 1 ); }
};

class B {
public:
                B( const A *aa ) : a( aa ) {}
        int g() { return ( a.f() ); } //должно быть предупреждение, поскольку a.f() не const
        const A *a;
};
 
A100:
Zumindest sollte der Compiler warnen, dass a.f() keine Konstante ist
Vielen Dank für Ihre Sorgfalt, beide Fehler wurden korrigiert.
 
mql5:
Vielen Dank für den Hinweis, beide Fehler sind korrigiert worden.
Nur das letzte ist technisch gesehen kein Fehler - es sollte nur eine Warnung sein. Es ist nur ein Fehler, wenn
class B {
public:
        A * const a;
};

Aber in den Vorlagen. Ich werde Ihnen später Beispiele geben.

 

Auch hier ist es nicht klar.

class A {
public:
};

void ex1( const A* &t1, const A* &t2 )
{
        const A* t = t1;
        t1 = t2;
        t2 = t;
}

void OnStart()
{
    const A *a1 = new A(), *a2 = new A();
    Print( "Было :" a1, " ", a2 ); // Было :1 2
    ex1( a1, a2 );
    Print( "Стало:"  a1, " ", a2 ); // Стало:2 1
    delete( a1 );
    delete( a2 );
}

funktioniert alles korrekt, aber wenn Sie die Zwischenfunktion ex2(...) hinzufügen

void ex2( const A* &t1, const A* &t2 ) { ex1( t1, t2 ); }

void OnStart()
{
    сonst A *a1 = new A(), *a2 = new A();
    Print( "Было: ", a1, " ",  a2 ); // Было :1 2
    ex2( a1, a2 );
    Print( "Стало:",  a1, " ",  a2 ); // Cтало:2 2           <-----
    delete( a1 ); delete( a2 );
}

Das Ergebnis ist anders. Was hat ex2(...) getan? - die Zeiger einfach per Referenz an

Schauen Sie sich bitte an

 
A100:

Auch hier ist es nicht klar.

funktioniert alles korrekt, aber wenn Sie die Zwischenfunktion ex2(...) hinzufügen

Das Ergebnis ist anders. Was hat ex2(...) getan? - die Zeiger einfach per Referenz an

Schauen Sie sich bitte an

Danke, Sprachoptimierungsfehler, behoben.
 

Es ist nicht das erste Mal, aber es ist das einzige Mal, dass man solche Fotos beim Hochladen erhält, was bedeutet, dass man einige Kriterien festlegen muss (wahrscheinlich eine bestimmte Größe).
). Überall sonst werden sie normal angezeigt. Bitte sagen Sie mir, was los ist.


 
Ein unnötiger Kompilierungsfehler tritt auf, wenn das Makro eine Ergebnistypkonvertierung verwendet und der Rückgabewert dann nicht verwendet wird (manchmal wird er benötigt, manchmal nicht)
int g( int x ) { return ( x ); }

#define  F( X )    (long)g( X )

void OnStart()
{
        int f = F( 0 ); //нормально
        F( 0 );         //ошибка компиляции
}
 
A100:
Ein unnötiger Kompilierungsfehler tritt auf, wenn ein Makro eine Ergebnistypkonvertierung verwendet und der Rückgabewert anschließend nicht verwendet wird (manchmal wird er benötigt, manchmal nicht)

Dies hat nichts mit der Verwendung von Definitionen zu tun.

Ein einfaches define-Äquivalent führt ebenfalls zu demselben Fehler

(long)g(0);


'(long)' - expression has no effect


P.S. Jetzt wird es hier einen Vorspann geben.

 

Nach der Neukompilierung des Indikators trat bei der Arbeit mit dynamischen Ar rays der Fehler "array out of range" auf.

Das hat es vorher nicht gegeben. Was ist zu tun?

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