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

 
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)?  Или это баг?

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

Полностью ЗА.

Но это еще не означает, что бага нигде нет ))). Просто хотел удостовериться, что все впорядке.

 
mktr8591:

Полностью ЗА.

Но это еще не означает, что бага нигде нет ))). Просто хотел удостовериться, что все впорядке.

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

 
Roman:

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

Или оптимизация. Раз переменная не определена, можем отдать любое значение, что ближе лежит, в регистре, например.

 
JRandomTrader:

Или оптимизация. Раз переменная не определена, можем отдать любое значение, что ближе лежит, в регистре, например.

Ну что то типа этого, из своего окружения. Генерация конечно не уместна как я озвучил, просто обобщил предположение.

 

Решил узнать, сколько будут зарабатывать 2 агента в сервисе MQL5 Cloud Network, чтобы в будущем собрать железо с многоядерным процессором. Добавил агентов с помощью Агент менеджера. Вроде нормально добавились.

Agent Manager

Ничего не вызывает подозрений... Осуществил вход в свой аккаунт MQL5.COM. В разделе "Агенты" в кабинете отобразились созданные агенты. В службах, в диспетчере задач также нашёл 2 службы, MetaTester-1 и  MetaTester-2. Но вот уже пол дня никаких заданий агенты не выполняют. Всё по нулям. Почему агенты не работают?

Распределенные вычисления в сети MQL5 Cloud Network
Распределенные вычисления в сети MQL5 Cloud Network
  • cloud.mql5.com
Заработать деньги, продавая мощности своего компьютера для сети распределенных вычислений MQL5 Cloud Network
 
	 CList *deals_array = new CList;

         for(int i=0;i<10;i++)
         {
            RobotDeal *cobj = new RobotDeal;
            cobj.ticker = "ticker " +IntegerToString(i);
            deals_array.Add(cobj);
         }
         
         RobotDeal *cobj11 = new RobotDeal;
         cobj11.ticker = "ticker 11 ";
         deals_array.Add(cobj11);
         
         RobotDeal *cobj12 = new RobotDeal;
         cobj12.ticker = "ticker 12 ";
         deals_array.Add(cobj12);
         
         RobotDeal *cobj13 = new RobotDeal;
         cobj13.ticker = "ticker 13 ";
         deals_array.Add(cobj13);
         
         RobotDeal *cobj14 = new RobotDeal;
         cobj14.ticker = "ticker 14 ";
         deals_array.Add(cobj14);

         Print("Total: " + IntegerToString(deals_array.Total()));

         for(int i=0;i<deals_array.Total();i++)
           {
               RobotDeal *object=deals_array.GetNodeAtIndex(i);
               Print(object.ticker);
           }
         
         for(int i=0; i < 14; i++)
         {
            Print("remove # " + IntegerToString(i));
            RobotDeal *deal = deals_array.GetNodeAtIndex(i);
            
            if(CheckPointer(deal) != POINTER_INVALID)
            {
               Print("remove: " + deal.ticker);
               deals_array.Delete(i);
            }
         }

         for(int i=0;i<deals_array.Total();i++)
           {
               RobotDeal *object=deals_array.GetNodeAtIndex(i);
               Print(object.ticker);
           }

         Print("Total end: " + IntegerToString(deals_array.Total()));
class RobotDeal: public CObject
{
    public:

    string ticker;

    RobotDeal() {}
};

Подскажите пожалуйста, как правильно удалять элементы из Clist ? При попытке удалить удаляется только половина, а индексация сбивается. Уже как только не пробовал. не работает вообще!


При выполнении кода выдает такое, например


Total: 14

ticker 0

ticker 1

ticker 2

ticker 3

ticker 4

ticker 5

ticker 6

ticker 7

ticker 8

ticker 9

ticker 11 

ticker 12 

ticker 13 

ticker 14 

remove # 0

remove: ticker 0

remove # 1

remove: ticker 2

remove # 2

remove: ticker 4

remove # 3

remove: ticker 6

remove # 4

remove: ticker 8

remove # 5

remove: ticker 11 

remove # 6

remove: ticker 13 

remove # 7

remove # 8

remove # 9

remove # 10

remove # 11

remove # 12

remove # 13

ticker 1

ticker 3

ticker 5

ticker 7

ticker 9

ticker 12 

ticker 14 

Total end: 7


 
Mihail Matkovskij:

Решил узнать, сколько будут зарабатывать 2 агента в сервисе MQL5 Cloud Network, чтобы в будущем собрать железо с многоядерным процессором. Добавил агентов с помощью Агент менеджера. Вроде нормально добавились.

Ничего не вызывает подозрений... Осуществил вход в свой аккаунт MQL.COM. В разделе "Агенты" в кабинете отобразились созданные агенты. В службах, в диспетчере задач также нашёл 2 службы, MetaTester-1 и  MetaTester-2. Но вот уже пол дня никаких заданий агенты не выполняют. Всё по нулям. Почему агенты не работают?

Какой PR агентов у Вас получился? Например 20числа для PR180 задачи были (особенно с утра).