关于MQL4编程的在线书籍的测试版 - 由Sergey Kovalev (SK.)撰写。 - 页 10

 
对不起,找到了!
是的,手册确实很酷,但回到我之前的要求--它需要在手边,能够及时查询。
理想情况下--它应该取代MT新版本中的标准帮助。
 

到SK

double my_search_and_etc()
{ double summ[]; //函数中的数组。
//.........
i=ArrayMinimum(summ,iter,0); // 追踪器: <ArrayMinimum函数 的起始位置0>

//第二个错误变量
静态双数summ[]; //
//.........
i=ArrayMinimum(summ,iter,0); // 追踪器: <ArrayMinimum函数的起始位置0>。
/i.e. 在第二个勾中动态寻址数组的初始元素的错误
//.......................

//........................
//正确的时间
double summ[1000]; //指定明确的大小意味着静态类型。
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
//右二
static double summ[1000]; //reinsurance to explicit size
//.........
i=ArrayMinimum(summ,iter,0); // O.k.
}

 
不,你不需要取代标准帮助。保留它。正常的语言软件开发者将语言描述与它的各种教程分开。
 
Korey:

到SK


我不太清楚你的问题是什么。你提供的这组字符串是完整的代码(那为什么要重复初始化?)还是潦草的字符串(那为什么有大括号?)提交完成的代码并制定问题。使用MQL按钮(在编辑窗口的顶行)来发布代码。
 
Renat:
祝贺谢尔盖-科瓦列夫!

MQL4教程 的发布定于2月1日,它已经被整合到MQL4.community网站中。翻译成英文的工作正在顺利进行中。

谢谢你的祝贺,雷纳特。

我想借此机会再次告诉大家,能够在MetaQuotes软件公司 网站上发布MQL4教程,我感到非常荣幸。我真诚地感谢你们的信任、支持和鼓励。我还感谢MetaQuotes软件公司的Stanislav Starikov和Rashid Umarov在编写本书时提供的宝贵意见和帮助。

 
到SK
这篇文章展示了4种数组初始化的变体,其中有一个相同的ArrayMinimum()的调用。
事实表明,在子程序中初始化一个数组而不指定数组的大小[],会导致 "RunTime "错误
- 在前两个变体中,错误被引用,翻译为:"数组开头的ADDRESS不正确"。
-第二种变体是工作的,它表明指定[1000]的维度会自动使数组静态化。
结论。
1)MQL4数组并不总是静态的。
2)静态a[]的定义,即没有明确的维度,将无法工作,但不会有错误信息。该错误在运行时显示在专家顾问窗口的第二个和随后的刻度上。
3) 如果在子/函数中定义了数组,就会出现描述的静态/动态错误,而且只有在 "专家顾问 "窗口中才会发现。
而且只有在第二次打勾时才会出现。例如,在周末不使用策略测试器调试指标时,没有发现该错误。
4)教科书上的那句 "MQL4数组总是静态的 "可能与早期的构建有关。
 

我希望除了文字教程之外,还能有一套视频教程。有一套视频教程。尤其缺乏的是第一课--如何下载、安装软件并进行第一次买入或卖出交易。

 
Korey:
到SK
这篇文章展示了4个版本的数组初始化,都是对ArrayMinimum()的一个相同调用。
事实表明,在子程序中初始化一个数组而不指定数组的大小[],会导致 "RunTime "错误
- 在前两个变体中,错误被引用,翻译为:"数组开头的ADDRESS不正确"。
-第二种变体是工作的,它表明指定[1000]的维度会自动使数组静态化。
结论。
1)MQL4数组并不总是静态的。
2)静态a[]的定义,即没有明确的维度,将无法工作,但不会有错误信息。该错误在运行时显示在专家顾问窗口的第二个和随后的刻度上。
3) 如果在子/函数中定义了数组,就会出现静态/动态的描述性错误,而且只有在 "专家顾问 "窗口中才会发现。
而且只有在第二次打勾时才会出现。例如,在周末不使用策略测试器调试指标时,没有发现该错误。
4)教科书上的那句 "MQL4数组总是静态的 "可能与早期的构建有关。


你的推理不是很清楚。你声明了一个无尺寸的数组(事实上,程序只有数组的名称,其中的元素没有定义,也没有分配内存),并尝试使用ArrayMinimum()函数,在不存在的元素中找到最小值。当然,无论数组是否被声明为静态,错误都会发生,你应该把执行错误当作数组的属性是否为静态的指示。

根据定义,MQL4中的数组是静态的。这意味着(当然,除非数组中至少有一个元素),数组元素从函数(声明数组的)最后一次被终止时开始存储,直到下一次被调用,不管数组标识符前面是否有static关键字。

 
to SK
我关心的是,我们已经使用这些内存分配技巧很长时间了。
我写的不是数组的内容,而是它的寻址问题,没有编译错误,没有链接错误,但有一个ADDRESS PRINTY ERROR。
也就是说,编译器允许我在子程序中定义一个数组[],以便以后增长,--这很好(!),
,它是按数组动态分配内存。
然而,这个数组的所有指针都被链接为直接指针(但不是指向指针的指针),
,这导致在随后的动态内存分配中,链接的静态地址和新分配的数组地址之间不匹配。
也就是说,MQL4中的数组(指针)引用现在是静态的,只有当数组真的是静态的时候,它才能正确工作。
编译器不理解子程序内部没有明确大小的数组将来会被移动。
程序员把静态的,认为一切都很正确,但是如果他不指定一个明确的大小--没有静态数组,数组实际上会变成动态的(没有编译/加载错误)。
这个问题不大,通常大家都把数组放在全局层面。
但在教程中最好不要写所谓的所有数组都已经是静态的,而是应该用明确的大小来写局部数组的静态。
 
Korey:
到SK
程序员把静态的,并认为一切都很正确,但如果他不指定一个明确的大小--没有静态数组,数组实际上会变成动态的(没有编译/加载错误)。

一个知道MQL4中所有数组都是静态的程序员不会放静态,只是因为没有必要。

但在教程中最好不要写成所谓的所有数组都已经是静态的,而是写成局部数组应该被指定为具有明确大小的静态。

也许你混淆了这些概念。在这种情况下,"静态 "是指在声明函数的执行间隔内存储数组元素的值的属性。在这段时间内,数组总是保留它们的值,不管它们的名字前面是否有static(不过对于局部变量来说不是这样,它们需要明确声明为static)。

然而,可以用ArrayResize()来调整数组第一维的大小。

原因: