CArrayObj

CArrayObj クラスは、CObjectと派生クラスのインスタンスへのポインタの動的配列のクラスです。

説明

CArrayObj クラスは、CObject とその派生クラスのインスタンスの動的配列のポインタを操作する機能を提供します。これは、基本データ型のデータ及びより複雑な構成を持つデータ構造体を持つ多次元動的配列を操作することが出来ます。

配列要素の追加/挿入/削除、配列のソート、ソートされた配列での検索が実装されています。またファイル操作のメソッドも実装されています。

CArrayObj クラスにはいくつかの注意点があります。

宣言

  class CArrayObj : public CArray

タイトル

  #include <Arrays\ArrayObj.mqh>

継承階層

  CObject

      CArray

          CArrayObj

直接子孫

CIndicators, CSeries

クラスメソッド

属性

 

FreeMode

メモリ管理フラグを取得します。

FreeMode

メモリ管理フラグを設定します。

メモリ制御

 

Reserve

メモリを割り当てて、配列のサイズを増加します。

Resize

配列の新しい(減少した)サイズを設定します。

Shutdown

配列をクリアして、配列メモリ(要素メモリ以外)を完全に開放します。

追加メソッド

 

Add

配列の最後に要素を追加します。

AddArray

配列の最後に要素を追加します。

Insert

指定された位置に配列の要素を挿入します。

InsertArray

指定された位置に別の配列の要素を挿入します。

AssignArray

別の配列の要素を複製します。

更新メソッド

 

Update

指定された位置の配列の要素を変更します。

Shift

配列内の指定された位置から要素を指定されたオフセットに移動します。

削除メソッド

 

Detach

配列の指定された位置から要素を取得して、配列から削除します。

Delete

配列の指定された位置から要素を削除します。

DeleteRange

配列の指定された位置から要素のグループを削除します。

Clear

メモリを解放せずに、配列の全ての要素を削除します。

アクセスメソッド

 

At

配列の指定された位置から要素を取得します。

比較メソッド

 

CompareArray

配列を別の配列と比較します。

ソートされた配列の操作

 

InsertSort

ソートされた配列に要素を挿入します。

Search

ソートされた配列内でサンプルに等しい要素を検索します。

SearchGreat

ソートされた配列内でサンプルより大きい要素を検索します。

SearchLess

ソートされた配列内でサンプルより小さい要素を検索します。

SearchGreatOrEqual

ソートされた配列内でサンプル以上の要素を検索します。

SearchLessOrEqual

ソートされた配列内でサンプル以下の要素を検索します。

SearchFirst

ソートされた配列内でサンプルに等しい最初の要素を検索します。

SearchLast

ソートされた配列内でサンプルに等しい最後の要素を検索します。

入出力

 

Save

データ配列をファイルに保存します。

Load

データ配列をファイルから読み込みます。

Type

配列の型識別子を取得します。

クラスから継承されたメソッド CObject

Prev, Prev, Next, Next, Compare

クラスから継承されたメソッド CArray

Step, Step, Total, Available, Max, IsSorted, SortMode, Clear, Sort

実用的な配列は(標準ライブラリの全てのクラスを含む)CObject クラスから派生します。

例として、2 次元配列を見てみます。

#include <Arrays\ArrayDouble.mqh>
#include <Arrays\ArrayObj.mqh>
//---
void OnStart()
 {
  int i,j;
  int first_size=10;
  int second_size=100;
//--- 配列を作成する
  CArrayObj    *array=new CArrayObj;
  CArrayDouble *sub_array;
//---
  if(array==NULL)
    {
    printf("Object create error");
    return;
    }
//--- 子配列を作成する
  for(i=0;i<first_size;i++)
    {
     sub_array=new CArrayDouble;
    if(sub_array==NULL)
       {
        delete array;
        printf("Object create error");
        return;
       }
    //--- 配列に書き込む
    for(j=0;j<second_size;j++)
       {
        sub_array.Add(i*j);
       }
     array.Add(sub_array);
    }
//--- 配列作成に成功
  for(i=0;i<first_size;i++)
    {
     sub_array=array.At(i);
    for(j=0;j<second_size;j++)
       {
        double element=sub_array.At(j);
        //--- 配列要素を使用する
       }
    }
  delete array;
 }

注意点 #

このクラスは動的メモリを制御するので、配列の要素を操作する際には注意するべきです。

メモリ管理のメカニズムは、FreeMode (bool) メソッドを使用して有効/無効に出来ます。デフォルトではメカニズムは有効です。

よって、CArrayObj クラス操作の方法は 2 つあります。

1. メモリ管理のメカニズムが有効(デフォルト)

この場合、CArrayObj は、要素が配列から除去された後、要素に使用されていたメモリを解放する責任を負います。このプログラムでは、ユーザは、配列要素を解放してはいけません。

例:

  int i;
//--- 配列を作成する
  CArrayObj *array=new CArrayObj;
//--- 配列要素に書き込む
  for(i=0;i<10;i++) array.Add(new CObject);
//--- 何かする
  for(i=0;i<array.Total();i++)
    {
     CObject *object=array.At(i);
    //--- 要素に何かする
     にて。にて。にて。
    }
//--- 配列とその要素を削除する
  delete array;

2. メモリ管理のメカニズムが無効

この場合、CArrayObj は、要素が配列から除去された後、要素に使用されていたメモリを解放する責任を負いません。ユーザプログラムが配列要素を解放するべきです。

例:

  int i;
//--- 配列を作成する
  CArrayObj *array=new CArrayObj;
//--- メモリ管理のメカニズムを無効にする
  array.FreeMode(false);
//--- 配列要素に書き込む
  for(i=0;i<10;i++) array.Add(new CObject);
//--- 何かする
  for(i=0;i<array.Total();i++)
    {
     CObject *object=array.At(i);
    //--- 要素に何かする
     にて。にて。にて。
    }
//--- 配列要素を削除する
  while(array.Total()) delete array.Detach();
//--- 空の配列を削除する
  delete array;