エラー、バグ、質問 - ページ 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, то будет распределен буфер строки указанного размера и заполнен нулями. 
Размер строки будет равен нулю, так как весь буфер заполнен терминаторами строки.

実は、流通はしていないのです。
すなわち、このような配分で、10スペース

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関数の ヘルプに記載されている注意事項

実際、分配はありません。
すなわち、このような配分で、10スペース

は同じではありません。

そして、ヘルプテキストで赤くハイライトされている動作のロジックと一致しないようです。

StringBufferLen関数は、割り当てられたバッファのサイズを返します。StringLenは、文字列の長さ、つまり、終端文字までの長さを返します。 Buffer != string.

 
Stanislav Korotky:

StringBufferLen関数は、割り当てられたバッファのサイズを返します。StringLenは文字列の長さ、つまり終端文字までの長さを返し、終端文字が先頭にある場合はそれぞれ長さ0となる。 Buffer != string.

そうでなければ、自分自身を知ることができない。

 
Stanislav Korotky:

StringBufferLen関数は、割り当てられたバッファのサイズを返します。
StringLenは文字列の長さ、つまり終端文字までの長さを返し、終端文字が先頭にある場合はそれぞれ長さ0となる。 Buffer != string.

これは明らかで、文字列を 末尾のゼロで初期化 することを言っているのです。
stringInit(str, 10, 0); を末尾のゼロ10個で埋めてはどうでしょう?そして、実際の文字列の長さを返す。
もし、空の文字列を埋めずに初期化したい場合!例えば100文字で。
とすると、str = " キーボードを何度も叩く " として空白を100個にするか、ゴミのような初期化 StringInit(str, 100, 65) を実行します。
なぜゴミで初期化する必要があるのか理解できない、すでに十分な量があるのだから ))


 
Roman:

それは理解できる、文字列を 末尾のゼロで初期化 するという話だ。
StringInit(str, 10, 0); を末尾のゼロ10個で埋めてはどうでしょう?そして、実際の文字列の長さを返す。
もし、空の文字列を埋めずに初期化したい場合!例えば100文字で。
とすると、str = " キーボードを何度も叩く " として空白を100個にするか、ゴミのような初期化 StringInit(str, 100, 65) を実行します。
なぜゴミで初期化する必要があるのか理解できない、すでに十分な量があるのだから ))


なぜ、記入されていないと思うのですか?ただ、μlの文字列の長さは記憶されず、端末のゼロで認識されます。

StringInit(str, 100, ' ');

ん?

また、ゼロが必要な場合は、µl stdの奥底のどこかにStringクラスがあります。

 
Vict:

なぜ、記入されていないと思うのですか?ただ、μlの文字列の長さは記憶されず、端末のゼロで認識されます。

ん?

また、ゼロが必要な場合は、µl std の奥底に String クラスが存在します。

いや・・・その方法でもゼロを返します。また、3番目のパラメータushortは、整数の文字コードを必要とします。

str = " ";として初期化し、DLLからデータを渡すと、すべてOKです。
しかし、StringInit(str, 10, 0)として初期化すると、データが届かなくなる。これは、必要な大きさの文字列のためのメモリが確保 されていないためです。

もし私がスペースのためのコードを持っていたら、おそらく働いていただろうが、私は別のテーブルでそのようなコードを発見していないこと。
すでに初期化されている空文字列に移動する未来の文字数分のメモリーを確保する必要があります。
しかし、文字列を初期化するための屑、コンメルフォではない。
StringInit(str, 100, 0); は、末尾にヌルが入り、長さ100を返すはずです。