existe-t-il une fonction "StringToEnum" ou une alternative ? - page 2

 

J'ai suivi ce projet mais je n'ai pas bien compris ce que vous vouliez accomplir exactement.

J'ai l'habitude de recoder les choses en les faisant de différentes manières pour arriver au résultat final que je recherchais, les choses peuvent être faites de plusieurs manières.

 
Marco vd Heijden:

J'ai suivi ce projet mais je n'ai pas bien compris ce que vous vouliez accomplir exactement.

J'ai l'habitude de recoder les choses en les faisant de différentes manières pour arriver au résultat final que je recherchais, les choses peuvent être faites de plusieurs manières.

Merci Marco. Bien sûr, les choses peuvent être faites de plusieurs façons (et contournements), parfois vous devez choisir l'une d'entre elles pour atteindre votre objectif, mais il y a des façons plus faciles que d'autres. Dans ce cas, le contournement que j'ai pris pour imiter la fonction : StringToEnum utilisait de multiples comparaisons de chaînes avec des "if", mais comme je l'ai dit avant, la fonction eval (non implémentée dans mql5) pourrait aider à éviter tous ces "if", et aussi aider à la maintenance parce que si les constantes changent de nom alors vous n'avez pas à changer le bloc de "if".
 

Je sais exactement ce que tu veux dire, j'ai des centaines, parfois même des milliers de lignes if dans un bloc de code pour arriver à ce dont j'ai besoin.

Vous devez aimer ce que vous faites.

 
cyberglassed:
Merci Marco. Bien sûr, les choses peuvent être faites de plusieurs façons (et contournements), parfois vous devez choisir l'une d'entre elles pour atteindre votre objectif, mais il y a des façons plus faciles que d'autres. Dans ce cas, le contournement que j'ai pris pour imiter la fonction : StringToEnum utilisait de multiples comparaisons de chaînes avec des "if", mais comme je l'ai dit avant, la fonction eval (non implémentée dans mql5) pourrait aider à éviter tous ces "if", et aussi aider à la maintenance car si les constantes changent de nom, alors vous n'avez pas à changer le bloc de "if".

Pouvez-vous expliquer, s'il vous plaît, POURQUOI vous avez besoin de ce StringToEnum. Il est évident que vous avez une chaîne avec une valeur d'énumération, mais pourquoi est-elle sur une chaîne ? Je suis curieux de le savoir.

En d'autres termes, avec le support de la fonction eval(...) nous pourrions résoudre beaucoup de choses en même temps.

Cela n'arrivera JAMAIS, ne perdez pas votre temps avec ça. La fonction Eval() est une porte ouverte à une fuite de sécurité, Metaquotes n'ajoutera pas une telle fonction.

 
Marco vd Heijden:

Je sais exactement ce que tu veux dire, j'ai des centaines, parfois même des milliers de lignes if dans un bloc de code pour arriver à ce dont j'ai besoin.

Vous devez aimer ce que vous faites.

Votre problème ne peut PAS être résolu avec un StringToEnum(), vous le savez déjà (je pense).
 
Alain Verleyen:
Votre problème ne peut PAS être résolu avec un StringToEnum(), vous le savez déjà (je pense).

Correct mais cela peut être fait à l'envers.

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

Mais cela n'aurait aucun sens puisque MODE_SMMA a déjà la valeur entière 2, c'est pourquoi j'ai écrit que je ne comprends pas ce que cyberglassed essaie d'accomplir.

 
Marco vd Heijden:

C'est vrai, mais on peut le faire à l'envers.

Mais cela n'aurait aucun sens puisque MODE_SMMA a déjà la valeur entière 2, c'est pourquoi j'ai écrit que je ne comprends pas ce que cyberglassed essaie d'accomplir.

Marco la solution de contournement que j'utilise est quelque chose comme ce qui suit (version très minimaliste) :

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));
}

bien sûr je ne pars pas de la constante, je pars d'une chaîne de caractères, je vous le dis car sur votre code vous avez écrit ce qui suit :

EnumToString(MODE_SMMA)

comme si vous aviez dès le départ la constante elle-même.

Désolé si je vous ai mal compris, mon anglais n'est pas très bon.

Salutations.

 
Alain Verleyen:

Pouvez-vous expliquer, s'il vous plaît, POURQUOI vous avez besoin de ce StringToEnum. Il est évident que vous avez une chaîne de caractères avec une valeur d'énumération, mais pourquoi est-elle sur une chaîne de caractères ? Je suis curieux de le savoir.

En d'autres termes, avec le support de la fonction eval(...) nous pourrions résoudre beaucoup de choses en même temps.

Cela n'arrivera JAMAIS, ne perdez pas votre temps avec ça. La fonction Eval() est une porte ouverte à une fuite de sécurité, Metaquotes n'ajoutera pas une telle fonction.

Salut Alain, j'ai satisfait ta curiosité :P

Imagine que tu utilises plusieurs codes mql5 externes, alors tu as affaire à plusieurs types de données "enum" définis sur eux, et bien sûr, comme un humain, il est préférable pour toi de te souvenir du nom de la chaîne de chaque valeur de chaque "enum". Ensuite, à un moment donné, si vous voulez spécifier une valeur d'un enum au format chaîne de caractères, vous ne pouvez pas le faire directement, vous devez donc utiliser une solution de contournement comme je l'ai écrit ci-dessus. Cela a deux grands inconvénients : le premier est que vous devez collecter toutes les valeurs de tous les enums concernés et le second inconvénient est la maintenance, si vous mettez à jour un code mql5 externe où le développeur a changé la valeur int associée à une représentation constante, vous pourriez obtenir un comportement inattendu, vous devez donc continuer à inspecter les mises à jour du code.

A propos du sujet de la fuite de sécurité... Je ne suis pas totalement d'accord avec ce que vous avez dit sur le fait que c'est une porte ouverte aux fuites de sécurité. Bien sûr, il pourrait être une porte ouverte, mais vous en tant que programmeur doit fixer les limites et prendre soin des situations critiques possibles, je veux dire que vous pouvez parfaitement gérer de telles situations comme en PHP, même sur SQL avec l'injection de code où vous devez analyser certaines données d'entrée critiques possibles des utilisateurs au cas où ils ont accès à votre code.

Peut-être qu'à l'avenir, nous aurons un peu de chance et que l'équipe de développeurs pourra nous aider dans ce sens, alors pour l'instant, nous pouvons utiliser des solutions de contournement :P

 
cyberglassed:

Marco, la solution de contournement que j'utilise est quelque chose comme ce qui suit (version très minimaliste) :

bien sûr je ne pars pas de la constante, je pars d'une chaîne de caractères, je te dis cela parce que sur ton code tu as écrit ce qui suit :

comme si vous aviez dès le départ la constante elle-même.

Désolé si je vous ai mal compris, mon anglais n'est pas très bon.

Salutations.

C'est pour cela qu'on l'appelle à l'envers et qu'on commence par comparer toutes les énumérations pour dissoudre la valeur de l'énumération dans la chaîne.

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);


Mais n'est-ce pas la même chose ?

Peu importe de quel côté vous comparez la chaîne, s'il y a une correspondance, la valeur sera signée b.

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);

donc ici nous commençons par une valeur de type string mais quelle est la différence ?

Aucune.

 
Marco vd Heijden:

...

mais n'est-ce pas la même chose ?

il n'est pas important de savoir de quel côté vous comparez le sting s'il y a une correspondance, il signera la valeur à b.

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);

Donc, ici, nous commençons avec une valeur de chaîne de caractères, mais quelle est la différence ?

Aucune.

votre code ci-dessus est inutile car il retournera toujours "b = 3" (dernier "if" car vous n'utilisez pas "else if")

si vous utilisez "else if", alors il retournera toujours "b = 0".

de toute façon, l'info : "b = 3" à chaque fois, ne donne aucune information.