错误、漏洞、问题 - 页 2566

[删除]  
Slava:

有了这种铸造,就不会有数据损失。要么是0,要么就不是0。

另一种情况是当double -> 任何整数类型(包括int32)时。

在我看来,你玩警告有点过了,你的判断缺乏一致性。

bool continuation()const {return this.last_level;}  // uint last_level
// expression not boolean	lrp_last_9.mq5	260	42
 
Vict:

在我看来,你的警告有点过分了,判断上 缺乏一致性

同意的

这里也没有 这种意义上的数据损失(要么是0,要么不是0)。

void OnStart()
{
        int i = -1;
        while ( ++i ); //Warning: expression not boolean
}

但有一个警告。预计会有一个统一的方法

 

试图从同一个类的静态函数中访问一个类实例的属性的结果。

2019.09.18 20:07:41.043 Test_exec (EURUSD,M5)   Access violation at 0x000001E9CCD2963C read to 0x0000000000000014 in 'D:\Alpari MT5\MQL5\Scripts\Test_exec.ex5'
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)      crash -->  000001E9CCD2963C 837B1400          cmp        dword [rbx+0x14], 0x0
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29640 0F8E8F020000      jle        dword 0x1e9ccd298d5
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)                 000001E9CCD29646 90                nop        
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   00: 0x000001E9CCD2963C
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   01: 0x000000B56CA2F120
2019.09.18 20:07:41.080 Test_exec (EURUSD,M5)   02: 0x000001E9CCD2A04D
在这之前,编译器是沉默的。
 

不会用终端null来初始化一个空字符串。

void OnStart()
{      
   string str;
   StringInit(str, 100, 0);
   
   Print(StringLen(str));     
}

结果

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  0

预期的

2019.09.18 22:16:54.380 TestScript (EURUSD,H1)  100

StringInit函数 的帮助中注意到

Примечание

Если  character=0 и размер new_len>0, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

事实上,不存在分配。
即以这种方式分配,十个空间

string str = "          ";

是不一样的。

string str;
StringInit(str, 10, 0);

标记为红色的帮助文本与逻辑行为不一致。

 
Vict:

在我看来,你的警告太多,判断不够一致。

警告对布尔运算不起作用,现在我无意中发现我的代码中有一个错字,所以我重现了它。

#define               getAsk(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_ASK)
#define               getBid(dummy)          SymbolInfoDouble(_Symbol, SYMBOL_BID)
//+------------------------------------------------------------------+
void OnStart()
  {
      double sl = 0.0,tp=0.0;
      if(sl != ! OrderStopLoss() || tp != OrderTakeProfit()) Print("");  
  }
//+------------------------------------------------------------------+

double OrderStopLoss()
{
   return(getAsk());
}

double OrderTakeProfit()
{
   return(getBid());
}
 
Roman:

不会用终端null来初始化一个空字符串。

结果

预期的

StringInit函数 的帮助中注意到

事实上,没有分配。
即以这种方式分配,十个空间

是不一样的。

而且,这似乎与帮助文本中用红色强调的行为逻辑不一致。

你错过了StringBufferLen函数--它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,如果它在最开始--长度为0,则分别返回。 Buffer != string。

 
Stanislav Korotky:

你忽略了StringBufferLen函数 - 它返回分配的缓冲区的大小。StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。

否则它就不了解自己。

 
Stanislav Korotky:

你忽略了StringBufferLen函数--它返回分配的缓冲区的大小。
StringLen返回字符串的长度,即到终端字符为止,分别是,如果它在最开始--长度为0。 Buffer != string。

这很清楚,我们正在谈论用终端零来初始化一个字符串
为什么不在stringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。
如果你想初始化一个空字符串,而不填充它!例如,100个字符。
然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65)
我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 ))


[删除]  
Roman:

这是可以理解的,我们说的是用终端零来初始化字符串
为什么不在StringInit(str, 10, 0);中填入十个终端零呢?并返回实际的字符串长度。
如果你想初始化一个空字符串,而不填充它!例如,100个字符。
然后要么100个空格作为str = " 多次敲击键盘",要么初始化垃圾StringInit(str, 100, 65)
我不明白为什么我需要用垃圾初始化,已经有足够多的垃圾了 ))


你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。

StringInit(str, 100, ' ');

不是吗?

如果你需要零,在μl std的某个地方有一个String类。

 
Vict:

你为什么认为它没有被填上呢?只是μl字符串中的长度没有被存储,它被终端零号识别。

不是吗?

如果你需要零,在μl std的某个地方有一个String类。

不......它也是以这种方式返回零。而第三个参数ushort,需要整数的字符编码。

如果我初始化为str = " "; 然后从dll中传递数据,一切正常。
但如果我把它初始化为StringInit(str, 10, 0),那么数据就不会到达。这是因为代码没有为所需大小的字符串分配内存

如果我有空间的代码,可能会工作,但我没有在不同的表中找到这样的代码。
我们需要为未来的字符数分配内存,然后将其转到已经初始化的空字符串。
但是要初始化字符串,不是Kommelpho,是垃圾。
StringInit(str, 100, 0); 应该用终端空值填充,并返回长度100。