Fehler, Irrtümer, Fragen - Seite 1172

 

Es gibt Fehler in der Standardbibliothek für MQL4, insbesondere in Indikatorklassen.

Bei der CiATR-Klasse fehlt der Körper der GetData-Methode.

Bei Indikatoren, die Parameter vom Typ ENUM_APPLIED_VOLUME verwenden(CiForce, CiOBV), tritt ein Fehler auf: Unzulässiger Enumerator kann nicht verwendet werden

Übrigens, ENUM_APPLIED_VOLUME scheint eine Standardaufzählung zu sein; sie ist in der MQL4-Dokumentation vorhanden, aber in Wirklichkeit fehlt sie ('ENUM_APPLIED_VOLUME' - nicht deklarierter Bezeichner).

Prüfen Sie also bitte alle Ihre Bibliotheken. Ich habe das Gefühl, dass sie hastig von MT5 portiert wurden, ohne ihre Funktionalität zu überprüfen.

 

Kompilierfehler, Build 966

#property library
#define  CLR     C'255,255,255'//White

class A {
        A() { clr = CLR; }
        color clr;
};
Build 932 ist in Ordnung
 
A100:
Nach der direkten Ersetzung lässt sich der Code wegen des Kommentars nicht kompilieren
 

hängt vom Inhalt des Kommentars ab

#define  CLR     C'255,255,255'//не White

es ist in Ordnung

 
Nun, es sollte sowieso nicht kompiliert werden.)
 

Kommentare werden nie ersetzt - der Compiler ignoriert sie einfach, sonst könnte #define in den meisten Fällen gar nicht mit Kommentaren verwendet werden //

#define  ONE 1 //один
#define  TWO 2 //два

int a = ONE + TWO;
приводит к int a = 1 + 2;
а не к int a = 1 //один + 2 //два;
Ersetzen Sie auf jeden Fall // durch /**/ in https://www.mql5.com/ru/forum/1111/page1190#comment_993854.
#define  CLR     C'255,255,255'/*White*/

Das Ergebnis ist das gleiche - Kompilierungsfehler.

 
Bisher war es möglich, auf der Profilseite eines anderen Nutzers über einen Link zum News Feed (dieses Nutzers) zu wechseln. Jetzt sehe ich keinen solchen Link, aber wenn ich /news am Ende der URL hinzufüge, öffnet sich diese Seite normal. Ist es ein Fehler, dass der Link aus der Benutzeroberfläche verschwunden ist?
 
marketeer:
Bitte erklären Sie die folgende Situation. Ich habe einen Multi-Währungs-Indikator, dessen Werte sich nicht ändern, je nachdem, mit welchem Chart er verbunden ist - er berechnet die Werte für die angegebenen Instrumente und ist nicht auf das aktuelle Fenster bezogen. Ich zeichne manuell Unterstützungs- und Widerstandslinien in diesen Indikator ein. Jetzt der Trick: Wenn ich ein anderes Werkzeug aus der Marktübersicht in das Fenster ziehe, bleibt das Aussehen des Indikators gleich und die Linien verschwinden. Wenn Sie das Dialogfeld Objektliste öffnen, sind diese Objekte dort immer noch aufgeführt. Die Endpunktwerte (Daten und Werte) bleiben gleich (d.h. sie sollten an den gleichen Stellen sichtbar sein) - das ist verständlich, sie wurden nicht geändert. Die Linien sind jedoch nicht sichtbar. Wenn Sie dann das ehemalige Werkzeug, das sich ursprünglich dort befand, auf das Fenster ziehen, werden die Linien wieder sichtbar. Was ist das Problem?

Gefunden und korrigiert.

Vielen Dank für die Kontaktaufnahme. Es stellt sich heraus, dass es sich um einen generischen Fehler handelt - so hat es bisher immer funktioniert.

 

Sie können den abgekürzten Operator !() nicht anwenden - Kompilierungsfehler

class A {
public:
        bool operator !() { return ( false ); }
};

bool f1( A* a ) { return ( f3( a ) ); }
bool f2( A* a ) { return ( !a ); }             //ошибка компиляции
bool f3( A* a ) { return ( a.operator!() ); }  //нормально
bool f4( A& a ) { return ( !a ); }

void OnStart()
{
        A *a = new A;
        Print( f1( a ));
        Print( f4( a ));
}

Wenn der Compiler versteht (und das tut er), dass f4( a ) bedeutet, dass 'a' ein Objekt ist und kein Zeiger/Skriptor als Zahl)

es sollte auch verstehen, dass !a' das Gleiche für 'a' bedeutet (Objekt, nicht Zeiger/Numerisch)

mit anderen Worten, wenn

class A {
    void f() {}

void OnStart()
{
        A a1;
        A *a2 = new A;
        a1.f();
        a2.f();
}
a1.f() und a2.f() bedeuten dasselbe, unabhängig davon, ob a1, a2 ein Zeiger oder ein Objekt ist, wie kann der Operator !() schlechter sein?
 

Ich sollte hinzufügen, dass es zum Beispiel keinen Kompilierungsfehler mit operator+() gibt, noch gibt es einen, wenn wir einfach operator+(), das überhaupt nicht verwendet wird, zum ersten Beispiel oben hinzufügen

class A {
public:
        bool operator !() { return ( false ); }
        bool operator +() { return ( false ); }
};
aber in diesem Fall tritt eine weitere Unsicherheit auf
class A {
public:
        bool operator !() { return ( true ); }
        bool operator +() { return ( true ); }
};

int g( A& a )  { return ( 10 ); }
int g( int )   { return ( 20 ); }

void OnStart()
{
        A *a = new A;
        Print( !a );            //здесь    считает                 'a' - числом ???
        Print( a.operator!() ); //здесь не считает (что правильно) 'a' - числом
        Print( g( a ) );        //здесь не считает (что правильно) 'a' - числом, хотя есть g( int ) и нет g( A* )
}