优化过程中的单一阵列计算 - 页 6

 
Alexey Viktorov:

下面是一个写和读数组的例子

在调试模式下运行两次,看看写和读数组需要多长时间。第一次运行将把数组写入文件,第二次将读取数组并开始打印数组中的日期。然后找出高亮部分,如果IS_DEBUG_MODE 应该被删除,如果IsOptimization()应该被插入到条件中。

谢谢!
 
Dmitry Fedoseev:

有一个函数,类似FileWriteInteger()。通过位置识别,变量必须在文件的开头,读完后指针会移到它的末端,即移到数组的开头,读完数组后指针会在下一个变量之前......

一篇关于使用文件的文章将很快发表。

我想写信给你,没有关于文件操作的文章。你让他们的信息量很大,也很清晰。 当他们出现时,我一定会阅读他们。

 

尝试在全局层面声明一个数组(mql4代码)。

datetime T[];

填写

ArrayResize(T,40);
datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };

当开始时未设置,它打印出1971年的日期,即数组是空的。

for (int x=0;x<=39;x++)
   {
   Print("T[x]=",T[x],"x=",x);   
   }

如果我在开始时填充数组,就会出现这些值。可能的原因是,数组被重新初始化的时间,但没有它,代码就无法编译?

阵列消失了。我做错了什么?

 
forexman77:

尝试在全局层面声明一个数组(mql4代码)。

填写

当开始时未设置,它打印出1971年的日期,即数组是空的。

如果我在开始时填充数组,就会出现这些值。可能是由于数组被重新初始化的原因,但没有它,代码就无法编译?

阵列消失了。我做错了什么?

看看编译器怎么说。

ArrayResize(T,40);
datetime T[40]=

通过这样一个简单的动作,你已经定义了一个局部数组T,它将在OnInit的退出时消失。

 
Maxim Kuznetsov:

检查编译器产生的警告。

通过这样一个简单的动作,你定义了一个本地数组T,当你退出OnInit时,这个数组就会丢失。

它说已经有一个全局声明)

第40行的 "T "声明隐藏了全局声明

但是,如何做好它。 以前从来没有用大括号声明过一个数组。我把它初始化为零,并设置了它的大小,然后用循环填充它。是否有其他的方法?

如果我清除了inite中的日期时间,代码就不能编译,而是写出两个错误。

'{' - 预期的表达方式

'=' - 非法操作使用



 
forexman77:

它说已经有一个全局声明)

第40行的 "T "声明隐藏了全局声明

但是,如何做好它。 以前从来没有用大括号声明过一个数组。我把它初始化为零,并设置了它的大小,然后用循环填充它。是否有其他的方法?

如果我清除了inite中的日期时间,代码就不能编译,而是写出两个错误。

'{' - 预期的表达方式

'=' - 非法操作使用



数组声明和常量初始化可以(也应该)在全局层面完成。

datetime T[40]=
   {
   1262731020,1262735700,1262821920,1262903400,1262989740,1263247200,1263339060,1263420000,1263507480,1263595500,
   1265324700,1265407200,1265752980,1265926500,1265930820,1267657200,1267740300,1267826460,1268175840,1268346360,
   1270504920,1270684140,1270768500,1272924180,1273011720,1273097100,1273272240,1273528800,1273617180,1275344100,
   1275516000,1275602400,1275689160,1276034400,1276124580,1276208700,1276211640,1278027960,1278369780,1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77:

它说已经有一个全局声明)

第40行的 "T "声明隐藏了全局声明

但是,如何做好它。 以前从来没有用大括号声明过一个数组。我把它初始化为零,并设置了它的大小,然后用循环填充它。是否有其他的方法?

如果我清除了inite中的日期时间,代码就不能编译,而是写出两个错误。

'{' - 预期的表达方式

'=' - 非法操作使用



使用'=',你可以只在声明数组时初始化它们。这似乎是C语言的残余,但这里就是这样做的 :-)
 
Maxim Kuznetsov:

数组声明和常量初始化可以(也应该)在全局层面完成。

是的,我试过了,它是有效的。而且没有全局水平你是做不到的,我只是为了减少计算成本,在init中填充 一次数组,然后使用数组的值?

虽然从逻辑上讲,全局层面的变量始终是恒定的,所以在程序开始时就进行一次计算?

 
forexman77:

是的,我试过了,它是有效的。而且没有全局水平你是做不到的,我只是为了减少计算成本,在init中填充 一次数组,然后使用数组的值?

虽然从逻辑上讲,全局层面的变量总是恒定的,所以在程序开始时就进行一次计算?

是的,当准备一个ex4 ex5二进制文件供终端执行时。你可以认为,它只是链接到所描述的数据阵列(并在编译时保存在ex4/5里面),这非常快...
 
forexman77:

它说已经有一个全局声明)

第40行的 "T "声明隐藏了全局声明

但是,如何做好它。 以前从来没有用大括号声明过一个数组。我把它初始化为零,并设置了它的大小,然后用循环填充它。是否有其他的方法?

如果我清除了inite中的日期时间,代码就不能编译,而是写出两个错误。

'{' - 预期的表达方式

'=' - 非法操作使用



阵列如何填充其实并不重要。你只需要设置一个条件,如果数组的大小为零,它就应该被评估、填充并写入一个文件中。而在OnInit()中,尝试用我的例子读入已声明的数组。相应地,如果有一个文件数组,它被读取,并且数组被填充,数组将不会被重新计算和填充。