错误、漏洞、问题 - 页 2046

 
Alexey Viktorov:

这种初始化是可能的。因为'a'变量是用一个常数初始化的,而'b'变量是用一个常数表达式初始化的。

这里'b'不是由一个常量表达式初始化的。这就是为什么它与文件中描述的规则相矛盾。

整个问题是,当 一个静态变量被一个函数初始化,初始化被 "暂停",函数被执行在上面的例子中,该函数中有一个静态变量,还没有被初始化。因此,一个被函数初始化的变量会取一个不同的值。

但如何暂停初始化?所有的操作都按照语言语法定义的严格顺序执行。首先,函数被执行,然后这个函数的返回值被传递给我们变量的构造函数--这被称为初始化。但在这种情况下,初始化操作被编译器公然忽略了,代码就像什么都没发生一样继续编译。这是不可以接受的。这就像你,比如说,声明了以下数组一样int a[]= { f(), g(), h() }; 它将被编译,但当然没有初始化任何东西。

 
A100:

在32位终端中,任何OPTIMIZE都会出现错误。

真正的。在MT4中检查,确实有任何方式的错误。以及人们如何在新的建筑上在那里编码一些东西
 
Alexey Navoykov:

这里的'b'是通过NOT一个常量表达式来初始化的。因此,这违反了文件中描述的规则。

如何暂停初始化?所有的操作都是按照语言语法定义的严格顺序进行的。首先,函数被执行,然后这个函数的返回值被传递给我们变量的构造函数--这被称为初始化。但在这种情况下,初始化操作被编译器公然忽略了,代码就像什么都没发生过一样继续编译。这是不可以接受的。这就像你,比如说,声明了以下数组一样int a[]= { f(), g(), h() }; 它将被编译,但当然没有初始化任何东西。

如果不是通过一个常数表达式,那么是通过什么?

Alexey,如果你自己拿着那段代码,在调试器中看一下初始化序列,会更容易。另外,我没有一下子注意到,在这个例子中

关于交易、自动交易系统和策略测试的论坛

虫子、虫子、问题

Alexey Navoykov, 2017.10.17 20:31

而这里有更多关于变量初始化 的话题。如果你按照文档中提到的,那么你也不能引用其他全局/静态变量。因为它不是一个常量表达。

int a= 1;
int b= a+1;  // Согласно документации, такая инициализация не возможна

void OnStart()
{
  Print(b);
}

然而,现在它是有效的。而且我想很多人总是在不知不觉中使用这种构造。但事实证明,开发者随时可能禁用它。而就像函数初始化的情况一样,这些代码仍将成功编译,但它们不会正确工作。因此,整个MQL代码是一个定时炸弹。


它是全局级别的变量,而不是位于任何函数内的静态变量。

我没有足够的知识来解释它,而你也不够细心。

不要混淆静态变量和普通变量的初始化,对于局部变量更是如此。

 
Alexey Viktorov:

如果不是通过一个常数表达,那么通过什么?

一个非恒定的表达式。

另外,我并没有立即注意到 主要的一点是,这个例子谈论的是全局级变量,而不是位于任何函数内的静态变量。

我没有足够的知识来清楚地解释它。 而你没有注意的时间...

你不是在混淆什么吗?

此外,全局变量和静态变量的行为绝对相同。这里是文件

一个全局变量只能由一个常量或与其类型相对应的常量表达式来初始化。

我必须承认,这对我和对静态变量来说都是一个启示。我不知道这一切是什么时候出现在文档中的,也可能是更早的时候,但没有人注意到这一点,因为一切实际上都像在C++中一样工作,所以没有问题出现了。

 
Alexey Navoykov:

一个非恒定的表达式。

你不是在混淆视听吗?

此外,全局变量和静态变量的行为完全相同。下面是文件中的内容。

我必须承认,这对我来说就像对静态变量一样是个启示。我不知道这一切是什么时候出现在文档中的,也许是更早的时候,但没有人注意到它,因为一切都在C++中实际工作,因此没有问题出现。

我认为你是绝对错误的。如果有些变量可以从程序中定义的所有函数中 获得,而其他变量只能在声明它们的函数中 获得,那么你怎么能谈论变量的特性呢?

而静态变量和局部变量的区别在于,静态变量是在全局之后立即初始化的,而普通的局部变量(非静态)是在程序执行 过程中,当代码到达它们时才初始化。

 
Alexey Viktorov:

在我看来,你似乎完全搞错了。如果有些变量可以从程序中定义的所有函数中 访问,而其他变量只能在声明它们的函数中 访问,你怎么能谈论变量是相同的。

你说的是讨论的具体背景(变量初始化),而不是一般性的。

 
通过完全聊天发送消息后,发送的消息不会自动添加到当前页面的聊天历史中。
发送的信息只在重新加载页面后出现。

只看了一眼,发送消息时服务器的响应是足够的,也许js代码中的事件处理程序出了问题。
 
Alexey Navoykov:

这是关于讨论的具体背景(变量初始化),而不是一般性的。

在我的记忆中,这是关于初始化STATIC变量的。

关于交易、自动交易系统和策略测试的论坛

虫子,虫子,问题

Alexey Navoykov, 2017.10.17 17:16

静态变量初始化 的问题。这在旧的构建中是不存在的。

class A
{
 public:
  static int f()
  { 
    static int a=1;
    Print(a);       // Получаем a=0 !!
    return a;  
  }   
};


int a= A::f();


void OnStart()
  {
   
  }

谁不介意,把它送到服务台。我再也不想和他们在那里交流了。


或者这不是你的信息?

已经理清了变量初始化的顺序。在这个例子中,首先初始化了一个全局变量

int a= A::f();

其中调用一个还没有初始化同名变量的函数。

static int a=1;

而如果你不注意编译器的警告,我们还能谈什么呢......


 
Alexey Navoykov:

但我在那里设置了错误的数组维度,也许它在某种程度上影响了它(尽管它根本不应该影响)。

试试这个维度=3的方法

谢谢你的信息。
事实上,这是编译器的优化器错误。
该修复将包括在下一个版本中。
 
Alexey Viktorov:

在我的记忆中,它是关于初始化一个静态变量的。

或者这不是你的信息?

我不明白你想要什么。我说这是关于 "变量初始化"。而在这种情况下,静态变量和全局变量的行为是相同的。我甚至给了你一个文档的链接:变量初始化

请注意,静态变量和全局变量在那里到处都是连在一起的。

而且,我们不批评初始化序列,因为它与手头的问题没有关系。让我提醒你,问题在于编译器不会在它应该产生错误的地方产生错误。如果一个静态变量仍未被初始化,你就不能访问它。

而如果你无视编译器的警告,我们又能谈什么呢......

好吧,改变全局变量的名称,如果它让你那么困扰的话。这不会影响结果。