错误、漏洞、问题 - 页 167

 

关于动态数组 的问题

double open_main_array[] - 类变量

初始化

ArraySetAsSeries(open_main_array,true)。

该函数的第1次调用,包含以下代码

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

第二次调用该函数

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

open_main_array数组是否包含第二次调用时复制的数据,或者数组将被递增并包含第一次和第二次调用的数据?

或者,你可以使用。

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, Count, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

未初始化的变量 - 意味着该变量在未初始化时保证 有一个传递分支。例如,default在switch中被显式省略,其中MainPrice应该被显式初始化(或者在声明时显式归零)。

关于 "保证通过"。这里有这样一段代码。

            (1)         double local_low;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion=false;
            (4)         for(uint n=1;n<Ac-k;n++)
            (5)           {
            (6)            if(low[index_interior-n]<low[index_interior-n-1])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion=true;
            (10)              break;
            (11)              }
            (12)          }  
            (13)        if(interrupcion)
            (14)          {
            (15)           if(EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

对于最后一行(第15行),它说 "可能使用了未初始化的变量'local_low'"。

但是由于在第8行初始化变量 local_low之后,在第9行使用了bool-variable interrupcion,结果发现在第15行变量local_low将被保证 初始化。所以在这一点上,警告 "可能使用未初始化的变量'local_low'"并不意味着 "保证",而只是可能 存在变量未被初始化的传递分支。

 
Yedelkin:

关于 "保证通过"。这里有一段代码。

对于最后一行(第15行),它说 "可能使用了未初始化的变量'local_low'"。

但是由于在第8行初始化变量local_low之后,在第9行使用了bool-variable interrupcion,结果发现在第15行变量local_low将被保证 初始化。所以在这个时候,"可能使用了未初始化的变量'local_low'"的警告并不意味着 "保证",而只是可能 存在一个变量未初始化的直通分支。

这是完全正确的,它给你一个警告。

不要把你的自满情绪 与现实混淆起来。现实是在许多项目 之后被揭示的,理解 "这不可能,因为逻辑会导致某某 "的情况每天都在发生。

 
Renat:

不要把你的自信心 与现实混淆。现实是在许多项目之后被揭示的,"这不可能,因为逻辑导致了某某 "的意识每天都在发生。

你能得到一个充分的解释吗?代码给出了,"自以为是 "的说法也说了,错误在哪里呢?我不理解神秘主义。

...如果你考虑"可能 使用未初始化的变量 "这句话的翻译,警告确实是 "绝对正确 "发出的。但这并不是说 "保证",而只是说可能 存在一个变量未被初始化的传递分支。这正是我所 "自信 "的话题。

 
Yedelkin:

我们能得到一个充分的解释吗?代码给出了,"自以为是 "的说法也说了,错误在哪里呢?我不理解神秘主义。

如果不采用

interrupcion=true;

而不是(例如)...

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
你也会提出索赔吗?特别是当someFunctionN由数百行代码组成时?

根据你的这段代码,是的,如果第15行被执行,变量被初始化。但在我给出的例子中,你会告诉编译器做什么?这个任务很艰巨。而且也没有必要在解决这个问题。

这个错误被称为"可能 (也许) 使用了未初始化的变量"(尽管你反正知道它)。

你最好明确地给变量local_low分配一些值。相信我,它可以使你免于将来可能出现的错误(代码被纠正,一些东西被删除,一些东西被移动,一些东西被改变,第13行可能从这个过程中掉出来)

 
Yedelkin:

我们能得到一个充分的解释吗?代码给出了,"自以为是 "的说法也说了,错误在哪里呢?我不理解神秘主义。

在现实世界中,当任何语言的绝大多数程序员都在编写完全不受保护的、有缺陷的代码时,编译器应该尽可能地严格执行。程序员的自满 "逻辑很清楚,应该没有问题,所有的东西都被初始化了 "带来了,并且仍然带来了,并且将带来大量的错误。

这就是为什么关于批评严格措施的问题在这里是不相关的。

 
Renat:

......程序员 "逻辑清晰,应该没有问题,一切都被正确初始化 "的自信心已经带来、带来并将带来大量的错误。

这就是为什么对严格措施的批评 在这里无关紧要。

让我们不要批评。特别是我没有把它放在我的文字中。关于我的批评的存在,你是大错特错了。

那么,你的错误是什么?既然你不能把深奥的东西写进密码,请用逻辑的语言回答我。也就是说,用任何程序员都能理解的语言。

 
notused:

你也会提出索赔 吗?特别是当someFunctionN由数百行代码组成时?

你也在同一个地方。嗯,我没有任何抱怨。我只想说清楚,一切并不像雷纳特说的那样绝对化。

那么代码呢。我给了你一个具体的代码样本,用普通的逻辑来反驳Renat的声明的分类性。谢谢你的建议,我一直在努力改进。

 
Yedelkin:

让我们免于批评。特别是我没有把它放在我的文字中。至于说我存在批评,你就大错特错了。

那么,你的错误是什么?既然你不能把深奥的东西写进密码,请用逻辑的语言回答我。也就是说,用任何程序员都能理解的语言。

你有"可能使用了未初始化的变量'local_low'"。

而你会得到什么,如果

(1)         double local_low=1.1; // или что-то другое
 
Yedelkin:

那么,什么是错误呢?既然你不能把深奥的东西放进代码里,请用逻辑的语言回答。也就是说,用任何程序员都能理解的语言。

从一个已经将许多软件项目 推向市场的软件公司经理的角度重新阅读我的答案。

否则,停留在 "任何程序员 "的水平上,你将不明白错误是什么。

原因: