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

 

интересно по какому принципу попадают продукты в данный банер 

 

и попадают ли туда продукты авторизованного продавцы? То есть могу ли я в этом баннере увидеть свой продукт ? пролистал 30 страниц своих так и не увидел ...

 
Renat Fatkhullin:

Я не мешаю. За плечами 26 лет безостановочного программирования.

Предупреждения - это по сути ошибки, если мы говорим о финансовом секторе. И все тысячи сообщений о "потере знака, потере точности, потере на приведениях и тд" являются приговором качеству кода. Видимо, вы не вполне понимаете последствия.

Предоставьте в достаточно полном виде тот кусок кода, на который компилятор указал как ошибку, пожалуйста.

Без этого все обсуждение выглядит неприглядно и не честно.

Ладно, Ренат, эти споры о "качестве кода" не относится к теме обсуждения.  Ибо мы здесь говорим лишь о компилируемости, т.е. работоспособности кода.   А потеря точности и т.д. - это уже личное дело программиста, так сказать под его ответственность.   Ведь неявное приведение например int к short не запрещено стандартом языка, правильно?   Так к чему эти нравоучения сейчас? 

ОК, я таки отыскал один из этих багов:

class CClass
{

};


class CArr
{
  CClass* data[];
 public: 
  CClass* operator[] (int i)  { return data[i]; }
};


template<typename T>
void Func (T* obj)      {  }
 

void OnStart()
{  
  CArr arr;
  Func(arr[0]);
}

на что получаю в логе:

'CClass' - declaration without type TestScript.mq5 16 9
'CClass' - comma expected TestScript.mq5 16 9

В прежних билдах всё нормально было.

 
Alexey Navoykov:

Ладно, Ренат, эти споры о "качестве кода" не относится к теме обсуждения.  Ибо мы здесь говорим лишь о компилируемости, т.е. работоспособности кода.   А потеря точности и т.д. - это уже личное дело программиста, так сказать под его ответственность.   Ведь неявное приведение например int к short не запрещено стандартом языка, правильно?   Так к чему эти нравоучения сейчас? 

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


ОК, я таки отыскал один из этих багов:

на что получаю в логе:

В прежних билдах всё нормально было.

Да, эту ошибку уже обсуждали (возможно, с A100) и исправили еще 4 мая. Перестарались с контролем типов, по всей видимости.

Я приложил последний MetaEditor билд 1329, в котором уже нет этой ошибки. Проверьте на нем, пожалуйста.

Релиз МТ5 выйдет 12 мая.

Файлы:
 
Alexey Navoykov:

В прежних билдах всё нормально было.

В Вашем коде Вы возвращаете не const-указатель на private-объект. Получается, что сторонние (с точки зрения видимости переменных) функции могут менять казалось бы то, что не должно быть им доступно архитектурно, раз уж программист указал private.

Сам при желании возвратить указатель на private-объект, обязательно указываю const-модификатор. В Вашем случае повесил бы варнинг.

Не высокого полета птица, поэтому спрашиваю. Вы такой код где-то вынуждены использовать или это просто лень поставить const?

 
A100:

Два дня потратил практически целиком (в моем возрасте это уже много) при том, что планировал ими распорядиться несколько по иному 

Вы привели больше сотни багов. Каждый раз такое дикое количество своего времени тратили?! Откуда такая щедрость к разработчикам?
Alexey Navoykov:

Поэтому, повторюсь, я снимаю шляпу перед A100 за его терпение.  А сам я уже устал от этого, мне проще сидеть на старом билде, в котором всё нормально работает, чем выискивать причины багов в новом билде, работая на сервис-деск.  Или мне кто-то заплатит за эту работу?

Да, сервисдеск - крутая вещь для бесплатной работы сторонних тестеров. Очевидно, что делалось это не для этого, но, по факту, стал именно работодателем для сторонних тестеров, работающих бесплатно. Если бы не эти сообщения о багах, компилятор допиливлся бы на порядок дольше.

Все поддержат, что за найденный баг должно быть вознакраждение, как это практикуют в мире. A100 должен получить зарплату тестера по штату. И, похоже, годовую зарплату тестера. 

 
Renat Fatkhullin:
 

Да, эту ошибку уже обсуждали (возможно, с A100) и исправили еще 4 мая. Перестарались с контролем типов, по всей видимости.

Я приложил последний MetaEditor билд 1329, в котором уже нет этой ошибки. Проверьте на нем, пожалуйста.

Релиз МТ5 выйдет 12 мая.

Проверил. Ошибок компиляции теперь практически нет, за исключением некоторых странных чудес, которые мне не удаётся воиспроизвести отдельно от программы, однако удаётся обойти каким-то случайным образом.

Ниже привожу примерный код проблемного участка.  Повторюсь, отдельно он компилируется нормально, а в составе моей программы выдаёт ошибку. 

class CBase
{
};


class CClass : public CBase
{
};

 

class CWork
{
 public:
 
  template<typename T>
  void Run(T& arr[])
  {
    struct Struct
    {
      template<typename T1> static void Set(T1& main,  T& arr[], CBase& obj)   { main.Set(arr); } 
    };
    
    Struct structobj;
    
    structobj.Set(this, arr, arr[0]);
  }

  
  template<typename T>
  void Set(T& arr[]) 
  {  
    for (int i=0; i<ArraySize(arr); i++) Set(arr[i]);  // Здесь возникает ошибка: 'arr' - parameter conversion not allowed
  }
  
  template<typename T>
  void Set(T& obj)    { } 
  
  template<typename T>
  void Set(T*& obj)    { } 

};
 
 

void Main()
{
  CWork work;
  CClass arr[];
  work.Run(arr);

  return;
}

Если же в функции Main в любом месте (например после return)  добавить строку: 

work.Set(arr[0]);

то компилируется нормально.  

Видно что-то перемудрили с оптимизацией. 

А также возникают кое-какие глюки уже в рантайме. Например какому-то члену структуры присваиваю значение, но потом обнаруживается что значение там старое, т.е. ничего не присвоилось.  Если же добавляю там рядом строчку с какой-то произвольной операцией, то всё становится нормально.  Эти баги начались ещё с того осеннего билда, когда вы сделали оптимизацию компилятора.  В общем, сыровато всё.

Кроме того, сама компиляция по прежнему занимает 20 секунд, в то время как на билде 1159 было лишь около 1-2 секунд.  При этом существенного ускорения работы моих программ не наблюдаю, выигрыш в пределах  10-20%.  Так что байки про ускорение в 2-10 раз можно забыть. Может на специально подобранных тестовых образцах такое и случается, но у нас то реальные программы, а не муляжи.

Итого, 10-20-кратное замедление компиляции ради небольшого увеличения производительности.  Имхо, не стоит того.  Потерянное время программиста гораздо ценнее.

Вынужден по-прежнему оставаться на 1159 билде.

 
Anton Zverev:

В Вашем коде Вы возвращаете не const-указатель на private-объект. Получается, что сторонние (с точки зрения видимости переменных) функции могут менять казалось бы то, что не должно быть им доступно архитектурно, раз уж программист указал private.

Сам при желании возвратить указатель на private-объект, обязательно указываю const-модификатор. В Вашем случае повесил бы варнинг.

Не высокого полета птица, поэтому спрашиваю. Вы такой код где-то вынуждены использовать или это просто лень поставить const?

В private я скрываю лишь массив.  А сами объекты CClass доступны пользователю для полного доступа, в этом и цель.  Если бы нужно было только для чтения, то я бы поставил const.

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

не знаю баг это или просто не правильное описание методов класса CDealInfo PositionId() и Ticket(). Написал такой код

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

 результат

NM      0       14:06:49.083    test_01 (EURUSD,H1)     ResultDeal() = 69380150
QE      0       14:06:49.083    test_01 (EURUSD,H1)     deal.PositionId() = 0

 

добавил запрос истории сделок с помощью функции  HistorySelect(), методы класса заработали.

//+------------------------------------------------------------------+
//|                                                      test_01.mq5 |
//|                                                   Sergey Gritsay |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link      "https://www.mql5.com"
#property version   "1.00"
#include <Trade\Trade.mqh>
//#include <Trade\DealInfo.mqh>
CTrade trade;
CDealInfo deal;
ulong  ticket_deal;      // тикет сделки
ulong  ticket_position;     // тикет позиции
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   trade.Buy(0.1,_Symbol);
   ticket_deal=trade.ResultDeal();
   HistorySelect(0,TimeCurrent());
   deal.Ticket(ticket_deal);
   ticket_position=deal.PositionId();

   Print("ResultDeal() = ",ticket_deal);
   Print("deal.PositionId() = ",ticket_position);
  }
//+------------------------------------------------------------------+

результат 

JM      0       14:16:33.055    test_01 (EURUSD,H1)     ResultDeal() = 69381116
EF      0       14:16:33.055    test_01 (EURUSD,H1)     deal.PositionId() = 83654708
 
Alexey Navoykov:

В private я скрываю лишь массив.  А сами объекты CClass доступны пользователю для полного доступа, в этом и цель.  Если бы нужно было только для чтения, то я бы поставил const.

Ясно. Подскажите, в каких конструкциях это может пригодиться? Понимаю, что при таком подходе нельзя ничего сделать с самим массивом (изменить размер, поменять местами элементы и т.д.). delete, правда, можно применить...

Предполагаю, что Вы это делаете где-то с шаблоном, чтобы для разных типов объектов был одинаковый синтаксис оператора []. В общем, могли бы Вы показать использование данной конструкции, когда это удобно. 

Причина обращения: