existe alguma função "StringToEnum" ou uma alternativa? - página 2

 

tenho acompanhado isto, mas não tenho um entendimento claro do que exatamente é que você quer realizar.

Costumo recodificar as coisas fazendo-as de maneiras diferentes para chegar ao resultado final que eu estava procurando, as coisas podem ser feitas de muitas maneiras.

 
Marco vd Heijden:

tenho acompanhado isto, mas não tenho um entendimento claro do que exatamente é que você quer realizar.

Costumo recodificar as coisas fazendo-as de maneiras diferentes para chegar ao resultado final que eu estava procurando, as coisas podem ser feitas de muitas maneiras.

obrigado Marco. É claro que as coisas podem ser feitas de muitas maneiras (e soluções), às vezes você tem que escolher uma delas para atingir seu objetivo, mas há algumas maneiras mais fáceis do que outras. Neste caso, a alternativa que eu tomei para imitar a função: StringToEnum estava usando múltiplas comparações de string com "se", mas como eu disse antes da função eval (não implementada em mql5) poderia ajudar a evitar todos aqueles "se", e também ajudar na manutenção porque se constantes mudam o nome deles, então você não tem que mudar o bloco de "se".
 

Sei exatamente o que você quer dizer: tenho centenas, algumas vezes até milhares de linhas em um bloco de código para chegar ao que eu preciso.

você tem que amar o que você faz.

 
cyberglassed:
Obrigado Marco. Claro que as coisas podem ser feitas de muitas maneiras (e soluções), às vezes você tem que escolher uma delas para atingir seu objetivo, mas há algumas maneiras mais fáceis do que outras. Neste caso, a alternativa que eu tomei para imitar a função: StringToEnum estava usando múltiplas comparações de string com "se", mas como eu disse antes da função eval (não implementada em mql5) poderia ajudar a evitar todos aqueles "se", e também ajudar na manutenção porque se constantes mudam o nome deles, então você não tem que mudar o bloco de "se".

Você pode explicar, por favor, por que você precisa deste StringToEnum. Obviamente você tem uma corda com um valor enumeral, mas por que ela está em uma corda? Estou curioso para saber.

Em outras palavras, com o apoio da função eval(...) poderíamos resolver muitas coisas ao mesmo tempo.

Isso NUNCA vai acontecer, não perca seu tempo com isso. A função Eval() é uma porta aberta para vazamento de segurança, Metaquotes não adicionarão tal função.

 
Marco vd Heijden:

Sei exatamente o que você quer dizer: tenho centenas, algumas vezes até milhares de linhas em um bloco de código para chegar ao que preciso.

você tem que amar o que você faz.

Seu problema NÃO pode ser resolvido com um StringToEnum(), você já o conhece (eu acho).
 
Alain Verleyen:
Seu problema NÃO pode ser resolvido com um StringToEnum(), você já o sabe (eu acho).

Correto, mas isso pode ser feito ao contrário.

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

Mas não faria sentido, pois MODE_SMMA já tem valor inteiro 2 e é por isso que escrevi que não entendo o que o cyberglassed está tentando realizar.

 
Marco vd Heijden:

Correto, mas isso pode ser feito ao contrário.

Mas não faria sentido, pois MODE_SMMA já tem valor inteiro 2 e é por isso que escrevi que não entendo o que o cyberglassed está tentando realizar.

Marco a alternativa que uso é algo como o seguinte (versão muito minimalista):

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

é claro que eu não começo da constante, eu começo de um fio, eu digo isto porque em seu código você escreveu o seguinte:

EnumToString(MODE_SMMA)

como se você tivesse desde o início a própria constante.

Desculpe se eu o entendi mal, meu inglês não é muito bom.

Cumprimentos.

 
Alain Verleyen:

Você pode explicar, por favor, por que você precisa deste StringToEnum. Obviamente você tem uma corda com um valor enumeral, mas por que ela está em uma corda? Estou curioso para saber.

Em outras palavras, com o apoio da função eval(...) poderíamos resolver muitas coisas ao mesmo tempo.

Isso NUNCA vai acontecer, não perca seu tempo com isso. A função Eval() é uma porta aberta para o vazamento de segurança, Metaquotes não adicionarão tal função.

Oi Alain, eu satisfaço sua curiosidade :P

Imagine que você está usando múltiplos códigos mql5 externos, então você está lidando com múltiplos tipos de dados "enum" definidos neles, e é claro, como um humano, é melhor que você se lembre do nome da string de cada valor de cada "enum". Então, em alguma parte você quer especificar algum valor de algum enum em formato de string, então você não pode fazê-lo diretamente, então você tem que usar algum trabalho como eu escrevi acima. Isto tem duas grandes desvantagens a primeira é que você tem que coletar todos os valores de todos os enumeros envolvidos e a segunda desvantagem é a manutenção, então se você atualizar algum código mql5 externo onde o desenvolvedor mudou o valor int associado a alguma representação constante, então você pode ter um comportamento inesperado, então você tem que continuar inspecionando por atualizações no código.

Sobre o tópico vazamento de segurança... Não estou totalmente de acordo com o que você disse sobre o assunto é uma porta aberta para o vazamento de segurança. Claro que poderia ser uma porta aberta, mas você como programador tem que definir os limites e cuidar de possíveis situações críticas, quero dizer que você pode gerenciar perfeitamente tais situações como em PHP, mesmo em SQL com injeção de código onde você tem que analisar alguns dados críticos possíveis de entrada dos usuários caso eles tenham acesso ao seu código.

Talvez no futuro tenhamos pouca sorte e a equipe de desenvolvedores possa nos dar alguma ajuda nessa direção, então, por enquanto, podemos usar soluções de trabalho :P

 
cyberglassed:

Marco a alternativa que uso é algo como o seguinte (versão muito minimalista):

é claro que eu não começo da constante, eu começo de um fio, eu digo isto porque em seu código você escreveu o seguinte:

como se você tivesse desde o início a própria constante.

Desculpe se eu o entendi mal, meu inglês não é muito bom.

Cumprimentos.

É por isso que é chamado ao contrário e você começa comparando todas as enumerações para dissolver o valor da enumeração a partir da corda.

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


Mas isso não é a mesma coisa?

não importa de que lado você compara a picada se houver uma correspondência, ela assinará o valor a 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);

então aqui começamos com um valor de corda, mas qual é a diferença?

Nenhuma.

 
Marco vd Heijden:

...

... mas isso não é a mesma coisa?

não importa de que lado você compara o ferrão se houver uma correspondência, ele assinará o valor a 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);

Então, aqui começamos com um valor de corda, mas qual é a diferença?

Nenhuma.

seu código acima é inútil porque ele sempre retornará "b = 3" (último "se" porque você não está usando "senão se")

se você usar "else if", então sempre retornará "b = 0".

de qualquer forma, as informações: "b = 3" todas as vezes, não dá nenhuma informação.

Razão: