CharArrayToStruct

uchar型の配列をPOD structureにコピーします。

bool  CharArrayToStruct(
  void&         struct_object,    // 構造体
  const uchar&  char_array[],    // 配列
  uint          start_pos=0      // 配列での開始位置
  );

パラメータ

struct_object

[in]  任意の型のPOD構造体への参照(単純なデータ型のみを含む)

char_array[]

[in] uchar型の配列。

start_pos=0

[in]  配列内のデータコピーが始まる位置

戻り値

成功の場合はtrue、それ以外の場合はfalse

 

例:

#define DATA_TOTAL 4
 
MqlRates ExtDataRates[DATA_TOTAL];
uchar   ExtCharArray[];
 
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                              |
//+------------------------------------------------------------------+
void OnStart()
 {
//--- 最後の4つのバーのデータをuchar配列にコピーする
  ResetLastError();
  for(int i=0; i<DATA_TOTAL; i++)
    {
    if(!CopyRatesToCharArray(i, ExtCharArray))
        return;
    }
 
//--- uchar配列からのデータ量に応じて、ループ内のすべての利用可能なデータをMqlRates構造体配列にコピーする
  for(int i=0; i<DATA_TOTAL; i++)
    {
    ResetLastError();
    if(!CharArrayToStruct(ExtDataRates[i], ExtCharArray, sizeof(MqlRates)*i))
       {
        Print("CharArrayToStruct() failed. Error code: ", GetLastError());
        return;
       }
    //--- uchar 配列からMqlRates構造体へのデータのコピーが成功すると、
    //--- 構造体にコピーされたデータを操作ログに出力する
    MqlRatesPrint(ExtDataRates[i]);
    }
 
  /*
  結果:
  MqlRates data:
  Time = 2024.02.21 09:00;
  Open = 1.08116;
  High = 1.08141;
  Low = 1.08062;
  Close = 1.08124;
  Tick volume = 5344;
  Spread = 1;
  Real volume = 0
 
  MqlRates data:
  Time = 2024.02.21 08:00;
  Open = 1.08149;
  High = 1.08153;
  Low = 1.08073;
  Close = 1.08114;
  Tick volume = 3607;
  Spread = 2;
  Real volume = 0
 
  MqlRates data:
  Time = 2024.02.21 07:00;
  Open = 1.08143;
  High = 1.08165;
  Low = 1.08122;
  Close = 1.08150;
  Tick volume = 2083;
  Spread = 0;
  Real volume = 0
 
  MqlRates data:
  Time = 2024.02.21 06:00;
  Open = 1.08178;
  High = 1.08190;
  Low = 1.08132;
  Close = 1.08142;
  Tick volume = 1733;
  Spread = 0;
  Real volume = 0
  */
 }
//+------------------------------------------------------------------+
//| MqlRates構造体を介して指定されたインデックスによって                           |
//| バーデータをuchar配列にコピーする                                       |
//+------------------------------------------------------------------+
bool CopyRatesToCharArray(const int index, uchar &data_array[])
 {
  MqlRates rates[1];
  uint     start=sizeof(MqlRates);
 
  ResetLastError();
  if(CopyRates(Symbol(), PERIOD_CURRENT, index, 1, rates)!=1)
    {
    Print("CopyRates() failed. Error code: ", GetLastError());
    return(false);
    }
  if(!StructToCharArray(rates[0], data_array, start*index))
    {
    Print("StructToCharArray() failed. Error code: ", GetLastError());
    return(false);
    }
 
  return(true);
 }
//+------------------------------------------------------------------+
//| MqlRates構造体のフィールドを操作ログに出力する                             |
//+------------------------------------------------------------------+
void MqlRatesPrint(MqlRates &rates)
 {
//--- 出力文字列を作成する
  string text=StringFormat(" Time = %s;\n"
                          " Open = %.*f;\n"
                          " High = %.*f;\n"
                          " Low = %.*f;\n"
                          " Close = %.*f;\n"
                          " Tick volume = %I64u;\n"
                          " Spread = %d;\n"
                          " Real volume = %I64u",
                          TimeToString(rates.time),
                          _Digits, rates.open,
                          _Digits, rates.high,
                          _Digits, rates.low,
                          _Digits, rates.close,
                          rates.tick_volume,
                          rates.spread,
                          rates.real_volume);
//--- ヘッダーと出力文字列を操作ログに出力する
  Print("MqlRates data:\n", text, "\n");
 }

参照

StringToCharArray ShortArrayToStringStructToCharArrayコードページの使用FileReadStruct ユニオン(union)MathSwap