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

 

关于隐藏变量名称。

simpleton 已经写了关于intel编译器的文章,gcc和clang的情况也差不多。当以非常严格的模式编译时(就消息的存在而言)。

gcc(clang) -Wall -Wextra

编译器并没有抱怨这个问题。关于隐藏的投诉是通过一个单独的选项--Wshadow激活的。也就是说,检查本身在C++编译器上并不困难(除了MSVC)。但我还没有看到任何ide(基于gcc,例如,qt creator,code blocks ...),其中-Wshadow是默认激活的。

为什么?可能是因为对大多数人来说,这个消息的有用性是值得怀疑的。

 
Pavlick:

关于隐藏变量名称。

simpleton 已经写了关于intel编译器的文章,gcc和clang的情况也差不多。当在非常严格的模式下进行编译时(就消息的存在而言)。

你似乎混淆了误导性的 "严格编译器模式 "和静态分析器的实际工作,因为你从未使用过它们。

编译器在1-2分钟内完成编译,而分析器会在同一代码上工作几个小时(PVS Studio)或几十个小时(CPP Check)。因此,这种不同质量和深度的结果。

 

向大家问好。

MQL4的 "疯狂 "和马拉松式的创新已经持续了近一年时间。"但它还在那里!"。(с).

以前他们总是责怪 "元引 "语言不畅,现在则责怪他们 "水分 "过多。这些问题并没有减少。

我可以从我这里补充以下内容。

对于交易者、非程序员和程序员新手 来说,可以实现简单的算法和代码。

如果你有大量的指数、猫头鹰等在新的构建中不能编译,那么仔细观察并 "动摇你的库房 "是有意义的。确保保存最有用的东西,不要抽出时间来为新的构建重写和调试它们。

真正有经验的程序员或那些想成为他们的人,总是遵循创新,错误和故障是他们的面包。写出没有bug的代码才算得上是好的编程。如果你没有精力、时间、可能性或愿望来掌握 "Metakvot "的所有创新,请使用你所精通的语言。DLLs并没有被废除,插入你自己的微调算法。

 
Andrei01:

测试环境在软件产品中被广泛用于软件芯片设计的功能验证,其中对代码质量的要求非常高。此外,功能外壳是任何芯片设计代码开发的一个组成部分。另一方面,许多程序员在编写通常的软件项目时甚至不知道这些功能测试,这是因为从头开始编写这些测试可能比编写项目本身花费更多的时间,只有在要求编写高质量的代码或同一项目有许多版本时才有理由。另一方面,一个熟练的测试环境可以大大节省调试和代码验证的时间。

静态分析也被使用,但只是作为一种非常肤浅和初步的语法检查。

测试环境就是测试环境。一个测试环境被 "限制 "在它所测试的产品中。

我指的是通用工具--那些对被分析的产品 "一无所知 "的工具,因此可以分析和发现任何产品的问题。

 
Renat:

憨厚的人,真是一派胡言。

"什么乱七八糟的 "似乎意味着态度完全不匹配。

Renat:

当你达到全面质量控制的水平时,你才会理解它。但与此同时,只要你还停留在单个自私的程序员的认知水平上,你就会继续认为 "不控制我是合理的,让控制将由单独的永不运行的实用程序来进行"。

那么,为什么 "全面质量控制 "允许如此低水平的质量控制?

比如说。

#property strict

/******************************************************************************/
class A {
private:
  A() { Print("A::A()"); }

public:
  static void method1() {
    //A a; // 'A::A' - cannot call private member function      3.mq4   10      7
  }

  static void method2() {
    A *a = new A; // А здесь private member function великолепно вызывается
    delete a;
  }
};

/******************************************************************************/
void OnStart() {
  A::method1();
  A::method2();
}

当方法2中创建一个对象 时,构造函数被调用。

00:50:23 Script 3 EURUSDm,M5: loaded successfully
00:50:23 3 EURUSDm,M5: initialized
00:50:23 3 EURUSDm,M5: A::A()
00:50:23 3 EURUSDm,M5: uninit reason 0
00:50:23 Script 3 EURUSDm,M5: removed

为什么当一个对象被动态创建时一切正常,即私有构造函数可以从对象方法中获得,但当对象被自动创建时,私有构造函数突然不可用?

我个人放弃了在MQL中做任何比简单更复杂的事情,因为这对我来说非常困难:我总是会碰到一些不工作的事情。

但我对C/C++编译器没有这样的问题。

而 "不控制我是合理的,让控制是分开的千万别跑水电 "的问题与心理学直接相关。这里需要纠正心理学,以便程序员能够强迫自己,而不是试图根据心理学调整技术,以规避这种心理学。

我没有编造,有些实用程序在我面前经常成功使用,他们工作的结果也在后来成功用于消除错误。

Renat:

漏洞正在被消除,但同时我们也在增加和改进很多东西。

也许优先事项转向了增加和改进,而牺牲了质量。但这样就不再是对它的完全控制了。

Renat:

周五将发布MT4,在执行速度和测试方面有明显改进。

在这种情况下,我指的是对象方法中的私有构造函数的可用性,不仅仅是针对动态对象创建的情况--在语言的可操作性方面会有任何改进吗?

Renat:

与C++不同,由于拒绝原始链接,MQL是绝对安全的(如果没有输出到dll),而且一般来说--它是一种托管语言。

好吧,让我们假设 "C++是危险和自杀的",而 "MQL是绝对安全的"。

为什么会把一种与自己想要的安全标准相去甚远的语言作为MQL的基础,也就是说,完全根据 "危险和自杀 "的语言来创造一种 "绝对安全 "的语言?

 
Pavlick:

好吗?


嗨,Pavlik!

又是我,潘萨!

我一直在测试你的代码,在不同的mt4上调用脚本。

我发现了一些奇怪的事情!

你的代码在MT4 build 670上运行良好 by Pepperston

(澳大利亚),但它不希望在MT4 build 670 Alpari上工作!

user32.dll在alpari上的调用奇怪!

前2个dlls被调用(尽管这不在代码中!)。

然后调用user32.dll但它被扔到了一个库中

但你也需要从库中调用它!

看来Alpari正在为这个电话而奋斗。

即有一个明显的代码干扰!

我附上2张图片供大家比较!

我祝愿成功!

潘萨

画面太美了!

MT4-Pepperstone-user32.dll

MT4-Alpari-KERNEL32.dll,GDI.dll,E:\metaQuotes\Terminal\F................OBO\MQL4\Libraries\user32.dll

















 
simpleton:

"一派胡言"--这显然意味着立场完全不匹配。

这意味着有人在指导向竞争性市场发布多种软件产品方面明知更有经验。


为什么 "全面质量控制 "允许如此低水平的质量控制?

没有必要从对一般质量控制原则的讨论转向对特定解决方案的具体缺点的讨论。这样的方法是不可接受的,因为在任何产品中总是有可能找到任何缺陷。

比如说。

当方法2中创建一个对象时,构造函数被调用。

为什么在动态创建对象时一切正常,即从对象方法中可以获得私有-构造函数,但在自动创建对象时,私有-构造函数突然不可用?

这只是过度保护的结果,"静态方法 无权进入类内容"。不过,在这种情况下,访问控制需要松动。

我个人已经放弃了在MQL中做任何比简单略微复杂的事情,因为这对我来说非常困难:我总是会碰到一些不工作的事情。

给我一个可行的例子,而不是 "我故意扭曲事情,关闭访问,然后开始呼吁边缘行为 "的情况。


不过,我对C/C++编译器没有这样的问题。

那里的问题是另一种类型。而且,如果考虑到你不使用静态分析器,它们会明知故犯地大上几个数量级。


而 "不控制我是合理的,让控制是分开的千万别跑水电 "的问题与心理学直接相关。这里需要纠正心理学,以便程序员能够强迫自己,而不是试图根据心理学调整技术,以规避这种心理学。

这不是我编的,个别实用程序在我眼前经常被成功使用,他们工作的结果也在事后被成功用于消除错误。

也许优先事项转向了增加和改进,而牺牲了质量。但这样就不再是对它的完全控制了。

这已经只是一个文字游戏。你的立场在前面已经清楚地概述了 "我不能被控制",所以是的,"在某人面前,某个地方是在使用,但没有人拿着棍子站在我身上,我没有使用"。


在语言可操作性方面的改进--在这种情况下,我指的是对象方法中的私有构造函数的可用性,而不仅仅是在动态对象创建的情况下--它是否已经有了?

而你喜欢在你的 "简单 "程序中故意制造绊脚石:"我把构造函数隐藏在私有中,创建一个静态方法,然后用它来凿开隐藏的构造函数"?


好吧,让我们假设 "C++是危险和自杀的",而 "MQL是绝对安全的"。

为什么要把离安全标准这么远的语言作为MQL的基础,也就是说,在非常 "危险和自杀 "的基础上创造 "绝对安全 "的语言?

你是否能够为通用语言提出一个 "不同的基础"?

这样,其他每一个程序员都可以得到这种语言,并在几个小时后开始愉快地用它写作,而不是在厌恶和责骂中扔掉它?交易员们看了看易语言,就把它扔掉了,而MQL4/MQL5却被愉快地使用和开发。

大多数常用的语言都是以C/C++中的结构体的基本原则为基础。因此,我们采取了众所周知的框架,删除了最危险的东西与链接,添加了DRM,并得到了一个安全的安全语言。

结果是,我们在上升,而竞争者在错误的、但更便宜的方向上前进,正如他们所想的那样。

 
Renat:
这意味着有人在竞争激烈的市场中管理大量软件产品的发布方面有更多经验。

顺便说一下,关于管理经验。5年前,我们在mql5论坛上为MT5的前景争论不休,我当时说时间会证明一切。五年过去了,我们看到社区已经拒绝了MT5。管理经验并不能保证不犯错误。即使一个人在某个领域有经验,也会犯错误。关于竞争性市场的问题,或者说竞争者,在最后。

然而,在这种情况下,这不是许多软件产品的经验问题,而是产品的质量问题,特别是编译器和实现高质量的工具和方法。

雷纳特
我们不应该把讨论从一般的质量控制原则转移到某个特定解决方案的具体缺陷上。你不能这样做,因为你总是有可能发现每个产品的每一个缺陷。


这只是 "静态类方法无权进入类内容 "的过度保护的结果。尽管在这种情况下,我们需要放宽访问控制。

我不是在翻译,一般原则,理论--不是为了理论本身,而是为了在实践中应用。你不会在同样的C/C++编译器中发现如此严重的 "缺陷"。

如果你说在这种情况下,"静态类方法没有权利进入类的内容",那么为什么在动态对象创建的情况下,它已经有了这种权利?

非静态方法的行为方式完全相同,那怎么办?

#property strict

/******************************************************************************/
class A {
private:
  A() { Print("A::A()"); }
  ~A() { Print("A::~A()"); }

public:
  void method() { // Метод - обычный, никакой не статический
    A a;
  }

};

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

同样的错误。

'3.mq4' 3.mq4   1       1
'A::~A' - cannot call private member function   3.mq4   11      7
'A::A' - cannot call private member function    3.mq4   11      7
2 error(s), 0 warning(s)                3       1

好吧,让我们考虑禁止 "爬到班上的内容"。

#property strict

/******************************************************************************/
class A {
private:
  A() { Print("A::A()"); }
  ~A() { Print("A::~A()"); }
  A(const A &a) { Print("A::A(const A &)"); }
  void operator =(const A &a) { Print("A::operator =()"); }
  void f() { Print("A::f()"); }

public:
  static void assign(A &l, const A &r) {
    l = r;
  }

  static void method() {
    A *p = new A, b(p);

    b = p;
    b.f();
    delete p;
  }

};

对象b是通过调用复制构造函数创建的,然后通过调用 "运算符="进行赋值,调用方法f(),所有这些构造函数、运算符和方法都是私有的,这意味着静态方法method()被允许 "抚摸类"。

00:59:18 Script 3 EURUSDm,M5: loaded successfully
00:59:18 3 EURUSDm,M5: initialized
00:59:18 3 EURUSDm,M5: A::A()
00:59:18 3 EURUSDm,M5: A::A(const A &)
00:59:18 3 EURUSDm,M5: A::operator =()
00:59:18 3 EURUSDm,M5: A::f()
00:59:18 3 EURUSDm,M5: A::~A()
00:59:18 3 EURUSDm,M5: A::~A()
00:59:18 3 EURUSDm,M5: uninit reason 0
00:59:18 Script 3 EURUSDm,M5: removed

让我们看一下另一个例子,与第一个例子非常接近。

#property strict

/******************************************************************************/
class A {
private:
  A(int i = 0) { Print("A::A(int i = ", i, ")"); }
  ~A() { Print("A::~A()"); }
public:

  static void method() {
    A a;
  }
};

/******************************************************************************/
void OnStart() {
  A::method();
}

编译错误,--构造函数和析构函数都不可用。

'3.mq4' 3.mq4   1       1
'A::~A' - cannot call private member function   3.mq4   11      7
'A::A' - cannot call private member function    3.mq4   11      7
2 error(s), 0 warning(s)                3       1

现在,在不改变任何东西的情况下,用一个不同于构造函数中默认值的值来初始化a变量。

#property strict

/******************************************************************************/
class A {
private:
  A(int i = 0) { Print("A::A(int i = ", i, ")"); }
  ~A() { Print("A::~A()"); }
public:

  static void method() {
    A a(1);
  }
};

/******************************************************************************/
void OnStart() {
  A::method();
}

现在,这个例子已经编译并执行了。

00:20:35 Script 3 EURUSDm,M5: loaded successfully
00:20:35 3 EURUSDm,M5: initialized
00:20:35 3 EURUSDm,M5: A::A(int i = 1)
00:20:35 3 EURUSDm,M5: A::~A()
00:20:35 3 EURUSDm,M5: uninit reason 0
00:20:35 Script 3 EURUSDm,M5: removed

一个静态方法怎么会突然被允许 "进入类的内容"?

很明显,在这种情况下,这不是一个 "过度保护",而是一个微不足道的错误。全面质量控制是一个相当响亮的说法,但事实是顽固的东西。

雷纳特
给出一个可行的例子,而不是 "我故意把事情扭曲成那样,关闭访问,然后开始呼吁边界行为 "的情况。

拜托,一个经典的单子,即链接中C++例子部分描述的Myers单子。

class OnlyOne
{
public:
        static const OnlyOne& Instance()
        {
                static OnlyOne theSingleInstance;
                return theSingleInstance;
        }
private:        
        OnlyOne(){};
        OnlyOne(const OnlyOne& root);
        OnlyOne& operator=(const OnlyOne&);
};

它甚至可以通过新开放的功能翻译成MQL4++。

#property strict

/******************************************************************************/
class OnlyOne
{
public:
        static OnlyOne *Instance()
        {
                static OnlyOne theSingleInstance(1);
                return GetPointer(theSingleInstance);
        }
private:        
        OnlyOne(int i = 0) { Print("Создан"); };
        ~OnlyOne() { Print("Уничтожен"); };
        OnlyOne(const OnlyOne &);
        void operator=(const OnlyOne &);
};

/******************************************************************************/
void OnStart() {
  OnlyOne *p = OnlyOne::Instance();
}

它编译和执行。

01:31:49 Script 3 EURUSDm,M5: loaded successfully
01:31:49 3 EURUSDm,M5: Создан
01:31:49 3 EURUSDm,M5: initialized
01:31:49 3 EURUSDm,M5: uninit reason 0
01:31:49 3 EURUSDm,M5: Уничтожен
01:31:49 Script 3 EURUSDm,M5: removed

除了调用OnlyOne::Instance()之外,试图以任何其他方式创建一个对象将导致一个编译错误。

而关于 "我故意扭曲事情,关闭通道,然后开始呼吁边界行为 "的问题--有什么东西被不当使用吗?

语言中有一些机制--我有权在语言所允许的范围内随意使用它。至少C++编译器是这样的。

如果在语言实现中存在错误,那么,是的,错误。你说的是全面质量控制--所以在实践中摆脱MQL4++编译器中的执行错误,这样错误几乎和C++编译器中一样难以发现,因为你有这样的控制。我仍然认为,分析器不会帮助摆脱像我所展示的那些错误。

雷纳特
你是否喜欢在你的 "简单 "程序中刻意加入一些脚步声,"将构造函数隐藏在私有部分,创建静态方法,然后从中凿入隐藏的构造函数"?

这与我喜欢或不喜欢什么无关。有一个工具。我为什么要拒绝使用它的所有功能?

在这种情况下,甚至不是 "我喜欢它"。就这一点而言,是迈尔斯如此喜欢它。而且,不知为何没有人试图指责他试图 "故意绊倒 "C++编译器。

雷纳特
你能为通用语言想出一个 "不同的框架 "吗?

这样,其他每一个程序员都可以得到一种语言,并在几个小时后开始愉快地用它写作,而不是带着厌恶和责备扔掉它?交易员们看了看易语言就把它扔掉了,而MQL4/MQL5却被愉快地使用和发展。

大多数广泛使用的语言都是以C/C++的基本结构原理为基础的。因此,我们采用了一个熟悉的框架,用引用的方式去掉了最危险的东西,增加了DRM,得到了一个安全可靠的语言。

结果是,我们站在了顶峰,而我们的竞争对手却朝着错误的方向发展,但却更便宜,正如他们所想。

这不是一件容易的事,不可能一蹴而就地解决。你需要在这里投入一些努力,而且是大量的努力。绝大多数的MQL用户都不是程序员。在语言设计中必须考虑到这一点。但这个任务是可以解决的,我相信。

如果有的话,只要在旧的MQL4中增加一些结构,并清理一些东西,如操作的优先级,就足够了,因为这是为MQL4++所做的,这将是一个合理的妥协。MT4的成功在很大程度上是由于语言的不 "聪明"。现在的情况并非如此。而且在编译器实现方面的错误要多得多,因为MQL4++要比旧的MQL4复杂得多,而且开发团队几乎没有什么变化。

雷纳特
因此,我们正处于上升阶段,而我们的竞争对手却朝着错误的方向发展,但却更便宜,因为他们相信。

这里我同意你的观点,但我认为这主要是因为竞争对手在做不可理喻的事情。

 
Renat:
这意味着有人在指导许多软件产品发布到竞争性市场方面明知故犯,更有经验。


我们不需要把话题从讨论一般的质量控制原则转移到讨论某个特定解决方案的具体缺陷上。这样的方法是不可接受的,因为在任何产品中总是有可能找到任何缺陷。

这只是过度保护的结果,"一个静态类方法无权进入类的内容"。尽管在这种情况下,你需要放宽访问控制。

给我们一个工作实例,而不是 "我故意扭曲一切,锁定访问,然后开始呼吁边界行为 "的情况。


那里的问题是另一种类型。而且,如果考虑到你不使用静态分析器,它们会明知故犯地大上几个数量级。


这已经只是文字游戏了。你的立场在前面已经清楚地概述了 "我不能被控制",所以是的,"在某人面前,在某个地方使用,但没有人拿着棍子站在我身上,我没有使用"。


你是否喜欢在你的 "简单 "程序中刻意加入一些脚步,"将构造函数隐藏在私有的地方,创建静态方法,然后从中凿入隐藏的构造函数"?


你能为commonplan语言想出一个 "不同的基础 "吗?

这样,其他每个程序员都可以得到一种语言,并在几个小时后开始愉快地用它写作,而不是在厌恶和责骂中扔掉它?交易员们看了看易语言就把它扔掉了,而MQL4/MQL5却被愉快地使用和发展。

大多数广泛使用的语言都是基于C/C++那样的基本构造原则。因此,我们采用了众所周知的框架,删除了带有链接的最危险的东西,增加了DRM,并得到了一个安全的安全语言。

结果是,我们站在了顶峰,而我们的竞争对手却朝着错误的方向发展,但却更便宜,正如他们所想。

 

论坛的成员们,你们好!

我想利用Renate 在这条线上的优势

我想为改进MT4提出一些建议

大家都知道,随着时间的推移,MT4的效果越来越 差。

那么它就不听话了--完了!

我们需要转移到一个新的MT4并删除

所有的东西(指标,专家)!

这是一个为期一天的工作!

虽然现在有DLL、Drever和其他的修复程序...

为什么不为MT4制作一个编译器?

你必须有两个МТ4(一个是有效的,另一个是工作的)。

并定期比较,纠正工作中的MT4错误。

第二个建议是,不仅要建立价格图表,还要建立

生产价格乘以数量的增长图!

这样你就可以立即看到正在发生的事情(真正的交易或兑现)。

(c)

我认为对于理解能力强的人来说,这很容易!

潘萨