Erros, bugs, perguntas - página 2966

 
fxsaber:

Discutido.

O erro não é aí evidente porque: "talvez fosse essa a sua intenção".

Aqui está depois de executar a função GetLastError() = ERR_WRONG_STRING_DATE. Se a data está errada, porque é que o resultado não está errado?

 
fxsaber:

Duvido.

Eu não me preocupei... Eu contei - tem 30 linhas, eu tenho 13

 
A100:

Eu não me preocupei... Eu contei - tem 30 linhas, eu tenho 13.

O principal é obter o mesmo resultado e não perder o desempenho.

 

Erro na pesquisa binária de um valor numa matriz ordenada:

void OnStart()
  {
   long hash[]= {-8017261424500504960,-7417030212113027668,-4495301772150012897,8444435679621798267};
   long my_hash=hash[3];
   int index=ArrayBsearch(hash,my_hash);
   ArrayPrint(hash);
   Print(my_hash,": ",index);
  }

Resultado:

2021.02.19 15:46:22.937 test3 (EURUSD,M1)       -8017261424500504960 -7417030212113027668 -4495301772150012897  8444435679621798267
2021.02.19 15:46:22.937 test3 (EURUSD,M1)       8444435679621798267: 2

Em vez de 2, deveria ser 3

 
Aliaksandr Hryshyn:

Erro na pesquisa binária de um valor numa matriz ordenada:

Resultado:

Em vez de 2, deveria ser 3

//+------------------------------------------------------------------+
//| если добавить еще одно положительное число, то ошибки нет. где-то|
//|косяк в алгоритме бинарного поиска при переходе с минуса на плюс. |
//+------------------------------------------------------------------+
void OnStart()
  {
   long hash[]= {-8017261424500504960,-7417030212113027668,-4495301772150012897,8444435679621798267,8444435679621798268};
   ArrayPrint(hash);
   for(int i=0; i<ArraySize(hash); i++)
     {
      long my_hash=hash[i];
      int index=ArrayBsearch(hash,my_hash);
      Print(my_hash,": ",index);
     }
  }
//+------------------------------------------------------------------+
//| >>>| -8017261424500504960 -7417030212113027668                   |
//|-4495301772150012897 8444435679621798267  8444435679621798268     |
//|   -8017261424500504960: 0                                        |
//|   -7417030212113027668: 1                                        |
//|   -4495301772150012897: 2                                        |
//|   8444435679621798267: 3                                         |
//|   8444435679621798268: 4                                         |
//+------------------------------------------------------------------+
 
DMITRII PECHERITSA:

Não é uma questão de contornar o erro, mas de o corrigir, especialmente porque esta função pode ser utilizada em muitas fontes, mesmo as normais. E é possível que seja utilizado no próprio código terminal, editor de código...

 
Aliaksandr Hryshyn:

Não é uma questão de contornar o erro, mas de o corrigir, especialmente porque esta função pode ser utilizada em muitas fontes, mesmo as normais. E é possível que seja utilizado no próprio código terminal, editor de código...

Penso que o problema é com grandes pedaços numa situação em que quase todos os pedaços estão ocupados. é espantoso que alguém tenha encontrado este erro após tanto tempo.


 
DMITRII PECHERITSA:

Provavelmente irão resolvê-lo. na minha opinião, o problema é com grandes anseios, numa situação em que quase todos os bocados estão ocupados. é surpreendente que alguém tenha encontrado este insecto após tanto tempo.


Surpreende-me que não tenham encontrado este insecto numa função frequentemente utilizada há tanto tempo.

 

Mais uma vez, sobre variáveis não inicializadas. É evidente que o seu valor pode ser imprevisível de qualquer forma. Mas esta é a primeira vez que me deparo com o facto de poderem alterar o seu valor sozinhos no momento da execução de uma função (ainda não o encontrei através de uma pesquisa). Aqui está o código do guião e o que recebo:

//--- проверка поведения неинициализированных переменных
void OnStart()
  {
   Print("проверка поведения неинициализированных переменных");
   long a, b;


//тест без изменения значений переменных
   PrintFormat("a==%I64d, b==%I64d", a, b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);

   PrintFormat("%I64d", 1);  //после этого начинаются чудеса

   PrintFormat("a==%I64d", a);
   PrintFormat("b==%I64d", b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);
   PrintFormat("a==%I64d, b==%I64d", a, b);
   Print("a==1:", a == 1);
   Print("a==2:", a == 2);
   Print("b==1:", b == 1);
   Print("b==2:", b == 2);

//тест с изменением значения переменных
   int x, y = 0;
   Print("x=", x, " y=", y);
   Print("y = x++");
   y = x++;
   Print("x=", x, " y=", y);
  }

resultado:

2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    проверка поведения неинициализированных переменных
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==0, b==-10289152
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:false
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1, b==-10289152
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    a==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==1:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    b==2:true
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    x=1 y=0
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    y = x++
2021.02.19 20:23:07.446 TestBug (Eu-3.21,H1)    x=1 y=0

terminal:
2021.02.19 19:30:47.003 Terminal Broker Opening Broker x64 build 2755 iniciado para JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, memória 5 / 7 Gb, disco 41 / 287 Gb, IE 11, UAC, GMT+3

Se o script for executado repetidamente, os valores iniciais das variáveis a,b e x podem mudar, mas o comportamento geral é constante:

1. Na primeira parte do script, os valores das variáveis a e b no código não mudam, mas depois de executar PrintFormat("%I64d", 1) de repente PrintFormat("a==%I64d", a) produz 1, o mesmo para b. E o mais interessante (a===1)==verdadeiro e imediatamente (a===2)==verdadeiro (para b também)!!! Na última chamada PrintFormat("a===%I64d, b===%I64d", a, b) mostra a===1, mas b === o valor que estava no início do guião.

2. Na segunda parte do guião, tento alterar o valor da variável não-inicial. Depois de y=x++ o valor de x deve mudar. Mas continua a ser o mesmo (nesta corrida ==1).

Por favor, alguém tente executar o guião e publicar a produção.

Daí a pergunta aos conhecedores - este é um comportamento normal (como um comportamento indefinido)? ou é um insecto?

 
mktr8591:

Mais uma vez, sobre variáveis não inicializadas. É evidente que o seu valor pode ser imprevisível de qualquer forma. Mas esta é a primeira vez que me deparo com o facto de poderem alterar o seu valor sozinhos no momento da execução de uma função (ainda não o encontrei através de uma pesquisa). Aqui está o código do guião e o que recebo:

resultado:


terminal:
2021.02.19 19:30:47.003 Terminal Broker Opening Broker x64 build 2755 iniciado para JSC ''Opening Broker''
2021.02.19 19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, memória 5 / 7 Gb, disco 41 / 287 Gb, IE 11, UAC, GMT+3

Se o script for executado repetidamente, os valores iniciais das variáveis a,b e x podem mudar, mas o comportamento geral é constante:

1. Na primeira parte do script, os valores das variáveis a e b no código não mudam, mas depois de executar PrintFormat("%I64d", 1) de repente PrintFormat("a==%I64d", a) produz 1, o mesmo para b. E o mais interessante (a===1)==verdadeiro e imediatamente (a===2)==verdadeiro (para b também)!!! Na última chamada PrintFormat("a===%I64d, b===%I64d", a, b) mostra a===1, mas b === o valor que estava no início do guião.

2. Na segunda parte do guião, tento alterar o valor da variável não-inicial. Depois de y=x++ o valor de x deve mudar. Mas continua a ser o mesmo (nesta corrida ==1).

Por favor, alguém tente executar o guião e publicar a produção.

Daí a pergunta aos conhecedores - este é um comportamento normal (como um comportamento indefinido)? ou é um insecto?

Não inicializar as suas variáveis é um comportamento anormal. Inicializar e não haverá tais perguntas.