Update MetaEditor MT5 auf Build 2085 vom 13.Juni 2019

 

Hallo zusammen!

seit dem 13.Juni habe ich eine neue Version des Metaeditors MT5 . Seitdem werden programmweit keine Enum Deklarationen mehr erkannt.

Eine Zuordnung wie  mein_enum = ALLES_OK  wird als  "possible loss of data due to type conversion" vom Compiler markiert.

Ein Syntaxfehler ist wohl ausgeschlossen, denn bis zum Update lief alles gut!

Die älteren Versionen wie die vom Mai 2018 Build 1816 machen das klaglos ohne Fehlermeldungen

Hat jemand eine Idee?

 

Also ich vermute mal, dass Du bisher alles ohne strict compiliert hast, sonst (glaube ich) wäre das schon vorher passiert.

Da ich auch nicht erkennen kann wie mein_enum und ALLES_OK deklariert sind kann ich wieder nur vermuten(!), dass mein_enum = (int)ALLES_OK; das Problem beseitigen könnte.

 

..uups, habe ich auskommentiert, wegen Compiler Geschwindigkeit. Die Spur ist richtig -danke!!

Gruß

 

Hallo Carl,

ich bin immer noch am selben Thema: Der neue MT Editor/Compiler Build 2085 kann mit meinen Enum Deklarationen nicht umgehen:

Das Konstrukt, das bisher fehlerfrei lief, sieht so aus:

Hauptprogramm.mq5 beginnt so:

#include "\Includes\Header1.mqh"    -> Includes einbinden

#include "\Includes\Header2.mqh"    -> Includes in der Reihenfolge, wie der Compiler sie sieht, eingebunden, alles ok

#include "\Includes\Enums.mqh"       -> Aufbauder Include beginnt mit : enum{AMA_BUY_ZONE, AMA_SELL_ZONE} e_numAMA; -> keine Compilerdirektiven oder andere #property angegeben

OnInit()                                               -> Initalisierung vor OnTick()

{

  .......................                            -> Init globale Variable u.a,

   e_numAMA = AMA_BUY_ZONE;        -> erzeugt in der Enums.mqh -> Deklaration von AMA_BUY_ZONE  wie oben zu sehen -> Fehlermeldung Illegal Operation Use

  -----------                                           -> Ende, weiter zu OnTick()

}

weißt Du da weiter oder kann mir sonst jemand helfen? Ich bin ratlos, unter Build 1817 lief alles problemlos, auch im strict modus

Andreas

 

Andreas
Nutze bitte den Code Button um code einzufügen.

Gruß

 
Andreas Fechter:

Hallo Carl,

ich bin immer noch am selben Thema: Der neue MT Editor/Compiler Build 2085 kann mit meinen Enum Deklarationen nicht umgehen:

...

#include "\Includes\Enums.mqh"       -> Aufbauder Include beginnt mit : enum{AMA_BUY_ZONE, AMA_SELL_ZONE} e_numAMA; -> keine Compilerdirektiven oder andere #property angegeben

...

Ich würde einfach mal den Dateinamen ändern in:

#include "\Includes\FechterEnums.mqh"

Es scheint, dass MQ den Namen jetzt für sich beansprucht.

 

Hallo Carl,

guter Einfall, aber das war meine dritte Idee, führt jedoch nicht zum gewünschten Ergebnis. Die Enums. oder ESchalter.mqh wird fehlerfrei kompliert,

auch im Debugger als Fehler gelistet, wenn ich (absichtlich) einen Fehler provoziere. Alle dort deklarierten globalen Variablen werden in anderen Programmteilen erkannt.

Nur die Enum  nicht, siehe beliegenden Quelltext der Enum mqh Datei (auszugsweise). Zum Verzweifeln..

Die Enumerationen setze ich als Schaltelemente ein und steuere damit den Ablauf. Eine Zuweisung der Art e_amaZone = AMA_BUY_ZONE ist in den betreffenden

Programmteilen unbekannt. Was vorher lief...


Gruß

Andreas

Dateien:
 

ganz doofe Frage: was ist der Name der Enumeration? Müsste dieser Name (oder welcher Name auch immer) dann nicht VOR der geschweiften Klammer stehen und nicht vor dem Semicolon (anders gefragt: was macht das e_amaZone vor dem Semicolon?) ? Gibt das so keinen Syntax-Error?

Also so:

enum SOME_ENUM_NAME     // AMA Klasse 1 - Control
  {
   AMA_ZONE_INIT,       // CAmaLib::AMAZone() -> Default bei Programmstart #480
   AMA_BUY_ZONE,        // CAmaLib::AmaTurnAround()
   AMA_SELL_ZONE,       // CTrailTools::ReadCandleSequence()
  };

und dann die Deklaration

SOME_ENUM_NAME e_amaZone=AMA_BUY_ZONE;
 
Chris70:

ganz doofe Frage: was ist der Name der Enumeration? Müsste dieser Name (oder welcher Name auch immer) dann nicht VOR der geschweiften Klammer stehen und nicht vor dem Semicolon (anders gefragt: was macht das e_amaZone vor dem Semicolon?) ? Gibt das so keinen Syntax-Error?

Also so:

und dann die Deklaration

  

Hallo Chris,

danke dir für diesen Hinweis. Das bisher laufende Konstrukt sah so aus:

enum SOME_ENUM
{
   ENUM_1 = 1,
   ENUM_2 = 2,
        .
        .
   ENUM_N = n
}
myEnum;

Im Coderverlauf dann diese Zuweisung
   myEnum = ENUM_1;

oder als Abfrage

if(myEnum == ENUM_1)
{
   Do_something;
}

 Ich werde Deine Variante mal testen und melde mich dann wieder, Dank einstweilen und Gruß!

Andreas

 

Ich bin etwas schlauer: die neue Compiler Version verhält sich gegenüber Enum Deklarationen anders. Das Problem (als Auslöser) mit internal error #112 ist eindeutig darauf zurückzuführen.

Stiftet aber nur Verwirrung, weil der in der MQL dokumentation zugeordnete Text (doublequotes omitted sowas von in den Wald führt...

Hier mein eigentliches Problem in diesen Code Snippet:

// Deklaration im Globalen Bereich der Enumeration

enum e_amaZone
{
  AMA_ZONE_INIT,                  // CAmaLib::AMAZone() -> Default bei Programmstart #480
  AMA_BUY_ZONE,                   // CAmaLib::AmaTurnAround()
  AMA_SELL_ZONE,                  // CTrailTools::ReadCandleSequence()
};


// Programmaufruf durch außerhalb liegende Routine

bool CPanelControls::LoadStaticPanel(void)
{
    int amaValue = AMA_ZONE_INIT;         // Unsinn, nur formale Zuweisung zum Testen
    
    if(amaValue == AMA_ZONE_INIT)         // "unexpected token", kennt er nicht, der Compiler
    {
        e_amaZone = AMA_BUY_ZONE;         // "name expected" , kennt er nicht, der Compiler. Kann ich die aktuelle Zuordnung NICHT mehr ändern?
    }
    
    if(e_amaZone == AMA_BUY_ZONE)         // Abfrage ist gültig..
    {
        e_amaZone = AMA_SELL_ZONE;        // Zuweisung bringt wieder "name expected" 
    }
    
    
    return(true);
    
}


 Ich habe die Enum Konstruktion als "Schalter" zu globalen  Programmsteuerungen bisher erfolgreich eingesetzt. Warum geht das jetzt nicht mehr??


Gruß Andreas

 

Das "name expected" macht total Sinn. Die Zuweisung von Variablen als Vertreter einer Enumeration kann man doch ähnlich betrachten wie bei den gewöhnlichen Variablentypen wie double, int, ... usw. auch.

Dass in Deinem Code der Name fehlt, wird deutlicher, wenn Du bei der Benennung von Enumerationen der üblichen Metatrader-Logik folgst.

Es wäre z.B. auch Unsinn zu schreiben

ENUM_TIMEFRAMES = PERIOD_CURRENT;

also anstelle von

ENUM_TIMEFRAMES timeframe = PERIOD_CURRENT;

das wäre ja in etwa so wie

double = 1.234;  // name expected?

was ja ebenso Unsinn ist, im Gegensatz zu

double some_variable = 1.234;

weißt Du, was ich meine? denn nur

e_amaZone my_zone_variable = AMA_BUY_ZONE;

ergibt Sinn. Folgst Du der üblichen Metatrader-Logik bei der Benennung von Enumerationen (= immer angefangen mit "ENUM_"), dann würdest Du ohnehin schreiben

enum ENUM_AMA_ZONE
{
  AMA_ZONE_INIT =0,                   // CAmaLib::AMAZone() -> Default bei Programmstart #480
  AMA_BUY_ZONE  =1,                   // CAmaLib::AmaTurnAround()
  AMA_SELL_ZONE =2,                   // CTrailTools::ReadCandleSequence()
};

so ist sofort ersichtlich, dass ENUM_AMA_ZONE die Beschreibung der Enumeration an sich ist und nicht eine einzelne Instanz dieser Enumeration. Genauso wie ja ENUM_TIMEFRAMES den Variablentyp beschreibt und dann das timeframe=PERIOD_CURRENT eine einzelne Instanz wäre.

Macht Sinn?

Grund der Beschwerde: