mql5语言的特点、微妙之处以及技巧 - 页 161

 
printf("%s , %f , %i",(string)NULL,(double)NULL,(int)NULL);

2020.01.27 01:15:57.859 tst (EURUSD,H1) (null) , 0.000000 , 0

如果我取消类型转换,"NULL"--"void "类型的表达是非法的。

有趣的是,事实证明,nput字符串可以被初始化为void

 
fxsaber:

NULL是初始化。这个例子特意显示了一个非输入字符串。

NULL / NIL(换句话说)不能成为一个常量字符串实体的初始化。

至少因为mql字符串不像C语言那样是一个 "指针"。它没有 "一无所有 "的特殊状态。

PS(哦,我没料到自己会这样)。

 
Maxim Kuznetsov:

她没有 "一无所有 "的特殊状态

关于交易、自动交易系统和交易策略测试的论坛

mql5的特殊性,技巧和窍门

fxsaber, 2020.01.26 15:54

void OnStart()
{
  uchar Bytes[];

  Print(StringToCharArray(NULL, Bytes)); // 0
  Print(StringToCharArray("", Bytes));   // 1
}

我每天都在使用这个条件。

 
Maxim Kuznetsov:

至少因为mql字符串不像C语言那样是一个 "指针"。它没有 "一无所有 "的特殊状态。

PS(哦,我没料到自己会这样)。

可惜没有,MQL中的字符串是一个有分配内存的实体。@Ilyas 解释了为什么StringBufferLen()可能不显示字符串的长度,而是显示用来存储字符串的内存。


fxsaber:

我每天都在使用这个条件。

这根本不是什么指标,在MQL4中,我使用StringConcatenate()取消对任何对象的指针,也就是说,内置函数的工作不是由MQL规则实现的))。

input string s = NULL;
void OnStart()
{
   uchar Bytes[];
  Print(StringToCharArray(NULL, Bytes));  // 0
  Print(StringToCharArray("", Bytes));    // 1
  Print(StringToCharArray(s, Bytes));     // 1
}
 
Igor Makanu:

这根本不是什么指标,我在MQL4中使用StringConcatenate()取消了对任何对象的指针,也就是说,内置函数不是由MQL规则实现的))

里面的东西没有任何区别。

关于交易、自动交易系统和策略测试的论坛

mql5的特殊性,技巧和窍门

Igor Makanu, 2020.01.26 22:27

input string s = NULL;
void OnStart()
{
   uchar Bytes[];

  Print(StringToCharArray(s, Bytes));     // 1
}
因为它不是NULL。这就是原始信息的内容。
 
fxsaber:

里面的情况如何并无区别。

用你的例子补充了我的帖子


我还做了几个实验,输入字符串s = NULL。

据我所知,当我们没有试图使用输入变量的值时,它将是NULL,但当我们试图给另一个变量赋值或简单地取消它时,NULL将消失,即内存被分配 给这个输入变量。

 
Igor Makanu:

据我所知,当我们不试图使用一个输入变量的值时--这个值是NULL,但是在那个时候,如果我们试图把这个输入变量的值分配给另一个变量,或者干脆取消这个输入变量,那么这个NULL就会消失,即内存会被分配 给这个输入变量。

上面已经详细介绍了输入变量的运行机制。

 
fxsaber:

里面的东西没有任何区别。

因为它不是NULL。这就是原始信息的内容。

实体解读的特殊性(在mql中没有指针,它不是C语言,让它有实体)。

input是一个在启动时声明的常量,你不能在物理上给它 "NULL "的值。

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko:

是的,这种行为可能只是 "万无一失"。
显然,由于输入变量 必须被初始化,=NULL 被人为地等同于="", 而该变量已经在内存中占据了至少一个字节。

在MQL5中的条目。

是绝对相同的。没有为该变量分配内存。总之,我没有发现任何差异。
例如,在java中,这种记录略有不同,尽管在这两种情况下也没有为变量分配内存。第一个变量(String str = null;)将被视为初始化,尽管没有为变量分配内存,而且变量可以被打印为空。在第二种情况下(String str;),当你试图打印该变量时,将产生一个未初始化变量的错误。
也就是说,MQL5在这方面的容忍度更高。
哪个更好,我甚至不知道。

如何不向变量分配内存?
内存被分配,变量包含任意的垃圾。
而事实上,字符串并没有输出任何数值,因此,缓冲区是空的,这是符合逻辑的。

char   ch; 
short  sh;
int    in;
double db;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(in));
Print(sizeof(db));
Print(sizeof(st));
Print("---------------------");
Print(ch);
Print(sh);
Print(in);
Print(db);
Print(st);
 
Roman:

如何不向变量分配内存?
内存被分配,但变量不包含任意的垃圾。
而事实上,字符串并没有输出任何数值,因此,缓冲区是空的,这是符合逻辑的。

char ch; 
short sh;       
string st;

Print(sizeof(ch));
Print(sizeof(sh));
Print(sizeof(st));

   string str1;
   string str2="Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз.";
   Print(sizeof(str1));  // 12
   Print(sizeof(str2));  // 12
   uchar ch1[],ch2[];
   Print(StringToCharArray(str1, ch1));  // 0
   Print(StringToCharArray(str2, ch2));  // 68