错误、漏洞、问题 - 页 2724

 
Slava :

不,如果你想让其他人能够读到修改过的文件,必须进行FileFlush。

问题是,MQL5程序在打开文件时将其读入自己的缓冲区。而且,在再次读取文件之前,它不知道文件中有任何变化。只有通过关闭然后再打开该文件才能再次读取该文件

荣耀,这正是问题所在。请看我上面发布的链接,你会找到重现它的代码。

同一个文件从同一个EA打开,1个描述符用来写,2个描述符用来读,写完后使用了fileflush,试着读,它不能正常工作。

当然,如果你关闭/打开,它也能工作,但那时就没有必要使用FileFlush了

 
Alain Verleyen:

荣耀,这正是问题所在。请看一下我在上面发布的链接,你会找到重现它的代码。

同一个文件从同一个顾问那里打开,1个描述符用于写,第2个用于读,写完后使用了fileflush,试着读,它不能正确工作。

当然,如果你关闭/打开,它也能工作,但那时就没有必要使用FileFlush

我理解你描述的问题。

第1个EA写了文件。它可能不会关闭该文件,但在这种情况下,它应该调用FileFlush

第2个专家顾问读取该文件。它应该每次都打开文件,然后关闭它。

仅为第二个EA打开和关闭文件!

 
Slava:

这正是我所说的。关闭,然后重新打开

或者你是指在关闭文件之前的FileFlush?

是的,是否有必要在关闭前进行冲洗?还是关闭它可以保证记录文件的相关性。

 
Andrey Barinov :

是的,是否有必要在关闭前进行冲洗?或关闭确保记录的文件是最新的。

如果你事后立即关闭,冲洗是没有用的。
 
Slava :

我理解你描述的问题。

第1个EA写了文件。它可能不会关闭文件,但在这种情况下它应该调用FileFlush

第2个专家顾问读取该文件。它每次都要打开文件,然后关闭它。

打开和关闭文件只针对第二个EA!

我明白这是一个变通办法。

但最好是纠正错误,这不可能轻易做到,我想?

 
Andrey Barinov:

是的,是否有必要在关闭前进行冲洗?或关闭确保记录的文件是最新的。

不一定。如果在关闭之前没有调用FileFlush,缓冲区会自动重置。

 

Bug MT5(build 2390)在类结构 描述中错误地计算了大括号。

class A{};
class B : public A};  // Ok

class C : public A   

void OnStart()
{
   A a;
}                      // Compile Error: '}' - unexpected end of program        
 
Slava:

读取文件的专家顾问 必须保持这个文件的关闭。

MQL5中文件实现的特殊性在于,它们尽可能地将来自文件的数据保存在自己的缓冲区中。如果信息的大小大到无法装入缓冲区,你的把指针移到文件的开头然后再移到文件的结尾的技巧可能会奏效。

因此,此刻打开文件,检查内容,然后再次关闭

正如我上面所说(在你自己的文本中),在我的测试案例中,情况正好相反--指标读,专家顾问写。但据我所知,程序的类型并不重要。问题在于建筑。

MQL5中指定的文件实现是一个错误。关闭和打开文件是一种变通方法,但对于阅读共享文件来说不应该是这样的。

照顾性能优化是好事,但它不应该对功能产生负面影响。

PS。作为一个快速和肮脏的修复,这里有一个建议:在响应FileFlush对一个开放阅读的文件的调用时--更新其缓冲区。

 
Vict:

可能是因为µl C++是类似的,而结构是从C语言那里来的。

如果你需要构造函数,请使用类或欢迎来到夏普。你为什么要剥夺结构的这种内涵呢?这只会使程序更具表现力。我可能会拿着某人的代码,看到他/她有一个结构而不是一个类,并从一个词中得到很多信息。你将一无所获,你将勤奋地研究源代码以获得同样的结果,而我在一眨眼的功夫就得到了。根据我的经验--这种结构的惯例受到尊重,嗯,也许是某种风虚无主义的边缘化。

但在C++中,结构和类是同一件事。这就是为什么你所有关于"代码表达能力 " 的推理都不影响事情的本质你也可以通过定义来定义除结构或类之外的任何其他表达式的词,这不会改变任何东西(我指的是C++)

这就是为什么我们应该只从C#的角度来谈论结构。 这就是它们的概念来源。 结构是值类型,所以它们比类更紧凑,它们不是多态的,而且不能被引用。 后者尤其重要。

在你看来,那里没有邪恶。甚至还有延伸到标准中的:读取未初始化的unsigned char和std::byte不是未定义的行为。你可以为POD使用聚合初始化。而且不要忘记--所有这些初始化都不是免费的,它是真正的资源消耗(CPU、内存、可执行文件的大小)。如果你对你的数字计算机不屑一顾,在一些微控制器的情况下,它可能是重要的。毕竟,C/C++并不像夏普那样只是一个Windows的洗牌。

仅仅初始化一个变量就使指令大小增加了30%。

没有人说初始化本身是免费的,但无论如何都需要初始化,所以我不太理解你在有初始化和无初始化情况下的测量结果的含义。

另一件事是,编译器不会重新初始化变量。

int a= 0;  // Эту инициализацию компилятор вырежет
//...
a= 10;

因此,所有这些关于害怕变量预初始化 的偏执都是荒谬的。 这是2020年,特别是如果你说到POD结构。 它们的初始化肯定会被编译器优化。

只有当有100%的编译器控制禁止读取未初始化的变量时,没有预初始化是可以接受的。

 
Alexey Navoykov:

在C++中,结构和类是同一件事。所以你所有关于"代码表达能力 "的争论并不影响事物的本质你可以通过定义来定义任何其他表达式的词,而不是结构或类,它不会改变(我是说C++)

真是个固执的人))),对你来说也是一样的,你不需要用定义来定义什么,已经有了一个词--结构。你可以忽略它,但不要惊讶,当体面的编码员看到你的结构中塞满了函数时,他们会把你看成一个糟糕的编码员。也许在十字架的黎明,把结构和类等同起来是个错误,你应该把结构留在C中。

这就是为什么我们应该只从C#的角度来谈论结构。 这就是它们的概念的来源。 结构是值类型,所以它们比类更紧凑,不是多态的,而且不能被引用。 最后这一点特别重要。

你认为你的夏普出现在一个干净的领域吗?根植于C语言,该结构是一个哑巴容器,没有多余的糖。

另一件事是,编译器不会重新初始化变量。

int a= 0;  // Эту инициализацию компилятор вырежет
//...
a= 10;

因此,所有这些关于害怕变量预初始化 的偏执都是荒谬的。 这是2020年,特别是如果你在谈论POD结构。 它们的初始化肯定会被编译器优化。

你怎么能如此肯定?从另一个翻译单元/另一个模块/周期/编译器失调/调用一个函数。.不要高估优化器的能力。这不是编译器必须要做的Copy elision优化。如果优化人员变得如此聪明,不再花费任何代价,他们会在下一个C标准中写道:"默认初始化不会让对象处于未定义状态"。