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

 
fxsaber

ルーディメンツ機能(必須ではありません)

  • StringToDouble
  • StringToInteger
  • 文字列から時間へ
  • 文字列から色へ
  • ストリングアッド
  • ストリングコンカテネート
  • GetPointer


なんで
 
コンスタンチン
なんで
全ては適切なオペレーターを介して行われます。
 
fxsaber
全ては適切なオペレーターを介して行われます。

よくわからないのですが、例を教えてください。
 
コンスタンチン

よくわからないのですが、例を教えてください。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

mql5言語の特殊性、微妙なニュアンスとトリック

fxsaber さん 2017.04.26 15:16

すべての標準タイプでマッチングが取れている
void OnStart()
{
  string Str = "1.23qwedfg";
  
  Print((int)Str);
  Print((double)Str);
}

結果

1
1.23

 
fxsaber



ああ、そうだったのか))そうでなければ、構造体のときのように、突然コードが動かなくなる。)
 
fxsaber

便利な機能(不要な機能)

  • GetPointer

そしてこの機能は、何と重複しているのでしょうか?
 
ワシリー・プシュカリョフ
そしてこの機能は、何と重複しているのでしょうか?
& 対象物
 

構造体をキャストする代わりにユニオンを 使用する

ビルド1596以降、異なる型の構造体を互いに明示的に変換することは禁止されています。このような古いビルドで動作するサンプルは、現在ではコンパイルできません。

struct struct_double
{
   double value;
}sd;

struct struct_long
{
   ulong value;
}sl;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   sl = (struct_long)sd;
}
cannot cast 'struct_double' to 'struct_long'    CastingValues.mq5       33      9

しかし、現在ではMQLでデータを結合してユニオン構造にすることが可能になっています。このため、ユニオンを使って型変換を行うことができる。

union struct_union
{
   double d_value;
   ulong  l_value;
}su;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   su.l_value = 0;
   su.d_value = 3.14159;
   printf((string)su.l_value);
}
2017.04.27 13:20:03.375 CastingValues (Si-6.17,M1)      4614256650576692846

この構造は、すでに新しいビルドで利用可能です。

p.s. 開発者に、キャスティングのドキュメントを修正し始めるようお願いしてください: https://www.mql5.com/ru/docs/basis/types/casting

 
ワシリー・ソコロフ

構造体をキャストする代わりにユニオンを 使用する

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

ライブラリ: TypeToBytes

fxsaber さん 2017.04.26 10:49

ランダム構造鋳造可能
struct STRUCT2
{
  MqlTick Tick;
};

// Кастинг произвольных простых структур
  STRUCT2 Struct2 = _C(STRUCT2, Tick);   // Аналог классического кастинга STRUCT2 Struct2 = (STRUCT2)Tick;
union は、カスタムコンストラクタやコピー演算子を持つ構造体のキャストを許可しません。
 
fxsaber
union は、カスタムコンストラクタやコピー演算子を持つ構造体のキャストを許可しません。

キャスティングを完全にユニオンに置き換えるという話はなかった。

p.s. あなたのコードを拝見しました。

class CASTING
  {
  public:
    template <typename T1>
    static const T Casting( const T1 &Value )
    {
  #ifdef  TYPETOBYTES_FULL_SLOW
      T Data = {0};

      const int handle = ::FileOpen("Casting.tmp", FILE_READ | FILE_WRITE | FILE_BIN);

      if (handle != INVALID_HANDLE)
      {
        ::FileWriteStruct(handle, Value);

        ::FileSeek(handle, 0, SEEK_SET);
        ::FileReadStruct(handle, Data);

        ::FileClose(handle);
      }

      return(Data);
  #else // TYPETOBYTES_FULL_SLOW
      union CAST

書き込み/読み取りバイナリによる任意のキャス...消灯。これ以上読まないでください...。

理由: