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

型変換を 行わない場合、'void'型の'NULL'式は不正となります。

の文字列を初期化することができることがわかりました。

 
fxsaber:

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

NULL / NIL(他の用語で)は、定数文字列の実体の初期化にはなりえません。

少なくとも、mqlの文字列はC言語のような「ポインタ」ではないので。特別な状態「何もない」ということはないのです。

追記(あ、自分でも予想外でした。)

 
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の文字列は、メモリが割り当てられたエンティティです。


fxsaber

このコンディションを毎日使っています。

MQL4ではStringConcatenate()を使って任意のオブジェクトへのポインタをアンセットしていましたので、全く指標にはなりません。)

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の特性、ヒントとコツ

イゴール・マカヌ さん 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は起動時に宣言されるconstであり,物理的に "NULL "という値を与えることはできない.

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

 
Nikolai Semko:

そう、この挙動はまさに「フールプルーフ」なのでしょう。
どうやら、入力変数は 初期化する必要があるため、すでにメモリ上で少なくとも1バイトを占めているのに、=NULLを 人為的に="" に等しくしているようです。

MQL5ではエントリーが。

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

変数にメモリが割り当てられないのはなぜですか?
メモリが確保され、変数に任意のゴミが入ります。
また、stringが値を出力していないことから、バッファは空であると論理的に判断できる。

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:

変数にメモリが割り当てられないのはなぜですか?
メモリは確保されるが、変数に任意のゴミが入ることはない。
また、stringが値を出力していないことから、バッファは空であると論理的に判断できる。

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
理由: