Como definir uma macro condicional neste caso?

Para adicionar comentários, por favor Faça o login ou registrar
Samuel Sant Anna
284
Samuel Sant Anna  

Olá pessoal! :)
Tudo bem?

Estou procurando uma forma de definir uma macro condicional FunctionLine, que quando a linguagem definida seja inglês, a macro retorne ""Function: "+__FUNCTION__+" line: "+__LINE__", quando a linguagem definida seja português, a macro retorne " "Função: "+__FUNCTION__+" linha:"+__LINE__". Já pesquisei bastante e ainda não encontrei uma solução. Como eu posso fazer isto?

Desde já, muito obrigado pela atenção de vocês! :D

Exemplo com erro:

enum enumLanguages {English, Portuguese};
enumLanguages Language = Portuguese;

#define FunctionLine if (Language==English) {"Function: "+__FUNCTION__+" line: "+__LINE__} \
		     if (Language==Portuguese) {"Função: "+__FUNCTION__+" linha:"+__LINE__}

int start() {
   if (true)	{Print(GetLastError()+FunctionLine);}
   return(0);
}
Vinicius de Oliveira
2720
Vinicius de Oliveira  
Samuel Sant Anna:


Não sei se entendi bem a sua dúvida, mas se entendi, este artigo disponibiliza um modelo de função que pode lhe ajudar:


//--- variable for a format string
string FormatString;
//+------------------------------------------------------------------+
//| Handling the Init event                                          |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- get the format string
   FormatString=GetFormatString();
//--- additional call in case you want to ensure that the Expert Advisor operates at least once at weekends
   OnTick();
   return(0);
  }
//+------------------------------------------------------------------+
//| Handling the Tick event                                          |
//+------------------------------------------------------------------+
void OnTick()
  {
   int Variable1,Variable2,Variable3;
   Variable1=MathRand()%10;        // Random number from 0 to 10
   Variable2=MathRand()%10;        // Another random number
   Variable3=Variable1+Variable2; // Sum of numbers
//--- output the results
   Alert(StringFormat(FormatString,Variable1,Variable2,Variable3));
  }
//+------------------------------------------------------------------+
//| Determining the format string                                    |
//+------------------------------------------------------------------+
string GetFormatString(void)
  {
   string Language=TerminalInfoString(TERMINAL_LANGUAGE);
//--- language check
   if(Language=="Russian") return("%i плюс %i равно %i");     // Russian
   if(Language=="Spanish") return("%i más %i es igual a %i"); // Spanish
//--- English - in all other cases
   return("%i plus %i equals %i");
  }
Fundamentos básicos da programação MQL5: strings
Fundamentos básicos da programação MQL5: strings
  • www.mql5.com
Strings, ou melhor, variáveis de string, são utilizadas para armazenar dados de caractere, ou seja, texto: A linguagem MQL5 oferece uma ampla variedade de funcionalidades fáceis de usar para trabalhar com strings. Na programação de Expert Advisors e indicadores, as strings são utilizadas principalmente para gerar mensagens de informações. Nos...
Samuel Sant Anna
284
Samuel Sant Anna  
Vinicius de Oliveira:

Não sei se entendi bem a sua dúvida, mas se entendi, este artigo disponibiliza um modelo de função que pode lhe ajudar:


Interessante esta função TerminalInfoString(TERMINAL_LANGUAGE);  Não conhecia, vou acrescentá-la no meu código. Muito obrigado. :)

Mas não é esta a solução pro meu caso.

Por exemplo, assim a macro funciona:

string Language = TerminalInfoString(TERMINAL_LANGUAGE);

#define FunctionLine if (Language==English)     {Print("Function: "+__FUNCTION__+" line: "+__LINE__);} \
		     if (Language==Portuguese) {Print("Função: "+__FUNCTION__+" linha: "+__LINE__);}

int start() {
   if (true)    {FunctionLine;}
   return(0);
}

Só que eu não quero que a macro imprima (Print), porque eu irei chamar tal macro dentro de vários outros prints no código, como por exemplo: "Print(GetLastError()+FunctionLine);"

Vinicius de Oliveira
2720
Vinicius de Oliveira  
Samuel Sant Anna:


E fazendo conforme segue, não dá certo?

string FunctionLine()
  {
   string Language=TerminalInfoString(TERMINAL_LANGUAGE);

   //--- language check
   if(Language=="English") {return(" Function: "+__FUNCTION__+" Line: "+__LINE__);}   // English

   //--- Portuguese - in all other cases
   return(" Função: "+__FUNCTION__+" Linha: "+__LINE__);   // Portuguese
  }

Então você poderia chamar como no seu exemplo: "Print(GetLastError()+FunctionLine);".

Flavio Jarabeck
132037
Flavio Jarabeck  

Em primeiro lugar você precisa definir sua necessidade...

1- Definir a língua em tempo de compilação ou em tempo de execução...


#define's são diretivas de compilação, portanto vão derivar em um .EX5 com o #define embutido com a condição pré-definida...

;)

Samuel Sant Anna
284
Samuel Sant Anna  
Vinicius de Oliveira:

E fazendo conforme segue, não dá certo?

Então você poderia chamar como no seu exemplo: "Print(GetLastError()+FunctionLine);".

Eu comecei fazendo exatamente assim como você sugeriu Vinicius, e descobri que as macros __FUNCTION__  e __LINE__ estavam imprimindo sempre a mesma linha e função, ou seja, função e linha onde chamo elas (FunctionLine e linha X da mesma), aí não fazia sentidd, pois preciso delas dentro do código em diferentes lugares, a solução que encontrei foi definir uma nova macro lá em cima, pra poupar linhas de código repetitivas, porém, está faltando eu acertar algum detalhe que ainda não sei para que ela funcione da forma que preciso. Se eu não achar uma solução, colocarei com o print mesmo, porém, será um print extra em cada mensagem de print dentro do código que eu chamar.

Sigo na busca por uma solução.

Valeu! :D

Vinicius de Oliveira
2720
Vinicius de Oliveira  
Samuel Sant Anna:

Eu comecei fazendo exatamente assim como você sugeriu Vinicius, e descobri que as macros __FUNCTION__  e __LINE__ estavam imprimindo sempre a mesma linha e função, ou seja, função e linha onde chamo elas (FunctionLine e linha X da mesma), aí não fazia sentidd, pois preciso delas dentro do código em diferentes lugares, a solução que encontrei foi definir uma nova macro lá em cima, pra poupar linhas de código repetitivas, porém, está faltando eu acertar algum detalhe que ainda não sei para que ela funcione da forma que preciso. Se eu não achar uma solução, colocarei com o print mesmo, porém, será um print extra em cada mensagem de print dentro do código que eu chamar.

Sigo na busca por uma solução.

Valeu! :D

Ah, entendi... então você pode fazer assim:

//+------------------------------------------------------------------------------------------------------+
//| FunctionLine function                                                                                |
//+------------------------------------------------------------------------------------------------------+
string FunctionLine(string cFunction, string cLine)
  {
   string Language = TerminalInfoString(TERMINAL_LANGUAGE);

   //--- language check
   if(Language == "English") {return(" Function: " + cFunction + " Line: " + cLine);}   // English

   //--- Portuguese - in all other cases
   return(" Função: " + cFunction + " Linha: " + cLine);   // Portuguese
  }

... e pode chamar assim: Print(GetLastError() + FunctionLine(__FUNCTION__, string(__LINE__)));
Ricardo Rodrigues Lucca
292
Ricardo Rodrigues Lucca  
Samuel Sant Anna:

Olá pessoal! :)
Tudo bem?

Estou procurando uma forma de definir uma macro condicional FunctionLine, que quando a linguagem definida seja inglês, a macro retorne ""Function: "+__FUNCTION__+" line: "+__LINE__", quando a linguagem definida seja português, a macro retorne " "Função: "+__FUNCTION__+" linha:"+__LINE__". Já pesquisei bastante e ainda não encontrei uma solução. Como eu posso fazer isto?

Desde já, muito obrigado pela atenção de vocês! :D

Exemplo com erro:

Não sei se esta correta a maneira de pensar isso ai com macros, porque pra resolver isso com macros quer dizer que tu precisa conhecer a linguagem quando voce esta compilando o codigo, isto é, alguma variavel do preprocessador precisa te dizer isso pra voce montar os ifdefs. Acredito que uma solução seria encapsular em uma classe e instanciar o objeto no construtor. Dai dentro da classe tu teria diferentes arrays para as diferentes linguagens e cada frase que tu for usar eh referenciada pelo indexador do array. O problema disso eh manter os diversos array em linguagens diferentes em sincronia. Outra vantagem em usar um objeto eh que diferentes frases podem precisar de diferentes quantidades de parametros e dai fica facil fazer so definindo mais uma função de sobrecarga do metodo...

Samuel Sant Anna
284
Samuel Sant Anna  

Muito obrigado Vinicius, Ricardo e Flávio! :D

Obrigado por compartilhar conhecimento e ideias tão boas para a solução!

A solução final foi encontrada conforme descrito neste post:

https://www.mql5.com/en/forum/328213#comment_14218021

Muito Obrigado!

Sucesso e bons trades! :)

How to define a conditional macro in this case?
How to define a conditional macro in this case?
  • 2019.12.11
  • www.mql5.com
Hello people! :) All right...
Flavio Jarabeck
132037
Flavio Jarabeck  
Samuel Sant Anna:

Muito obrigado Vinicius, Ricardo e Flávio! :D

Obrigado por compartilhar conhecimento e ideias tão boas para a solução!

A solução final foi encontrada conforme descrito neste post:

https://www.mql5.com/en/forum/328213#comment_14218021

Muito Obrigado!

Sucesso e bons trades! :)

Olá Samuel!

Só lembre do seguinte, os projetos e ideias sempre crescem, usando essa abordagem você poderá acabar com um monstro nas mãos lá na frente...

;)

Para adicionar comentários, por favor Faça o login ou registrar