Erros, bugs, perguntas - página 2046

 
Alexey Viktorov:

Esta inicialização é possível. Porque a variável 'a' é inicializada com uma constante, e a variável 'b' é inicializada com uma expressão constante.

Aqui 'b' é inicializado NÃO por uma expressão constante. É por isso que está em contradição com as regras descritas na documentação.

Oproblema é que quando umavariável estática é inicializada por uma função, a inicialização é "pausada" e a função é executada. No exemplo acima, existe uma variável estática nessa função que ainda não foi inicializada. Assim, uma variável inicializada por uma função tem um valor diferente.

Mas como pode a inicialização ser pausada? Todas as operações são executadas numa ordem estrita definida pela sintaxe linguística. Primeiro, a função é executada, e depois o valor retornado desta função é passado para o construtor da nossa variável - a isto chama-se inicialização. Mas a operação de inicialização é flagrantemente ignorada pelo compilador neste caso, e o código apenas continua a compilar como se nada tivesse acontecido. Isto é inaceitável. É o mesmo que se, por exemplo, declarasse a seguinte matriz int a[]= { f(), g(), h() }; e compilaria, mas claro que sem inicializar nada.

 
A100:

Em terminal de 32-bit um erro em qualquer OPTIMIZE

Real. Verificado em MT4, existem de facto erros de qualquer forma. E como as pessoas codificam algo lá em novas construções
 
Alexey Navoykov:

b' aqui é rubricado por NÃO ser uma expressão constante. Portanto, é contra as regras descritas na documentação.

Como se pode fazer uma pausa na inicialização? Todas as operações são realizadas numa ordem estrita definida pela sintaxe linguística. Primeiro, a função é executada, e depois o valor retornado desta função é passado para o construtor da nossa variável - a isto chama-se inicialização. Mas a operação de inicialização é flagrantemente ignorada pelo compilador neste caso, e o código apenas continua a compilar como se nada tivesse acontecido. Isto é inaceitável. É o mesmo que se, por exemplo, declarasse a seguinte matrizint a[]= { f(), g(), h() }; e compilaria, mas claro que sem inicializar nada.

Se não por uma expressão constante, então por O QUE???

Alexey, é mais fácil se você mesmo pegar nesse código e olhar através da sequência de inicialização no depurador. Além disso, não reparei imediatamente que neste exemplo

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Alexey Navoykov, 2017.10.17 20:31

E aqui está mais sobre o tema da inicialização de variáveis. Se seguir o que foi mencionado na documentação, então também não pode fazer referência a outras variáveis globais/estáticas. Uma vez que não é uma expressão constante:

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

No entanto, por agora funciona. E suponho que muitas pessoas sempre utilizaram tais construções sem se aperceberem disso. Mas acontece que os criadores podem desactivá-lo a qualquer momento. E como no caso da inicialização de funções, estes códigos ainda serão compilados com sucesso, mas não funcionarão correctamente. Portanto, todo o código MQL é uma bomba relógio.


São as variáveis de nível global, não as variáveis estáticas localizadas dentro de qualquer função.

Não tenho conhecimentos suficientes para o explicar, e o senhor não está suficientemente atento. "suspenso" em vírgulas invertidas!!!

Não confundir inicialização de variáveis estáticas e ordinárias, tanto mais para variáveis locais.

 
Alexey Viktorov:

Se não por uma expressão constante, então porquê?

Uma expressão não-constante.

Além disso, não reparei imediatamente O ponto principal é que este exemplo fala de variáveis de nível global e não de variáveis estáticas localizadas dentro de qualquer função.

Não tenho conhecimentos suficientes para o explicar de uma forma clara, e não tem a capacidade de atenção...

Não estás a confundir alguma coisa?

Além disso, as variáveis globais e estáticas comportam-se de forma absolutamente idêntica. Aqui está a documentação:

Uma variável global só pode ser inicializada por uma constante ou por uma expressão constante correspondente ao seu tipo.

Devo confessar que foi uma revelação tanto para mim como para as variáveis estáticas. Não sei quando tudo apareceu na documentação ou talvez tenha sido mais cedo, mas ninguém prestou atenção, porque tudo funcionou realmente como em C++, por isso não surgiram questões.

 
Alexey Navoykov:

Uma expressão não-constante.

Não está a confundir as coisas?

Além disso, as variáveis globais e estáticas comportam-se exactamente da mesma forma. Aqui está algo da documentação:

Devo confessar que isto foi para mim uma revelação tão grande como foi para as variáveis estáticas. Não sei quando tudo isto apareceu na documentação e talvez tenha sido mais cedo, mas ninguém prestou atenção, uma vez que tudo funcionou realmente em C++ e, portanto, não surgiram questões.

Penso que estás absolutamente enganado. Como se pode falar da identidade das variáveis, se algumas estão disponíveis a partir de todas as funções definidas no programa e outras apenas na função em que são declaradas.

E a diferença entre variáveis estáticas e locais é que as variáveis estáticas são inicializadas imediatamente após o global, e as locais ordinárias (não estáticas) tal como o programa executa, quando o código chega a elas.

 
Alexey Viktorov:

Parece-me que está completamente enganado. Como se pode falar em variáveis idênticas se algumas são acessíveis a partir de todas as funções definidas no programa, e outras apenas na função em que são declaradas.

Estava a falar do contexto específico da discussão(inicialização variável), não em geral.

 
Depois de enviar mensagens via chat completo, a mensagem enviada não é automaticamente adicionada ao histórico do chat da página actual.
A mensagem enviada só aparece depois de carregar de novo a página.

Apenas um relance rápido, a resposta do servidor ao enviar a mensagem é adequada, talvez algo tenha corrido mal nos manipuladores de eventos no código js.
 
Alexey Navoykov:

Tratava-se do contexto específico da discussão(inicialização variável), não em geral.

Tanto quanto me lembro, tratava-se de inicializar uma variável STATIC

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Insectos, insectos, perguntas

Alexey Navoykov, 2017.10.17 17:16

Bug com inicialização de variáveis estáticas. Não estava presente em construções antigas.

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

Quem não se importar, mande-o para o balcão de atendimento. Já não tenho qualquer desejo de comunicar com eles lá.


Ou esta não é a sua mensagem?

Ordenar já a sequência de inicialização das variáveis. Neste exemplo, uma variável global é inicializada primeiro

int a= A::f();

que chama uma função que ainda não inicializou uma variável com o mesmo nome.

static int a=1;

E do que podemos falar se não prestarmos atenção aos avisos do compilador.


 
Alexey Navoykov:

Mas coloquei aí a dimensão de matriz errada, talvez a tenha afectado de alguma forma (embora não a devesse afectar de todo).

Experimente isto com dimensão = 3

Obrigado pela mensagem.
De facto, é o erro de optimização do compilador.
A reparação será incluída na próxima construção.
 
Alexey Viktorov:

Tanto quanto me lembro, tratava-se de rubricar uma variável STATIC

Ou essa não é a sua mensagem?

Não compreendo o que pretende. Eu disse que se tratava de "inicialização variável". E, neste contexto, as variáveis estáticas e globais comportam-se de forma idêntica. Até lhe dei um link para a documentação:inicialização de variáveis

Note-se que as variáveis estáticas e globais estão ali unidas em todo o lado.

E não criticamos a sequência de inicialização porque não está relacionada com o problema em questão. Deixem-me lembrar-vos que o problema é que o compilador NÃO irá gerar um erro onde deveria. Se uma variável estática ainda não for inicializada, não se pode aceder a ela.

E do que podemos falar se ignorarmos os avisos do compilador.

Bem, mude o nome da variável global, se isso o incomoda assim tanto. Não afectará de forma alguma o resultado.

Razão: