Discussão do artigo "Variáveis Avançadas e Tipos de Dados em MQL5"

 

Novo artigo Variáveis Avançadas e Tipos de Dados em MQL5 foi publicado:

Variáveis e tipos de dados são tópicos muito importantes não apenas na programação MQL5, mas também em qualquer linguagem de programação. As variáveis e tipos de dados em MQL5 podem ser categorizados como simples e avançados. Neste artigo, identificaremos e aprenderemos sobre os avançados, pois já mencionamos os simples em um artigo anterior.

Neste artigo, mencionaremos e aprofundaremos para aprender mais sobre variáveis e tipos de dados em MQL5 e como eles podem ser úteis ao criar ou construir software de negociação MQL5. Aprenderemos mais sobre alguns conceitos avançados de variáveis e tipos de dados e os cobriremos através dos seguintes tópicos:

  • Constantes: são identificadores cujos valores são imutáveis.
  • Arrays: são qualquer tipo de variável com múltiplos valores. 
  • Enumerações: são listas de constantes inteiras com valores inteiros.
  • Estruturas: são um conjunto de variáveis relacionadas com tipos diferentes.
  • Conversão de tipo: é o processo de converter um tipo de valor para outro.
  • Variáveis locais: são variáveis declaradas localmente dentro das funções.
  • Variáveis globais: são variáveis declaradas globalmente fora das funções.
  • Variáveis estáticas: são variáveis locais declaradas que retêm seus valores na memória.
  • Variáveis predefinidas: são variáveis predefinidas pelo criador da linguagem de programação.


    Autor: Mohamed Abdelmaaboud

     
    MetaQuotes:

    Confira o novo artigo: Variáveis avançadas e tipos de dados em MQL5.

    Autor: Mohamed Abdelmaaboud


    Discordo até certo ponto que uma diretiva de pré-processador possa ser mencionada no contexto de variáveis const.

    A palavra-chave const tem um efeito diferente de #define "constant".

    const pode ser muito útil em assinaturas de funções, pois define os parâmetros que o valor passa para o modo somente leitura. const é uma palavra-chave especialmente projetada para o programador. Não há representação no binário executável produzido pelo compilador.

    Em contraste com uma variável const, uma instrução #define é o chamado valor r, que, na verdade, está em uma região de memória somente leitura mais adiante no binário executável e, portanto, não pode ser alterada de forma alguma.

    Além disso, #define é uma diretiva de estágio do pré-processador e, na verdade, apenas substitui todas as ocorrências no arquivo de origem. Isso é feito antes mesmo de o compilador ver o código a ser compilado.

    Além disso, a diretiva #define não tem um "local" como global, ela pode aparecer em qualquer lugar do arquivo de origem. No estágio do pré-processador, o conceito de blocos de código "{...}" não está disponível nem é avaliado.

    A visibilidade das variáveis é definida por blocos de código. Você pode definir blocos de código como quiser em qualquer nível, exceto no nível global. No nível global, você precisa de alguma "entidade" à qual esse bloco pertença. Função, classe, struct ou namespace.

    Dentro desse bloco "nomeado", você pode colocar em cascata quantos blocos quiser, embora a visibilidade seja sempre apenas dentro do mesmo nível ou de blocos incluídos/filhos.

    As variáveis estáticas residem, na verdade, na memória do espaço global alocado para um programa, e a visibilidade dessa variável é regida pelo bloco de código no qual ela foi declarada/definida. Esse também pode ser o espaço global. Na verdade, uma variável declarada/definida no espaço global tem uma palavra-chave "static" implícita. Mencioná-la explicitamente não alterará o comportamento dessa variável.

    Estou sentindo falta da palavra-chave "extern" em seu artigo, bem como de "input". Acho que elas deveriam fazer parte.

    De qualquer forma, acho que é um bom artigo, especialmente para iniciantes, pois o conceito de variáveis às vezes é difícil de entender no início, e muitos erros podem ser evitados se forem implementados corretamente.

    Seria bom se você pudesse incluir informações sobre definição, declaração e inicialização de variáveis e memória. Talvez também aponte as armadilhas se não forem feitas corretamente.

    E para obter mais informações, talvez alguns detalhes adicionais sobre pilha, ordem das variáveis, MSB vs LSB, endereçamento de memória.... Ok, talvez essa seja uma busca muito longa.
     
    Dominik Egert #:

    Discordo um pouco que uma diretriz de pré-processador possa ser mencionada no contexto de variáveis const.

    A palavra-chave const tem um efeito diferente de #define "constant".

    const pode ser muito útil em assinaturas de funções porque coloca o valor dos parâmetros em modo somente leitura. const é uma palavra-chave criada especialmente para o codificador. Ela não tem representação no binário executável criado pelo compilador.

    Ao contrário da variável const, o operador #define representa o chamado valor r, que na verdade está localizado em um local de memória somente leitura em um binário executável adicional e, portanto, não pode ser alterado de forma alguma.

    Além disso, #define é uma diretiva de estágio do pré-processador e, na verdade, apenas substitui todas as ocorrências no arquivo de origem. Isso é feito antes mesmo de o compilador ver o código compilado.

    Além disso, a diretiva #define não tem o mesmo "local" que uma diretiva global, podendo aparecer em qualquer lugar do arquivo de origem. No estágio do pré-processador, o conceito de blocos de código "{...}" não está disponível nem é avaliado.

    A visibilidade das variáveis é determinada por codeblocks. Você pode, em qualquer nível, definir codeblocks da maneira que quiser, exceto no nível global. No nível global, você precisa de alguma "entidade" à qual o bloco pertença. Uma função, classe, estrutura ou namespace.

    Dentro desse bloco "nomeado", você pode colocar em cascata quantos blocos quiser, e a visibilidade será sempre apenas dentro de blocos do mesmo nível ou de blocos incluídos/subsidiários.

    As variáveis estáticas residem, na verdade, no espaço de memória global alocado para o programa; a visibilidade dessa variável é determinada pelo bloco de código no qual ela foi declarada/definida. Esse também pode ser um espaço global. De fato, uma variável declarada/definida no espaço global tem a palavra-chave implícita "static". Sua menção explícita não alterará o comportamento dessa variável de forma alguma.

    No seu artigo, não encontrei a palavra-chave "extern" nem "input". Acho que elas deveriam fazer parte do artigo.

    De qualquer forma, acho que este é um bom artigo, especialmente para iniciantes, pois o conceito de variáveis às vezes é difícil de entender no início e muitos erros podem ser evitados se implementados corretamente.

    Talvez você possa continuar o artigo, seria bom se falasse sobre a definição, declaração e inicialização de variáveis, bem como sobre memória. Talvez você também possa apontar as armadilhas se forem feitas de forma incorreta.

    E para maior compreensão, talvez alguns detalhes avançados sobre a pilha, ordenação de variáveis, MSB vs LSB, endereçamento de memória..... Ok, talvez isso seja demais.


    Obrigado por compartilhar as informações. Tentarei escrever sobre o que você mencionou o máximo possível.

     
    Dominik Egert #:
    A palavra-chave const tem um efeito diferente de #define "constant".

    A propósito, gosto da maneira como as constantes são implementadas no C# (o compilador as substitui por valores literais).

    https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constants

    De fato, quando o compilador encontra um identificador de constante no código-fonte do C#, ele substitui o valor literal diretamente no código de linguagem intermediária (IL) que produz. Como não há endereço de variável associado a uma constante em tempo de execução, os campos const não podem ser passados por referência e não podem aparecer como um valor l em uma expressão.

    A julgar pelo fato de que em MQL eu posso passar uma constante por referência, em MQL as constantes permanecem variáveis após a compilação.