甲府方重信Blog

...Shigenobu Koufugatas Blog

  • Increase font size
  • Default font size
  • Decrease font size
Error
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
  • Unable to load Cache Storage: database
Home 業務日誌 Adaプログラミング Adaチュートリアル セクション12.3 - アクセス値を使っての基本操作

Adaチュートリアル セクション12.3 - アクセス値を使っての基本操作

E-mail Print PDF

セクション 12.3 - アクセス値を使っての基本操作

さてそれでは、私たちはアクセス型の宣言が出来るようになり、少なくともそれらの潜在的な利用方法のいくらかを知ったので、アクセス値に対する基本操作について見ていきましょう。

有益な操作の一つは、新しいList_Nodeを作ることであろう、そしてこの新しく作成されたオブジェクトを参照するアクセス値がリターンされるというものです。これらの新しいオブジェクトは、通常のストレージ領域に作成されるでしょう。そして、なにかサブプログラムが返り値を持っているので、自動的に消去されることはないでしょう。あるストレージ領域に新しいオブジェクトを作成するプロセスは、アロケーションと呼ばれています。C言語においては、アロケーション操作は「malloc」と呼ばれており、一方、PascalとC++では「new」と呼ばれています。Adaもこの操作をnewと呼んでいます。そして、AdaはC++やPascalと同じような構文を持っています。キーワード「new」ハ、作成される型の名前が続きます。たとえば、ここではList_Node型の新しいオブジェクトを二つ作成する様子を示します。一つの値にアクセスするための「Current」の値を設定し、もう一つのものへの「Root」の値を設定します。

  Current := new List_Node;
  Root    := new List_Node;

この時点では、私たちはCurrentが一つのList_Nodeにアクセスし、Rootが別のList_Nodeにアクセスすることを示しているに過ぎません。

ひとたびアクセス値が実際のオブジェクト(nullであったものの代わりに)にアクセスすると、プログラマーは、アクセス値によってアクセスされたオブジェクトの中の値への参照のために「ドット」演算子を使用することが出来ます。これは、レコードで使用した構文と同じになっています。たとえば、私たちは新しいノードを二つ作成していますので、「Current」ノードに対するDataが1をアクセスし、Rootに対するDataの値が2へアクセスするように設定してみましょう。

  Current.Data := 1;
  Root.Data := 2;

アクセス値についてよい点は、プログラマーがこれらを使って、コンポーネントを互いに「接続する」ことによって、より複雑な構造にすることが出来ることです。プログラマーは、アクセス値への値の代入によってコンポーネントを「接続」することが出来ます。たとえば、Rootがアクセスした後の「next」のノードをCurrentがアクセスするものにするように、ノード同士を接続してみましょう。このための方法は、「Root.Next」の値を変更することによって行なえます。しかし、新しい値は何にすればよいでしょうか。そうです、新しい値は、「Current」の値と同じにすればよいのです。そうすれば、同じノードにアクセスすることになります。ここで、Adaでどのようにするかを示します。

  Root.Next := Current;

プログラマーがアクセス値について詳しくなければ、このことはいくらか頭痛の種かもしれません。代入文を読み解く一つの方法は、次のように読み解くものです。「Root.Nextを変更すると、Currentがアクセスしている同じものにアクセスするようになる」と。

このような構造を描画するための共通した方法が存在します。基本的に、各変数はひとつのボックスとして描かれます。レコードコンポーネントに分割されたレコードは複数のボックスとして描きます。非アクセス値に対しては、それらの値を書き込むだけです。アクセス値に対しては、「null」と書くか(その値がnullであった場合)、もしくは そのボックスからその値がアクセスしているボックスへの矢印となります。アクセス値への代入は、矢印の目的先を変更します。矢印の始点は、代入の左辺に記述され、矢印の新しい目的先が代入の右辺によって参照されているものとなります。ここまで私たちが行なった様子を次の図で示します。

[Access1]

ある場合においては、プログラマーはオブジェクトの断片の代わりに、オブジェクト自身にアクセスするようにしたい場合があると思います。このような場合、プログラマーは擬似コンポーネント「.all」を使用します。「.all」を伴ったアクセス値は、アクセス変数自身へのアクセスではなく、その値がアクセスするものに対する参照となります。たとえば、プログラマーはあるプロシージャー(ここではMy_Procedure)が入力としてTree_Nodeを要求していることにしましょう。そのようなプロシージャーの宣言は、簡単で次のようになります。

  procedure My_Procedure(Input : in Tree_Node);

しかし、この特定の宣言が与えられると、プログラマーはアクセス値をTree_Nodeに渡すことが出来なくなってしまいます。というのも、型が異なるからです。(アクセス値が、それ自身がアクセスするものと異なっている) このような場合を取り扱うためには、「.all」という単語を、オブジェクト全体を参照させるために単に使用します。

  My_Procedure(Current.all);

多くの人は、「.all」を伴った代入と伴わない代入について混乱するようです。ここでしっかりと区別しておきましょう。ここに、二つの似てはいるものの異なった二つの文があるとします。しかし、これらは意味の上ではまったく違っているのです。

  Root.all := Current.all;  -- Statement (1).
  Root     := Current;      -- Statement (2).

プログラマーは文(1)を実行した場合、プログラマーはCurrentがアクセスするすべての内容を取り、Rootがアクセスするものにそれらの内容をコピーすることになります。もしプログラマーが文(1)を実行する代わりに、文(2)を実行した場合には、プログラマーはRootがアクセスするノードには何も影響を与えることがありません。この場合、プログラマーはRoot自体の値を変更することによって、Rootが別のオブジェクトにアクセスするようになるでしょう。そのノードはCurrentがアクセスしているものになります。

次の図は、文(1)と文(2)の違いを示したものです。

[Access2] [Access3]

もしプログラマーがANSI Cに詳しければ、次の「対比表」を見て、Adaのアクセス型をどのように使ったらよいか理解するのに手助けになるかもしれません。

    Ada Statement or Declaration        ANSI C Equivalent
    --------------------------------    -------------------------------
    type Node_Access is access Node;    typedef node *node_access;
    Start : Node_Access;                node_access start = 0;
    Current := new Node;                current = malloc(sizeof(node));
    Current := Start;                   current = start;
    Current.all := Start.all;           *current = *start;
    Current.Data := 5;                  current->data = 5;

出典: http://www.adahome.com/Tutorials/Lovelace/s12s3.htm

Last Updated on Friday, 06 April 2012 12:06  

ニュース速報

さっきの件だが、資料の候補をあげて、増田さんに依頼メールを送った。

うまく、話がつながるとよいのだが。さて、どうなることやら。