Gibt es eine "StringToEnum"-Funktion oder eine Alternative? - Seite 2

 

Ich habe dies verfolgt, aber ich habe kein klares Verständnis davon, was genau es ist, dass Sie erreichen wollen.

Ich in der Regel re-code um Dinge, indem sie in verschiedenen Möglichkeiten, um am Ende mit dem Endergebnis war ich auf der Suche nach, die Dinge können auf viele Arten getan werden.

 
Marco vd Heijden:

Ich habe dies verfolgt, aber ich habe kein klares Verständnis davon, was genau es ist, dass Sie erreichen wollen.

Ich in der Regel re-code um Dinge, indem sie in verschiedenen Möglichkeiten, um am Ende mit dem Endergebnis war ich auf der Suche nach, die Dinge können auf viele Arten getan werden.

Danke, Marco. Natürlich gibt es viele Möglichkeiten (und Umgehungen), manchmal muss man sich für eine davon entscheiden, um sein Ziel zu erreichen, aber manche Wege sind einfacher als andere. In diesem Fall war der Workaround, den ich zur Nachahmung der Funktion: StringToEnum war die Verwendung mehrerer String-Vergleiche mit "if", aber wie ich schon sagte, die eval-Funktion (nicht in mql5 implementiert) könnte helfen, alle diese if zu vermeiden, und auch bei der Wartung helfen, weil, wenn Konstanten ihren Namen ändern, dann müssen Sie nicht den Block von ifs ändern.
 

Ich weiß genau, was Sie meinen. Ich habe Hunderte, manchmal sogar Tausende von if-Zeilen in einem Codeblock, um das zu erreichen, was ich brauche.

Man muss lieben, was man tut.

 
cyberglassed:
Danke, Marco. Natürlich gibt es viele Möglichkeiten (und Workarounds), manchmal muss man sich für eine davon entscheiden, um sein Ziel zu erreichen, aber manche Wege sind einfacher als andere. In diesem Fall war der Workaround, den ich zur Nachahmung der Funktion: StringToEnum verwendete mehrere String-Vergleiche mit "if", aber wie ich schon sagte, könnte die eval-Funktion (in mql5 nicht implementiert) helfen, all diese ifs zu vermeiden, und auch bei der Wartung helfen, denn wenn Konstanten ihren Namen ändern, muss man den Block von ifs nicht ändern.

Können Sie bitte erklären, WARUM Sie diesen StringToEnum benötigen. Offensichtlich haben Sie eine Zeichenfolge mit einem Enum-Wert, aber warum ist es auf eine Zeichenfolge? Ich bin neugierig zu wissen.

Mit anderen Worten, mit der Unterstützung der eval(...) -Funktion könnten wir viele Dinge gleichzeitig lösen.

Das wird NIE passieren, verschwenden Sie nicht Ihre Zeit damit. Die Funktion Eval() ist ein offenes Tor für Sicherheitslecks, Metaquotes wird eine solche Funktion nicht hinzufügen.

 
Marco vd Heijden:

Ich weiß genau, was Sie meinen. Ich habe Hunderte, manchmal sogar Tausende von if-Zeilen in einem Codeblock, um das zu erreichen, was ich brauche.

Man muss lieben, was man tut.

Ihr Problem kann NICHT mit einem StringToEnum() gelöst werden, das wissen Sie bereits (denke ich).
 
Alain Verleyen:
Ihr Problem kann NICHT mit einem StringToEnum() gelöst werden, das wissen Sie bereits (denke ich).

Richtig, aber es kann rückwärts gemacht werden.

  int b=0;
  
  if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;Print("b= ",b);}

Aber es wäre sinnlos, da MODE_SMMA bereits den Integer-Wert 2 hat, weshalb ich schrieb, dass ich nicht verstehe, was cyberglassed zu erreichen versucht.

 
Marco vd Heijden:

Richtig, aber es kann auch rückwärts gemacht werden.

Aber es wäre sinnlos, da MODE_SMMA bereits den Integer-Wert 2 hat, weshalb ich schrieb, dass ich nicht verstehe, was cyberglassed zu erreichen versucht.

Marco, der Workaround, den ich verwende, ist in etwa der folgende (sehr minimalistische Version):

int StringToEnum(string strId) {
        if (false) {}
        else if (strId == "PRICE_CLOSE")     return 1;
        else if (strId == "PRICE_OPEN")      return 2;
        else if (strId == "PRICE_HIGH")      return 3;
        else if (strId == "PRICE_LOW")       return 4;
        else if (strId == "PRICE_MEDIAN")    return 5;
        else if (strId == "PRICE_TYPICAL")   return 6;
        else if (strId == "PRICE_WEIGHTED")  return 7;
        // ...
        return -1;
}

void OnStart() {
        string strId = "PRICE_MEDIAN";
        printf("%s: %d ", strId, StringToEnum(strId));
}

Ich gehe natürlich nicht von der Konstante aus, sondern von einer Zeichenkette, ich sage dir das, weil du in deinem Code das Folgende geschrieben hast:

EnumToString(MODE_SMMA)

als ob Sie von Anfang an die Konstante selbst hätten.

Tut mir leid, wenn ich Sie missverstanden habe, mein Englisch ist nicht sehr gut.

Grüße.

 
Alain Verleyen:

Können Sie bitte erklären, WARUM Sie diese StringToEnum benötigen. Offensichtlich haben Sie eine Zeichenfolge mit einem Enum-Wert, aber warum ist es auf eine Zeichenfolge? Ich bin neugierig zu wissen.

Mit anderen Worten, mit der Unterstützung der eval(...) -Funktion könnten wir viele Dinge gleichzeitig lösen.

Das wird NIE passieren, verliere nicht deine Zeit damit. Die Eval()-Funktion ist eine offene Tür für Sicherheitslecks, Metaquotes wird eine solche Funktion nicht hinzufügen.

Hallo Alain, ich befriedige deine Neugierde :P

Stell dir vor, du verwendest mehrere externe mql5-Codes, dann hast du es mit mehreren "enum"-Datentypen zu tun, die darin definiert sind, und natürlich ist es für dich, wie für einen Menschen, besser, dir den Stringnamen jedes Wertes jedes "enum" zu merken. Wenn Sie dann an einer Stelle einen Wert eines "enum" im String-Format angeben wollen, können Sie das nicht direkt tun, sondern müssen eine Umgehung verwenden, wie ich oben geschrieben habe. Dies hat zwei große Nachteile: Der erste ist, dass man alle Werte aller beteiligten Enums sammeln muss, und der zweite Nachteil ist die Wartung. Wenn man also einen externen mql5-Code aktualisiert, bei dem der Entwickler den mit einer Konstanten verknüpften int-Wert geändert hat, kann es zu unerwartetem Verhalten kommen, so dass man immer wieder nach Updates des Codes suchen muss.

Zum Thema Sicherheitsleck... Ich bin nicht ganz einverstanden mit dem, was Sie sagten, dass es eine offene Tür für Sicherheitslecks ist. Natürlich könnte es eine offene Tür sein, aber man muss als Programmierer die Grenzen setzen und sich um mögliche kritische Situationen kümmern, ich meine, man kann solche Situationen perfekt handhaben, wie in PHP, sogar bei SQL mit Code-Injection, wo man einige kritische mögliche Eingabedaten von Benutzern analysieren muss, falls sie Zugang zu Ihrem Code haben.

Vielleicht haben wir in der Zukunft ein wenig Glück und das Entwicklerteam kann uns in dieser Richtung helfen, also können wir vorerst Workarounds verwenden :P

 
cyberglassed:

Marco, der Workaround, den ich verwende, ist in etwa der folgende (sehr minimalistische Version):

Natürlich gehe ich nicht von der Konstante aus, sondern von einer Zeichenkette, ich sage dir das, weil du in deinem Code das Folgende geschrieben hast:

als ob Sie von Anfang an die Konstante selbst hätten.

Tut mir leid, wenn ich Sie missverstanden habe, mein Englisch ist nicht so gut.

Grüße.

Deshalb heißt es ja auch rückwärts und man beginnt mit dem Vergleich aller Aufzählungen, um den Enum-Wert aus der Zeichenkette aufzulösen.

int b;
if(EnumToString(MODE_SMA)=="MODE_SMA"){b=0;}
if(EnumToString(MODE_EMA)=="MODE_EMA"){b=1;}
if(EnumToString(MODE_SMMA)=="MODE_SMMA"){b=2;}
if(EnumToString(MODE_LWMA)=="MODE_LWMA"){b=3;}

Print(b);


Aber ist das nicht das Gleiche?

Es spielt keine Rolle, auf welcher Seite man den String vergleicht, wenn es eine Übereinstimmung gibt, wird der Wert auf b gesetzt.

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

Hier beginnen wir also mit einem String-Wert, aber was ist der Unterschied?

Keiner.

 
Marco vd Heijden:

...

aber ist das nicht das Gleiche?

Es spielt keine Rolle, auf welcher Seite Sie den Stich vergleichen, wenn es eine Übereinstimmung gibt, wird der Wert auf b gesetzt.

int b;
if("MODE_SMA"==EnumToString(MODE_SMA)){b=0;}
if("MODE_EMA"==EnumToString(MODE_EMA)){b=1;}
if("MODE_SMMA"==EnumToString(MODE_SMMA)){b=2;}
if("MODE_LWMA"==EnumToString(MODE_LWMA)){b=3;}

Print(b);

Hier beginnen wir also mit einem String-Wert, aber was ist der Unterschied?

Keiner.

Ihr obiger Code ist nutzlos, weil er immer "b = 3" zurückgibt (letztes "if", weil Sie kein "else if" verwenden)

Wenn Sie "else if" verwenden, dann wird immer "b = 0" zurückgegeben.

Trotzdem, die Info: "b = 3" jedes Mal, gibt keine Informationen.