Errores, fallos, preguntas - página 2966

 
fxsaber:

Discutido.

El error no es obvio allí porque: "tal vez estaba previsto así".

Aquí está después de ejecutar la función GetLastError() = ERR_WRONG_STRING_DATE. Si la fecha es errónea, ¿por qué el resultado no es erróneo?

 
fxsaber:

Lo dudo.

No me molesté... He contado - usted tiene 30 líneas, yo tengo 13

 
A100:

No me molesté... He contado: tú tienes 30 líneas, yo tengo 13.

Lo principal es obtener el mismo resultado y no perder rendimiento.

 

Error en la búsqueda binaria de un valor en una 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

En lugar de 2 debería ser 3

 
Aliaksandr Hryshyn:

Error en la búsqueda binaria de un valor en una matriz ordenada:

Resultado:

En lugar de 2 debería 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:

No se trata de sortear el error, sino de solucionarlo, sobre todo porque esta función se puede utilizar en muchas fuentes, incluso las estándar. Y es posible que se utilice en el propio código del terminal, editor de código...

 
Aliaksandr Hryshyn:

No se trata de sortear el error, sino de solucionarlo, sobre todo porque esta función se puede utilizar en muchas fuentes, incluso las estándar. Y es posible que se utilice en el propio código del terminal, editor de código...

Creo que el problema está en los bits grandes en una situación en la que casi todos los bits están ocupados. es increíble que alguien haya encontrado este error después de tanto tiempo.


 
DMITRII PECHERITSA:

Probablemente lo arreglarán. en mi opinión, el problema está en los largos en una situación en la que casi todos los bits están ocupados. es sorprendente que alguien haya encontrado este fallo después de tanto tiempo.


Me sorprende que no hayan encontrado este fallo en una función de uso frecuente en tanto tiempo.

 

De nuevo, sobre las variables no inicializadas. Está claro que su valor puede ser imprevisible de cualquier manera. Pero es la primera vez que encuentro que pueden cambiar su valor por sí mismos en tiempo de ejecución de una función (no lo he encontrado buscando). Aquí está el código del script y lo que obtengo:

//--- проверка поведения неинициализированных переменных
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 Opening Broker x64 build 2755 iniciado para JSC ''Opening Broker''
2021.02.19 19:30:47.113 Terminal Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M @ 2.50GHz, 5 / 7 Gb de memoria, 41 / 287 Gb de disco, IE 11, UAC, GMT+3

Si el script se ejecuta repetidamente, los valores iniciales de las variables a,b y x pueden cambiar, pero el comportamiento general es constante:

1. En la primera parte del script, los valores de las variables a y b en el código no cambian, pero después de ejecutar PrintFormat("%I64d", 1) de repente PrintFormat("a==%I64d", a) da como resultado 1, lo mismo para b. ¡¡¡Y lo más interesante es que (a==1)==true e inmediatamente (a==2)==true (para b también)!!! En la última llamada PrintFormat("a==%I64d, b==%I64d", a, b) muestra a==1, pero b == el valor que había al principio del script.

2. En la segunda parte del script intento cambiar el valor de la variable no inicial. Después de y=x++ el valor de x debería cambiar. Pero sigue siendo el mismo (en esta ejecución ==1).

Por favor, que alguien intente ejecutar el script y publique el resultado.

De ahí la pregunta a los entendidos: ¿es este un comportamiento normal (como un comportamiento indefinido) o es un error?

 
mktr8591:

De nuevo, sobre las variables no inicializadas. Está claro que su valor puede ser imprevisible de cualquier manera. Pero es la primera vez que encuentro que pueden cambiar su valor por sí mismos en tiempo de ejecución de una función (no lo he encontrado buscando). Aquí está el código del script y lo que obtengo:

resultado:


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

Si el script se ejecuta repetidamente, los valores iniciales de las variables a,b y x pueden cambiar, pero el comportamiento general es constante:

1. En la primera parte del script, los valores de las variables a y b en el código no cambian, pero después de ejecutar PrintFormat("%I64d", 1) de repente PrintFormat("a==%I64d", a) da como resultado 1, lo mismo para b. ¡¡¡Y lo más interesante es que (a==1)==true e inmediatamente (a==2)==true (para b también)!!! En la última llamada PrintFormat("a==%I64d, b==%I64d", a, b) muestra a==1, pero b == el valor que había al principio del script.

2. En la segunda parte del script intento cambiar el valor de la variable no inicial. Después de y=x++ el valor de x debería cambiar. Pero sigue siendo el mismo (en esta ejecución ==1).

Por favor, que alguien intente ejecutar el script y publique el resultado.

De ahí la pregunta a los entendidos: ¿es este un comportamiento normal (como un comportamiento indefinido) o es un error?

No inicializar sus variables es un comportamiento anormal. Inicialice y no habrá tales preguntas.