Erros, bugs, perguntas - página 2045

 

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

template<typename T>
int F1(const T& array[]) { return ArrayMaximum(array); }

template<typename T>
int F2(const T& array[]) { return F1(array); }

void OnStart()
  {
    int arr[3]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }
 

Descobriu a causa da discrepância. Com OPTIMIZE=0 há um erro, mas não com OPTIMIZE=1. Eu normalmente só uso OPTIMIZE=0

 
fxsaber:

Se encontrar uma explicação lógica (não contraditória) para o resultado, não vejo o bug. Não creio que seja aceitável provar um erro se o resultado não corresponder a C+++. É em C++ que alguém pensou e o fez. Mas podem não ter pensado assim e por isso não o fizeram. É por isso que é melhor não se referir a algo lá fora, mas confiar no seu próprio conceito interior do que deve ser. E é desejável que este "próprio" seja realmente o seu. Não o resultado de imposição imperceptível de estereótipos "como deve ser" à medida que se ganha experiência de programação.

Se não tiver a sua própria explicação, isso significa que não há erro. E se esta explicação aparecer um ano mais tarde e for bastante convincente, será que todos terão de refazer tudo? Em C++ já pensaram uma centena de vezes porque é que é feito desta maneira e não daquela maneira. E a explicação é necessária se algo for estabelecido de forma diferente em MQL do que em C++ e não o contrário.

 
Alexey Viktorov:
Uma variável estática pode ser rubricada com uma expressão constante ou constante correspondente ao seu tipo , ao contrário de uma variável local simples, que pode ser rubricada com qualquer expressão.


Mas não uma função.

Então as instâncias de classes estáticas devem ser proibidas - porque são inicializadas por uma função construtora

 

E aqui fica mais sobre o tema da inicialização variável. Se seguir o que foi declarado 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. Em suma, todo o MQL é uma bomba relógio.

 
Alexey Navoykov:

E aqui está outra coisa relativa à inicialização de variáveis. Se seguir o que foi declarado na documentação, então também não pode fazer referência a outras variáveis globais/estáticas. Porque não é uma expressão constante:

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
CExpert ExtExpert;

é rubricado por uma função construtora - proibir!

Isto se resumirmos logicamente os últimos posts

Alexey Navoykov:

Descobriu a razão para a discrepância. Com OPTIMIZE=0 há um erro, mas não com OPTIMIZE=1. Utilizo sempre apenas OPTIMIZE=0.

No terminal de 32 bits ocorre um erro em qualquer OPTIMIZE

int g1( int& t[] ) { return ArraySize( t ); }
int g2( int& t[] ) { return g1( t ); }
void OnStart()
{
        int t[] = { 1, 2, 3, 4, 5 }; //всего 5
        Print( g2(t)); //Результат:          3
}
 
A100:

é rubricado por uma função construtora - proibir!

Isto se resumirmos logicamente os últimos posts

Bem, a pessoa apenas o expressou incorrectamente ali. Naturalmente, estamos a falar de um valor inicializador, não de uma função inicializadora.


E o que se passa com eles - proibições. Não causam problemas por si só. Mas quando esta proibição não é de modo algum controlada pelo compilador, mas gera um algoritmo que ultrapassa as regras da linguagem, não se enquadra de todo. Agora terá de vasculhar todo o código à procura de tais coisas e estar constantemente em guarda. Bem, que se lixe esse tipo de programação, prefiro ficar na velha construção.

 
Alexey Navoykov:
Estou a ver, peço desculpa então, não reparei logo. Estou surpreendido, é claro, como conseguiram mudá-lo silenciosamente e não disseram a ninguém. O que não compreendo é porque é que o compilador não reage a uma operação inválida que está a ser executada. Ou seja, o insecto está presente em qualquer caso.
Porque pensa que é inválido? Por favor, use à sua discrição. O problema é que quando uma variável estática é inicializada por uma função, a inicialização é "pausada" e a função é executada. E no exemplo acima, há ainda 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.
 
Alexey Navoykov:

E aqui está mais sobre o tema da inicialização das variáveis. Se seguir o que foi declarado 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:

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. Em suma, todo o MQL é uma mina que trabalha em câmara lenta.

Bem... não há qualquer discrepância com a descrição na documentação deste exemplo... Dê uma boa olhada na citação da documentação

Uma variável estática pode ser inicializada com uma expressão constante ou constante apropriada ao seu tipo , ao contrário de uma simples variável local que pode ser inicializada com qualquer expressão.


ou por uma expressãoconstante

int a= 1;
int b= a+1;

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

 
A100:

Depois é necessário proibir instâncias estáticas de classes - porque são inicializadas por função construtora

Preste atenção a

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Insectos, insectos, perguntas

Alexey Viktorov, 2017.10.18 09:19

Porque pensa que mudou, porque é inaceitável? Por favor, use à sua discrição. O problema é que quando uma variável estática é inicializada por uma função, a inicialização é "pausada" e essa função é executada. E no exemplo acima, há ainda 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.
Infelizmente, não sei se é possível declarar e inicializar as variáveis estáticas no construtor, mas espero que me falem sobre isso. E, tanto quanto sei, a sequência de iniciação é muito importante.