再见,机器人--你好,沼泽地。 - 页 6

 
pansa:

嗨,维宁!

你检查了指标 AltrTrend_Signal_v2_2.mq4

并发现了一个逻辑错误

公式 SSP=MathCeil (Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1))

你在结尾处强调了1

你认为它应该是什么?

豆瓣酱



可能是0!试试吧!如果是在一个循环中,试试和i 或其他什么东西算。
 
pansa:

嗨,维宁!

你检查了指标 AltrTrend_Signal_v2_2.mq4

并发现了一个逻辑错误

公式 SSP=MathCeil (Kperiod/iADX(NULL,0,PerADX,PRICE_CLOSE,MODE_MAIN,1))

你在结尾处强调了1

你认为它应该是什么?

豆瓣酱



必须转移
 
Andrei01:

根据C语言标准,编辑器对这个标准的、合法的和流行的结构产生了以下警告:"'a'的声明在第4行隐藏了全局声明 "和"'b'的声明在第4行隐藏了全局声明",这也是不正确的,是核心的文盲,因为既没有在函数内声明一个新变量,也没有暗示任何可能的变量重叠。

结果是,即使在一个不是很大的程序代码中,我们也有数百个不相关的警告。

这些信息绝对是100%正确的。

你需要5-10年的积极编程,对你的代码完全负责,才能有人体会到编译器的深度控制的用处。C/C++语言在很大程度上赢得了自拍工具的名声,因为薄弱的编译器不愿意也不能深入分析质量和保护作者。

即使是在2014年的现在,C/C++编译器(被微软彻底摧毁后留在Windows上的编译器)也没有在保护程序员不受伤害的业务。是的,有一个弱的(实际上是无用的),为了一些钱,在Visial Studio中单独运行代码分析,但我们仍然要单独使用PVS Studio(为那些家伙赞美上帝),CPP检查和Lint进行深度错误搜索。

测试这个例子。

  • MQL4/MQL5 - 对潜在的错误给出警告
    declaration of 'a' hides global declaration at line 6   Test.mq4        13      14
    declaration of 'b' hides global declaration at line 6   Test.mq4        13      22
    

  • Visual Studio 2012,包括代码分析--没有。 对潜在错误的分析质量为零。由于很久没有竞争对手了,所以他们也懒得管。

  • PVS工作室 - 报告正确。
    V669 The 'a', 'b' arguments are non-constant references. The analyzer is unable to determine the position at which this argument is being modified.
         It is possible that the function contains an error. test.cpp 17

  • Lint - 报告同样的事情,但'x'隐藏。


我们的任务是制作一个高质量的编译器,它擅长质量控制,不允许C/C++语言的自杀式/疯狂式技术。

 
Renat:

我还认为这些信息完全没有用处。我不是一个专业的程序员,但µl中的这种废话让我感到很紧张。我想知道如果对a和b的引用是恒定的,PVS Studio会不会产生一个警告(自己没有办法检查)?

int a=1,b=2;
//--------------------------------------------------------------------
void start(){        
        int k=sum(a,b);
        Alert(k);
}
//--------------------------------------------------------------------
int sum(const int& a, const int& b){        
        return(a+b);
}
 
Renat:

对这个例子的测试。

  • MQL4/MQL5 - 给出潜在错误的警告

1.你能不能举个例子,说明在这段简单的代码中,编译器所警告的潜在错误到底是什么?

照顾程序员当然是件好事,只要有合理的逻辑解释,不至于变得太碍事。

2.我认为所写代码的质量与编译器的质量及其分析语法的能力无关,而只有当测试环境写得足够好,允许你对所写代码进行深入的功能分析时才会发生。但是,相信对代码进行节省的句法分析而没有测试外壳是乌托邦,是在浪费精力。

这就是为什么专业程序员几乎从不看编译器的警告,根据定义,编译器不能提供代码的功能分析,而即使是新手程序员 也知道语言的语法。

 
Renat:

这些信息绝对是100%正确的。

他们是正确的,但他们并不实际。同样非常重要的是,这种编译器的行为不能被控制。

雷纳特

你需要5-10年的积极编程,对你的代码完全负责,才能有人体会到编译器深度控制的用处。C/C++语言在很大程度上赢得了自拍工具的名声,因为薄弱的编译器不愿意也不能深入分析质量和保护作者。

我想知道究竟为什么这些语言被当作MQL4/MQL4++/MQL5的基础?

毕竟,这首先不是关于编译器,而是关于这些语言的设计。

雷纳特

即使是现在,在2014年,C/C++编译器(被微软彻底摧毁后留在Windows上的编译器)也没有从事保护程序员的工作。是的,有一个弱点(实际上是无用的),为了一些钱,在Visial Studio中单独运行代码分析,但我们仍然要单独使用PVS Studio(为那些家伙赞美上帝),CPP检查和Lint来进行深度的错误查找。

对这个例子的测试。

  • MQL4/MQL5 - 对潜在的错误给出警告

  • Visual Studio 2012,包括代码分析--什么都没有,对潜在错误的分析质量是零。由于长期以来没有竞争对手,他们就不去理会。

  • PVS工作室 - 报告正确

  • Lint - 它产生了同样的东西,所以'x'隐藏...

首先,微软不是万能的,也不是无处不在的。其次,Windows上还有其他编译器。我给你举个例子,虽然我是从Linux下编译的,但这个编译器的Windows和Linux版本在 "深度错误搜索 "部分并无不同。源代码略有修改。

int a=1,b=2;
//--------------------------------------------------------------------
int sum(int& a, int& b){        
        return(a+b);
}
//--------------------------------------------------------------------
int main(){        
        return sum(a,b);
}

编译和编译器信息。

$ icpc -c -Wremarks 1.cpp
1.cpp(3): remark #1418: external function definition with no prior declaration
  int sum(int& a, int& b){        
      ^

1.cpp(3): remark #3280: declaration hides variable "a" (declared at line 1)
  int sum(int& a, int& b){        
               ^

1.cpp(3): remark #3280: declaration hides variable "b" (declared at line 1)
  int sum(int& a, int& b){        
                       ^

你看,在2014年,有一些Windows的编译器有 "深度错误搜索 "服务。

请注意,决定是否使用 "深度搜索 "的权利交给了程序员:同样的代码在更实际的编译中没有"-Wremarks "选项,但在"-Wall "选项中启用了所有警告,编译时没有任何注释。

$ icpc -c -Wall 1.cpp
$ 

此外,该编译器允许人们在个别备注层面控制 "深度搜索",禁用那些程序员认为不必要的备注。

使用的是以下版本的编译器。

$ icpc --version
icpc (ICC) 15.0.0 20140723
Copyright (C) 1985-2014 Intel Corporation.  All rights reserved.

顺便说一下,这个编译器与Visual Studio集成,至少它的早期版本曾经与Visual Studio的早期版本集成。

雷纳特

我们的任务是制作一个高质量的编译器,它擅长质量控制,不允许C/C++语言的自杀式/疯狂式技术。

一个高质量的编译器,首先必须 "有效",也就是说,它必须符合语言的定义,否则它的所有其他功能将失去意义。

#property strict

/******************************************************************************/
class A {
private:
  /******************************************************************************/
  A() { }

  /******************************************************************************/
  void f() { }

public:
  /******************************************************************************/
  static void sf1(A &a) {
    a.f(); // Нет ошибки
  }

  /******************************************************************************/
  static void sf2() {
    A a; // Место "ошибки"

    a.f(); // Нет ошибки
  }
};

/******************************************************************************/
void OnStart() {
}

为什么声明在私有部分的f()方法可以完美地从静态方法中调用,因为它应该这样做,但同样声明在私有部分的类构造函数在定义变量时却 "没有从同一静态方法中调用"?

错误信息。

'A::A' - cannot call private member function

这个编译器错误不允许,例如,以人类的方式实现Myers的单子(这个例子不是上述单子的实现)。而这并不是在访问私有部分中声明的实体方面的最后一个错误。

这恰恰是一个bug,而不是针对例如自杀/不合理技术的一些特性,因为一旦你用动态对象创建取代自动变量定义,构造函数就会突然以最美妙的方式被调用。

  /******************************************************************************/
  static void sf2() {
    A *a = new A;

    a.f();
    delete a;
  }

这段代码的编译已经没有错误。另外,你可以通过插入构造函数代码中的一些信息的打印结果来确保在这种情况下构造函数已经被调用。

只要这种错误仍然存在,谈论高质量的编译器就很奇怪。当涉及到语言实现本身的错误时,C/C++编译器,无论是商业的还是非商业的,都远远优于MQL4++编译器,因为它们中没有这样的废话。好得多,以至于我可以说与它们相比,MQL4++编译器根本 "不起作用"。

在这个阶段,MQL4++编译器唯一真正强大的功能是在程序员没有控制可能失败的函数的返回值时发出警告,例如,交易函数。但是,当编译器的实现质量如此之差时,即使如此强大的编译器功能,其价值也非常有限。

 
Pavlick:

我还认为这些信息完全没有用处。我不是一个专业的程序员,但µl中的这种废话让我感到很紧张。我想知道如果对a和b的引用是恒定的,PVS Studio会不会产生一个警告(自己没有办法检查)?

int a=1,b=2;
//--------------------------------------------------------------------
void start(){        
        int k=sum(a,b);
        Alert(k);
}
//--------------------------------------------------------------------
int sum(const int& a, const int& b){        
        return(a+b);
}
当用-Wremarks选项编译时,Intel C++ 15.0.0编译器对这两种情况产生的注释是一样的。
 
simpleton:

他们是忠实的,但不实际。

那么,如果潜在错误的迹象是正确的,那么就有必要纠正这些错误。
 
Renat:
好吧,如果潜在错误的指向是正确的,那么这些错误就必须被修正。

潜在的错误就是这样,潜在的错误根本不一定就是错误。因此,"这意味着我们必须修正这些错误 "的说法是不正确的,因为它们可能根本就不是错误。

有些情况下,几乎肯定会出现错误,例如,当函数调用 结果未被检查时,可能会失败。对这种情况提出警告既合适又相当有用。关于你无法确定是否有错误的情况的警告,通常既不相关也没有用。当名字被隐瞒时,你不能说几乎肯定有错误。

是的,程序员有可能在 "深度搜索 "的基础上获得各种诊断结果,以确定是否存在潜在的错误,即--无意中产生的错误。但这一定不是主编译器的模式,而且一定可以禁用它。为了保护新手免受此类潜在错误的影响,诊断程序可以在默认情况下启用,即在安装之后。然而,你仍然应该能够将其关闭。

很明显,在一个封闭的作用域中隐藏一个先前在外层作用域中声明的名字的事实,被英特尔编译器检测到的只是标记,而不是警告,原因是:它们可能根本就不是错误。而在其他编译器中,包括非商业编译器,这种隐藏的事实并不对应于任何警告。因为所有编译器用户(即程序员)的集体经验告诉我们,这不应该是一个警告。当然,用户应该能够配置哪些警告/注释将被发出,哪些将不被发出。

顺便说一下,既然MQL是一种独立的语言,必须不遵循C/C++的标准,那么在它里面不允许在封闭的范围内隐藏名字不是更容易吗?

 
1.cpp(3): remark #3280: declaration hides variable "a" (declared at line 1)
  int sum(int& a, int& b){        

这句话毫无意义,原则上没有给程序员提供任何有用的信息,因为最初没有隐藏变量 "a",正如所述。

只有在创建变量的本地拷贝时才会发生隐藏,这也是一种合法的行为。即使因为这种隐藏而在代码中突然出现错误,也可以很容易地找到,正是因为搜索立即找到了相同的名字。如果我们开始改变和改动函数模板中的名称,这是编译器逻辑对这一规则的 "解决方案",那么错误搜索 的情况将变得更加复杂,在理解代码方面的混乱将比比皆是。这似乎很明显。