错误、漏洞、问题 - 页 1440

 

MT 4.OnTick()内的MathRand()随机数生成器。 在测试猫头鹰时,在相同的设置下再次运行时,会得到不同的结果。如果生成的数字影响到算法,这是很自然的。

在优化时,由于某种原因,我在第二次运行时得到了相同的结果,设置也相同。所以MathRand()在优化模式下不工作?

 
Сергей Таболин:

第二(我怕在这里犯错,我希望Alexander Puzanov 能纠正我的错误),如果程序员出于某种原因决定在动态数组 中添加一个索引为20的项目,不会发生什么坏事。数组将从这个维度出发,在那里写一个值,并将 "缺失 "的索引初始化为0值。

正是如此。为什么是 "零"?也许它应该是EMPTY_VALUE ?或 WRONG_VALUE ?

这种隐性赋值的问题正是它们的隐性性质--编译器引入了一些代码,一个程序员认为是这样的,而另一个可能认为是不同的。

另外,这也是无效的--并不总是需要立即初始化一个变量,而初始化一个大的数组,在一个循环中,会大大降低速度。

第三,没有可以阻止 程序员控制维度和使用的索引!这就是为什么我们的程序员可以控制维度。唯一不同的是,现在他是被迫 这样做的。)))

如果编译器自己跟踪一个数组的维度,那么没有一个类能够清理这个代码。效率很有可能下降。

同时,如果编译器不负责这项工作,程序员可以写一个类来完成这项工作,然后使用一个数组,在必要时可以用零来扩展和初始化。

在第二种情况下,灵活性更高。

因此,你提出的建议对许多情况来说也是一个很好的解决方案。但它可能会降低效率,这不是好事。

 
Сергей Таболин:

原则上,这是一个简单的例子,说明动态数组 通常应该如何填充。我已经很久没有用C语言写作了,我不记得了,但是在php中数组就是这样被填充的!一切都是合乎逻辑和可以理解的。如果我向一个数组添加一个元素(arr[] = x),数组会自动展开,这个元素会被添加到数组的末端。而且,我们不必自己把它拉出来,也不必自己指定元素的索引。但在这里,我们必须做出绝对不必要的动作。

区别很明显...

在我看来,这很奇怪,至少可以说))))。

编程语言分为严格类型和非严格类型。你的PHP、R和其他函数式语言都属于非严格类型的语言。在MQL或C#和Java等严格类型的语言中,不允许这种模糊的数据操作。而这是专门为程序员本身的安全而做的。严格的类型化意味着你的每一个过程都是极其具体的:"在数组中取一个索引为0的元素 "是一个具体而明确的过程,但你建议用 "从数组中取一些东西,并将其加入编译器决定首先返回的东西 "来代替它。- 你同意你不会在这上面走得太远。

当然,另一方面,我们希望有简单的高层结构,而不需要令人厌烦的数组大小和用户不断的重新排列。这正是标准库的作用。不使用基本的数组,而改用数组的类。例如,从0到16添加到CArrayInt数组中是这样的。

#include <Arrays\ArrayInt.mqh>

void OnStart()
{
   CArrayInt array;
   for(int i = 0; i < 16; i++)
      array.Add(i);   
}

正如你所看到的,没有什么太自然的东西。而且不需要为当前的数组大小和其他重新安排而绞尽脑汁。一切都为你完成,在严格的打字范围内,你被邀请直接集中在用户任务上。这就是OOP的力量和意义。

 

未提供完整的录音。编译错误

template<typename T>
class A { protected:
        A( T t ) : t( t ) {}
        T t;
};
class B : A<int> {
        B() : A<int>( 1 ) {} //'<' - member(s) initialization expected
};
 

我找不到我哪里错了。

任务是找到 一个区间的最大值 和最小值

void OnStart()

  {
int            Kol_Kan=10;       //Количество элементов для копирования
double         HI[];             //массив для хранения максимумов на интервале
double         LO[];             //массив для хранения минимумов на интервале

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//копируем значения максимумов
CopyLow(_Symbol,0,2,Kol_Kan,LO); //копируем значения минимумов

ArrayResize(HI,Kol_Kan);         //устанавливаем размер массива
ArrayResize(LO,Kol_Kan);

int in_max=0;                    //индекс максимального значения в массиве
int in_min=0;

in_max=ArrayMaximum(HI,WHOLE_ARRAY,0); //Находим индексы максимума и мин в массивах
in_min=ArrayMinimum(LO,WHOLE_ARRAY,0);

double hi_max;                   // максимальное значение цены 
double lo_min;                   // минимальное значение цены

hi_max=HI[in_max];               //Переносим значения максимумов и мин в переменные
lo_min=LO[in_min];
Alert(hi_max,"___",lo_min);   

  } 
 

ArrayMaximum(),ArrayMinimum() 中的参数顺序错误。

 
PabloEs:

我找不到我哪里错了。

任务是找到 一个区间的最大值 和最小值

职能

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//复制最大值的值

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copy values of minima

已经调整了数组的大小。

这是不需要的

ArrayResize(HI,Kol_Kan); //设置数组大小

ArrayResize(LO,Kol_Kan)。

 
Sergei Vladimirov:

Неправильный порядок аргументов в ArrayMaximum(), ArrayMinimum().

正是如此))。我在这里想...

弗拉基米尔-帕斯图沙克

职能

CopyHigh(_Symbol,0,2,Kol_Kan,HI);//复制最大值的值

CopyLow(_Symbol,0,2,Kol_Kan,LO); //copy values of minima

已经调整了数组的大小。

这是不需要的

ArrayResize(HI,Kol_Kan); //设置数组大小

ArrayResize(LO,Kol_Kan)。

我会知道的,谢谢你。

 
PabloEs:
那么,有什么问题吗? 我自己都搞不清楚?
 

而作者则是已经想通了。))

PabloEs:

正是如此。))我在这里想...

原因: