mql5言語の特徴、微妙なニュアンスとテクニック - ページ 160

 
Alexey Viktorov:

NULLはそのような曖昧なものなので、慎重に扱う必要があります。

void OnStart()
{
  uchar Bytes[];

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

繰り返しますが、入力文字列は NULL にはできません (強制的に "").他の文字列は可能です。

 
fxsaber:

繰り返しになるが,入力文字列はNULLではありえない(強制的に "").他の文字列は可能です。

input は const とほぼ同義であり、const は初期化する必要があります。
 
fxsaber:

繰り返しになるが,入力文字列はNULLではありえない(強制的に "").他の文字列は可能です。

繰り返しになりますが、なぜそのような変換があってはいけないと思うのでしょうか?私の知識と経験だけでは、すべてを説明することはできません。だから、自分の意見を貫くこと。開発者が調子に乗って変更しないことを望みます。

 
Alexey Viktorov:

繰り返しになりますが、なぜそのような変換を行うべきではないとお考えなのでしょうか?

なぜこのような変換が起こるのか、私にはよくわかります。ここではバグの話ではなく、機能の話をしているのです。

 
Maxim Kuznetsov:
input は const とほぼ同義であり、const は初期化されなければならない

NULLは初期化。この例では、意図的に非入力文字列を表示しています。

 
fxsaber:
コンパイル時に警告を発生させるのがよいでしょう。

そう、この動作は、まさに「フールプルーフ」なのでしょう。
どうやら、入力変数は 初期化されなければならないため、変数がすでにメモリ内で少なくとも1バイトを占めている場合、= NULLは 人為的に="" と同一視されるようです。

MQL5ではエントリーが。

string str=NULL;
string str;

は全く同じものです。変数にメモリは確保されない。とにかく、違いは見つかりませんでした。
例えばjavaでは、どちらの場合も変数にメモリが割り当てられていないにもかかわらず、このような記録は微妙に異なっている。最初の変形(String str = null;)は、初期化されたとみなされますが、変数にメモリは割り当てられず、変数は空と表示されることがあります。2番目のケース(String str;)では、その変数を表示しようとすると、初期化されていない変数のエラーが発生します。
つまり、MQL5の方がこの点では寛容です。
どっちがいいのか、自分でもわからない。

 
Nikolai Semko:

どうやら、入力変数を 初期化する必要があるため、変数がすでにメモリ内で少なくとも1バイトを占めている場合、= NULLを 人為的に="" と等しくしているようです。

NULLは初期化ではなく、値です。コードの途中で、constでない文字列変数にNULLを代入してもよい。そして、NULLと等しくなる。

起動時に不可視のセットファイルが作成されるため、InputはNULLと等しくならない。このファイルから変数値を入力に「パース」する。パースではNULLを出力できないので、空文字列をそこに置く。

input-stringだけがこのような動作をします。const-stringなどでは、もちろん問題ありません。
 
fxsaber:

NULLは初期化ではなく、値です。コードの途中で、constでない文字列変数をNULLに代入することができます。そして、NULLと等しくなる。

起動時に不可視のセットファイルが作成されるため、InputはNULLと等しくならない。このファイルから変数値を入力に「パース」する。解析はNULLを全く出力しないので、そこに空文字列を置くことになる。

まあ、そういうことです。私もそう思います。
ただ、変数宣言の 段階で文字列にNULL値を代入しても意味がない。

string str1 = NULL;
string str2;
PRINT((str1==NULL));   // true
PRINT((str2==NULL));   // true

これは、すでに初期化された変数をメモリ上でゼロにするために行うことに意味があるのです。

 
Nikolai Semko:

まあ、そういうことなんですけどね。私もそう思います。
ただ、変数宣言の 段階で文字列にNULL値を代入しても意味がない。

は、メモリ上の変数をNULLにする場合にのみ意味があります。

#define  DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

ここでは、NULL初期化が意味を持つ。

 
fxsaber:

NULL初期化は、ここでは意味がある。

理由: