Ошибки, баги, вопросы - страница 2966

 

Там ошибка не очевидна, потому что: "а может так и задумано было"

Здесь же после выполнения функции GetLastError() = ERR_WRONG_STRING_DATE. Если дата ошибочная, то почему результат не ошибочный?

 
fxsaber:

Сомневаюсь.

Не поленился... посчитал - у Вас 30 строк, у меня- 13

 
A100:

Не поленился... посчитал - у Вас 30 строк, у меня- 13

Главное, чтобы результат совпадал и производительность не падала.

 

Ошибка при двоичном поиске значения в отсортированном массиве:

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);
  }

Результат:

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

Вместо 2 должно быть 3

 
Aliaksandr Hryshyn:

Ошибка при двоичном поиске значения в отсортированном массиве:

Результат:

Вместо 2 должно быть 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:

Тут вопрос не в обходе ошибки а в её исправлении, тем более эта функция может использоваться во множестве исходниках, даже и в стандартных. И совсем не исключено что она используется в самом коде терминала, редакторе кода...

 
Aliaksandr Hryshyn:

Тут вопрос не в обходе ошибки а в её исправлении, тем более эта функция может использоваться во множестве исходниках, даже и в стандартных. И совсем не исключено что она используется в самом коде терминала, редакторе кода...

  исправят, наверное. по-моему, проблема с большими long-ами в ситуации, когда почти все биты заняты. удивительно, что кто-то нашел эту ошибку спустя столько времени.


 
DMITRII PECHERITSA:

  исправят, наверное. по-моему, проблема с большими long-ами в ситуации, когда почти все биты заняты. удивительно, что кто-то нашел эту ошибку спустя столько времени.


Удивительно что не нашли эту ошибку в часто используемой функции за такой длительный период.

 

И снова про неинициализированные переменные. Понятно, что их значение может быть непредсказуемо любым. Но я первый раз сталкиваюсь с тем, что они могут менять значение сами по себе прямо во время выполнения функции (поиском такого не нашел,). Вот код скрипта и то, что я получаю:

//--- проверка поведения неинициализированных переменных
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);
  }

результат:

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

терминал:
2021.02.19 19:30:47.003    Terminal    Открытие Брокер x64 build 2755 started for АО ''Открытие Брокер''
2021.02.19 19:30:47.113    Terminal    Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz, 5 / 7 Gb memory, 41 / 287 Gb disk, IE 11, UAC, GMT+3

Если повторять запуски скрипта, то начальные значения переменных a,b и x могут меняться, но общее поведение постоянно:

1. В первой части скрипта значения переменных a и b в коде не меняются, но после выполнения PrintFormat("%I64d", 1) вдруг PrintFormat("a==%I64d", a) выдает 1, то же для b. И самое интересное (a==1)==true и сразу же (a==2)==true (для b также)!!! В последнем вызове PrintFormat("a==%I64d, b==%I64d", a, b) показывает a==1, но b == тому значению, которое было в начала скрипта.

2. Во второй части скрипта  пробую менять значение неиниц-й переменной. После y=x++ должно измениться значение x. Но оно остается таким же (в этом запуске ==1).

Попробуйте, плиз, кто-нибудь запустить скрипт и запостить вывод.

Отсюда вопрос знатокам - это нормальное поведение (типа undefined behavior)?  Или это баг?

 
mktr8591:

И снова про неинициализированные переменные. Понятно, что их значение может быть непредсказуемо любым. Но я первый раз сталкиваюсь с тем, что они могут менять значение сами по себе прямо во время выполнения функции (поиском такого не нашел,). Вот код скрипта и то, что я получаю:

результат:


терминал:
2021.02.19 19:30:47.003    Terminal    Открытие Брокер x64 build 2755 started for АО ''Открытие Брокер''
2021.02.19 19:30:47.113    Terminal    Windows 7 Service Pack 1 build 7601, Intel Core i5-2520M  @ 2.50GHz, 5 / 7 Gb memory, 41 / 287 Gb disk, IE 11, UAC, GMT+3

Если повторять запуски скрипта, то начальные значения переменных a,b и x могут меняться, но общее поведение постоянно:

1. В первой части скрипта значения переменных a и b в коде не меняются, но после выполнения PrintFormat("%I64d", 1) вдруг PrintFormat("a==%I64d", a) выдает 1, то же для b. И самое интересное (a==1)==true и сразу же (a==2)==true (для b также)!!! В последнем вызове PrintFormat("a==%I64d, b==%I64d", a, b) показывает a==1, но b == тому значению, которое было в начала скрипта.

2. Во второй части скрипта  пробую менять значение неиниц-й переменной. После y=x++ должно измениться значение x. Но оно остается таким же (в этом запуске ==1).

Попробуйте, плиз, кто-нибудь запустить скрипт и запостить вывод.

Отсюда вопрос знатокам - это нормальное поведение (типа undefined behavior)?  Или это баг?

Не инициализировать свои переменные - вот это ненормальное поведение. Инициализируйте, и таких вопросов не будет.
Причина обращения: