错误、漏洞、问题 - 页 1576

 

我想知道用什么原则来把产品放在这个横幅上

以及授权卖家的产品是否去那里?我的意思是,我可以在这个横幅上看到我的产品吗? 我已经翻了30页,还没有看到我的产品...

 
Renat Fatkhullin:

我不干涉。我有26年的不间断编程经验。

如果我们谈论的是金融部门,警告基本上是错误的。而所有数以千计的关于 "失去标志、失去准确性、失去鬼魂等 "的报告是对代码质量的判决。显然,你不太明白其中的含义。

请以足够完整的形式提供编译器指出的错误的那段代码。

没有它,这一切的讨论就显得不好看,不公平。

好吧,Renat,这些关于 "代码质量 "的争论与讨论的主题无关。 因为我们在这里只讨论可编译性,即代码的可操作性。以及准确性的损失等等。- 这是程序员的个人问题,所以说是他/她的责任。隐性转换,例如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]);
}

这是我在日志中得到的。

'C类'--没有类型的声明 TestScript.mq5 16 9

在以前的版本中,一切都很正常。

 
Alexey Navoykov:

好吧,Renat,这些关于 "代码质量 "的争论与讨论的主题无关。 因为我们在这里只讨论可编译性,即代码的可操作性。以及准确性的损失等等。- 这是程序员的个人问题,所以说是他/她的责任。隐性转换,例如int到short,并没有被语言标准所禁止,对吗? 那么,为什么我们现在要宣扬?

2600个有潜在问题的地方,甚至在财务方面--这不是道德,而正是代码质量的指标。


好了,我已经发现了其中的一个错误。

这是我在日志中得到的。

在以前的版本中,一切都很正常。

是的,这个错误已经被讨论过了(可能是和A100一起),并在5月4日被修复。显然,在类型控制方面做得过头了。

我附上最新的MetaEditor build 1329,它没有这个错误。请在那里查看。

MT5的发布时间是5月12日。

附加的文件:
 
Alexey Navoykov:

在以前的版本中,它是好的。

在你的代码中,你没有返回一个私有对象的常量指针。事实证明,第三方(就变量可见性而言)函数可以改变看似不应该在架构上被他们访问的东西,因为程序员已经指定了私有。

每当我想返回一个指向私有对象的指针时,我必须指定一个const修改器。在你的情况下,我将设置一个经纬度。

我不是一个高空飞人,所以我在问。你必须在某个地方使用这个代码,还是只是懒得去设置const?

 
A100:

两天的时间几乎都浪费了(在我这个年龄已经很多了),我本来打算用一个稍微不同的方式来使用它们。

你引用了一百多个错误。每一次都是如此疯狂地花费你的时间?你从哪里得到对开发商如此慷慨的支持?
阿列克谢-纳沃伊科夫

所以,我再次向A100的耐心表示敬意。 我自己也厌倦了,对我来说,坐在工作正常的旧版本上比在新版本中寻找错误的原因更容易,在服务台工作。 或者有人会为这项工作支付我?

是的,对于第三方测试人员来说,serviced是一件很酷的事情,可以免费做。显然,它不是为此而生的,但事实上,它恰恰成了免费工作的第三方测试人员的雇主。如果不是因为这些错误报告,编译器的编译时间会更长。

每个人都会争论说,发现一个错误应该有报应,这是世界上的惯例。A100应该得到国家测试员的工资。而且似乎是一年的测试员的工资。

 
Renat Fatkhullin:

是的,这个错误已经被讨论过了(也许是和A100一起),并且早在5月4日就被修复了。显然,他们对类型的控制已经过度了。

我附上了最新的MetaEditor build 1329,它不包含这个错误。请在那里查看。

MT5的发布将在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函数中的任何地方(例如,在返回后)添加一行。

work.Set(arr[0])。

它可以正常编译。

程序员似乎在优化方面走得太远了。

而且在运行过程中也有一些小毛病。例如,我给一个结构的 某些成员 赋值,但后来发现那里的值是旧的,也就是说没有赋值。 如果我在它附近添加一行任意操作,一切都会变得正常。 这些错误是从你优化编译器的那个秋季构建开始的。 总而言之,一切都还是原始的。

此外,编译本身仍然需要20秒,而build 1159只需要1-2秒。 同时,我没有注意到我的程序有任何明显的加速,收益在10-20%之内。所以你可以忘记那些关于2-10倍速度的故事。也许这发生在特别选择的测试样本上,但我们有真实的应用,而不是假的。

为了更高的性能,总的来说编译速度慢了10-20倍。 我认为,这不值得,程序员损失的时间更有价值。

我仍然被迫停留在1159构建上。

 
Anton Zverev:

在你的代码中,你没有返回一个私有对象的常量指针。事实证明,第三方(就变量可见性而言)函数可以改变看似不应该在架构上被他们访问的东西,因为程序员已经指定了私有。

每当我想返回一个指向私有对象的指针时,我必须指定一个const修改器。在你的情况下,我会给它加上一个翘板。

我不是一个高空飞人,所以我在问。你必须在某个地方使用这个代码,还是只是懒得去设置const?

我只是把一个数组隐藏在私有的地方,而C类对象本身是可以被用户完全访问的,这就是目的。 如果我只需要它用于阅读,我会把const放进去。

 
Anton Zverev:
所有的人都会支持,发现错误就应该有报应,这是世界上的惯例。A100应该得到一个国家测试员的工资。而且似乎是一年的测试员的工资。
我支持这一点,但我担心这将仅限于一块牌子和一封表扬信 :)
 

我不知道这是不是一个错误,或者只是对CDealInfoPositionId()和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中,我只隐藏了数组。 而C类对象本身是可以被用户完全访问的,这就是目的。 如果只是需要阅读,我会把const放进去。

我明白了,你能告诉我这在哪些结构中可能是有用的吗?我知道,用这种方法,你不能对数组本身做任何事情(调整大小,交换元素,等等)。然而,删除,可以应用于...

我假设你在某个地方用模板来做,这样[]运算符的语法对不同的对象类型 是一样的。一般来说,你能不能在方便的时候展示一下这个结构的使用。