Erros, bugs, perguntas - página 2044

 
Alexey Navoykov:

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

Quem não se importa de enviar isto para o balcão de atendimento. Já não tenho qualquer desejo de comunicar com eles lá.

Não é um insecto, tem sido discutido a partir daqui. Extracto de

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

Peculiaridades da linguagem mql4, dicas e truques

Alexey Viktorov, 2017.04.30 08:54

A sequência de inicialização: (para aqueles que não o conhecem)

Primeiro, variáveis de nível global, depois variáveisestáticas dispostas em função da prioridade das funções, OnInit(), OnTick() ou OnCalculate()... Eu não estava interessado em mais, e não estava interessado em locais no meu tempo. Assim, acontece neste código que a função é chamada antes que as variáveis estáticas sejam inicializadas, daí o erro de que estamos a falar. A função é chamada antes de a variável ser inicializada

 
fxsaber:

Não é um insecto, tem sido discutido a partir daqui. Extracto de

Então, se foi discutido entre si e Alexey Viktorov, isso dá-lhe razões para acreditar que não é um insecto? ) E esta mesma pessoa afirma que o seu nível de conhecimento de programação é muito inferior ao seu. Ou seja, ele pode ser riscado da lista. É o único que resta). Discutiu-o consigo mesmo, por isso não é um insecto).

É um insecto. Não pode ser assim em princípio que a inicialização de uma variável seja ignorada e que o código continue a ser executado saltando por cima dela. Isto é um disparate. E a ordem de inicialização não importa aqui. A variável ou é inicializada ou o compilador gera aqui um erro. Não há uma terceira via. Caso contrário, não é uma linguagem de programação, mas algo mais.

 

Outro bug nas novas construções:

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[4]= { 1, 2, 3 };
    Print(F2(arr));  // Выдаёт -1 !!!
  }


Eh, é tão grosseiro. Pensei em actualizar para as novas construções, porque as antigas não aceitam produtos no Mercado. E aqui está um insecto sobre um insecto!

 
Alexey Navoykov:

Então, se isto foi discutido entre si e Alexey Viktorov, isso dá-lhe razões para acreditar que não é um insecto? ) E esta mesma pessoa afirma que o seu nível de conhecimento de programação é muito inferior ao seu. Ou seja, ele pode ser riscado da lista. É o único que resta). Discutiu-o consigo mesmo, por isso não é um insecto).

É um insecto. Não pode ser assim em princípio que a inicialização de uma variável seja ignorada e que o código continue a ser executado saltando por cima dela. Isto é um disparate. E a ordem de inicialização não importa aqui. A variável ou é inicializada ou o compilador gera aqui um erro. Não há uma terceira via. Caso contrário, não é uma linguagem de programação, mas algo mais.

Pode riscá-lo, nunca espalho os dedos "que tipo de programador sou eu"...

E a sua mãe não lhe diz para ler a documentação? Inseri uma citação da documentação especialmente para essas pessoas.

Há um fórum para o comércio, sistemas de comércio automatizados e testes de estratégias comerciais

Peculiaridades de mql4, dicas e truques

Alexey Viktorov, 2017.04.29 12:50

Não faz mal que a ajuda diga variável estática... leia por si mesmo

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


Mas não uma função.

É assim que funciona

#property strict
#property indicator_chart_window

int TestBrokenStatic()
{
   static int stInt = 101;
   stInt++;
   return stInt;
}

int OnInit()
{
   static int result = 0;
   result = TestBrokenStatic();
   Print("TestStatic Expected result 102   - Actual result=", result);
   result = TestBrokenStatic();
   Print("TestStatic Expected result 103   - Actual result=", result);
   
   return INIT_SUCCEEDED;
}

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
   return rates_total;
}
2017.04.29 13:49:51.546 !Test USDCHF,M15: TestStatic Expected result 103   - Actual result=103
2017.04.29 13:49:48.457 !Test USDCHF,M15: TestStatic Expected result 102   - Actual result=102
2017.04.29 13:49:40.089 Custom indicator Test\!Test USDCHF,M15: loaded successfully

 
Alexey Navoykov:

Outro bug nas novas construções:

Eh, é tão grosseiro por aqui. Pensei em actualizar para as novas construções, porque as antigas não aceitam produtos no Mercado. E depois há um insecto sobre um insecto!

E eu acertei!

 
Alexey Viktorov:

Pode riscá-lo, nunca espalho os dedos "que tipo de programador sou eu"...

E a sua mãe não lhe diz para ler a documentação? Especialmente para estas pessoas, introduzi uma citação da documentação

Vejo, depois peço desculpa, não reparei logo. É espantoso, é claro, como conseguiram mudá-lo sem que ninguém reparasse. O que não compreendo é porque é que o compilador não reage a uma operação inválida que está a ser executada. Isto é, existe um bug em qualquer caso
 
fxsaber:

Acertei!


Hmmm, qual é a sua construção? A minha é 1653.

 
Alexey Navoykov:

Então, se isto foi discutido entre si e Alexey Viktorov, isso dá-lhe razões para acreditar que não é um insecto? ) E esta mesma pessoa afirma que o seu nível de conhecimento de programação é muito inferior ao seu. Ou seja, ele pode ser riscado da lista. É o único que resta). Discutiu-o consigo mesmo, por isso não é um insecto).

É um insecto. Não pode ser assim em princípio que a inicialização de uma variável seja ignorada e que o código continue a ser executado saltando por cima dela. Isto é um disparate. E a ordem de inicialização não importa aqui. A variável ou é inicializada ou o compilador gera aqui um erro. Não há uma terceira via. Caso contrário, não é uma linguagem de programação, mas algo mais.

Se eu encontrar uma explicação lógica (consistente) do resultado, não vejo um bug. Não creio que seja aceitável provar um insecto se o resultado não coincidir com C++. É alguém em C++ que 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. E não o resultado da imposição imperceptível de estereótipos "como deve ser" à medida que se ganha experiência de programação.

Não me importo de estar errado. Estou lentamente a aprender com o meu próprio ancinho.

 
Alexey Navoykov:

Hmm, qual é a sua construção? Tenho 1653.

1653x64.

 
fxsaber:

1653x64.

Estranho como há então uma discrepância...


Pedir a outra pessoa que verifique com eles próprios.

Razão: