2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語Mindの小技 「2次元配列の型紙」~変数の多次元配列の型定義~

2
Posted at

はじめに

日本語プログラミング言語Mindの小技「2次元配列の型紙」について説明したいと思います。

対象読者

日本語プログラミング言語Mindのユーザー、または日本語プログラミング言語に興味のある方

この小技に関連するMind言語マニュアル

この小技に関連するMind言語仕様の記述はMind8プログラミングマニュアルに記載があります。
5 配列
└2次元以上の配列は構造体・型紙へ‥
10 構造体・型紙
└構造体のアクセス
 └多次元配列を実現する場合
└型紙
 └型紙の定義

 構造体を定義すると、内部の変数や集合の組み合わせとして「型」の定義が行われるが、同時にそのための「領域確保」も行われる。この2つを分離し、「型の定義」と「領域確保」を別にするための概念が「型紙」である。
 この方法をとる利点としては、1つの型紙を使って複数の構造体を定義(実体を獲得)することができることが挙げられる。

他の言語、たとえばC言語で言うところの構造体は、Mindにおいては型紙に相当する概念であり、この点で用語の違いがある。

型紙の定義 
 型紙は構造体の機能のうち、型だけを定義するものである。
 定義の規則はほとんど構造体定義と同じであり、次のような形式で定義する。

  (型紙の定義)

構文=
<型紙名>は 型紙
            <変数名>は  ・・・
            <変数名>は  ・・・
        <集合名>は ・・と ・・と ・・
        <集合名>は ・・と ・・と ・・
    全体は
        ・・・と ・・・と ・・・。
 型紙はそれだけでは実体を持たないので、上記と別に実体を確保するための宣言が必要となる。そのためには、「○○は 構造体」の拡張機能として以下のような記述を使う。

  (実体の定義)

構文=
<構造体名>は 構造体 <型紙名>。

公式マニュアルでは複数の構成メンバを持つ構造体型の説明となっておりますので、本記事は2次元配列を例とした説明を補足する形となります。

本機能(本記事)は、下記のバージョンに対応しています。Mind8のLinux版も対応していると思いますが、本記事では特に検証を行っておりません。

対応バージョン

■Mind7 ■Mind8 ■Mind9
■Windows版 □Linux版

小技の解説

Mindの場合、2次元以上の配列の場合は、構造体(または型紙)の定義を使って宣言します。「型紙」はMindの構造体定義においてインスタンス生成(メモリ上の実体確保)を除いた型情報の定義のみをすることを意味する機能です。

こちらの記事において、2次元配列を「(Mindの)構造体」を使って定義する方法を解説しましたので、この記事では「型紙」を使って定義する方法を解説します。

2次元配列を「構造体」ではなく「型紙」で定義するメリットは同じ要素数構成の2次元配列インスタンスを多数宣言して使用する場合にあります。

「型紙」で構造体の型構造を定義した後は、実際に使用する実体変数をその型情報で宣言します。どちらかというと一般的な静的型付け言語の手順を踏むのがこちらですが、2次元配列のような基底の構成変数が単一の場合は「構造体」で宣言した方が手短にはなります。

サンプルを使って説明します。

Mindプログラムソース

katagami2dim.src
二次元配列例の型は 型紙
        二次元配列となる変数は 変数
    一次元配列となる集合は 5の 二次元配列となる変数
全体は 2の 一次元配列となる集合。

初期化用定数配列1は 定数配列 100,101,102,103,104。
初期化用定数配列2は 定数配列 200,201,202,203,204。

二次元配列の例1は 構造体 二次元配列例の型。
二次元配列の例2は 構造体 二次元配列例の型。

二次元配列を2重ループで値設定するとは (・ → ・)
        添え字1は 変数
        添え字2は 変数

    一次元配列となる集合の 要素数で 回数指定し ※要素数は型の情報として参照
        回数を 添え字2に 入れ

        二次元配列となる変数の 要素数で 回数指定し ※要素数は型の情報として参照
            回数を 添え字1に 入れ
            ※基底変数名はインスタンス名を装飾して参照(インスタンス名の~)
            添え字1と 添え字2を 加えて 二次元配列の例1の 二次元配列となる変数(添え字2,添え字1)に 入れ
            添え字1から 添え字2を 引いて 二次元配列の例2の 二次元配列となる変数(添え字2,添え字1)に 入れ 
        繰り返す

    繰り返す。

二次元配列を一次元配列となる集合でクリアするとは (・ → ・)
        添え字2は 変数

    一次元配列となる集合の 要素数で 回数指定し
        回数を 添え字2に 入れ
        ※集合名はインスタンス名を装飾して参照(インスタンス名の~)
        二次元配列の例1の 一次元配列となる集合(添え字2)を クリアし
        二次元配列の例2の 一次元配列となる集合(添え字2)を クリアし
    繰り返す。

二次元配列を定数配列で値設定するとは (・ → ・)
        添え字2は 変数

    一次元配列となる集合の 要素数で 回数指定し
        回数を 添え字2に 入れ
        二次元配列の例1の 一次元配列となる集合(添え字2)に 初期化用定数配列1を 入れ
        二次元配列の例2の 一次元配列となる集合(添え字2)に 初期化用定数配列2を 入れ
    繰り返す。

二次元配列で値設定するとは (・ → ・)
        二次元配列の例1を  二次元配列の例2に 入れること。

二次元配列の値を表示するとは (・ → ・)
        添え字1は 変数
        添え字2は 変数

    一次元配列となる集合の 要素数で 回数指定し
        回数を 添え字2に 入れ
        「添え字2:」を 表示し 添え字2を 数値表示し 改行し

        二次元配列となる変数の 要素数で 回数指定し
            回数を 添え字1に 入れ
              「    添え字1:」を 表示し 添え字1を 数値表示し 改行し
             「    二次元配列の例1の値: = 」を 表示し
              二次元配列の例1の 二次元配列となる変数(添え字2,添え字1)を 数値表示し 改行 
             「    二次元配列の例2の値: = 」を 表示し
              二次元配列の例2の 二次元配列となる変数(添え字2,添え字1)を 数値表示し 改行 
        繰り返す

    繰り返す。


メインとは (・ → ・)
    「配列初期状態(構造体宣言時)」を 一行表示し
    二次元配列の値を表示し
    改行し

    「2重ループで値設定」を 一行表示し
    二次元配列を2重ループで値設定して
    二次元配列の値を表示し   
    改行し

    「一次元配列となる集合でクリア」を 一行表示し
    二次元配列を一次元配列となる集合でクリアし
    二次元配列の値を表示し
    
    改行し
    「定数配列で値設定」を 一行表示し
    二次元配列を定数配列で値設定し
    二次元配列の値を表示し

       
    改行し
    「二次元配列で値設定」を 一行表示し
    二次元配列で値設定し
    二次元配列の値を表示。

構造体定義の終端要素変数名や集合名を実行文で引用する際には、構造体名の装飾は必要です。

各メンバの要素数は各層で取得できますが、中間メンバ名の行データの要素数を参照する場合は、構造体名の装飾は不要という点が注意事項です。型情報の中で静的に定義された要素数は実体変数の内容ではないので、構造体名の装飾は不要です。

コンパイル結果

ではコンパイルしてみます。下位ライブラリはfileを指定します。

Mind9

下図はMind9βです。

C:\developments\vscode\mind9>mind katagami2dim file   

日本語プログラミング言語 Mind Version 9.03 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\mind9-beta\mind9-beta\bin\mindex.exe --> katagami2dim.exe

Mind8

C:\developments\vscode\mind9>mind katagami2dim file

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> katagami2dim.exe

Mind7

C:\developments\vscode\mind9>mind katagami2dim file
日本語プログラミング言語 Mind Version 7.5 for Windows
          Copyright(C) 1985-2004 Scripts Lab. Inc.
          Single user license.  Serial No:********
コンパイル中 - 終了
Coping.. C:\mind7\bin\mindexec.exe -> katagami2dim.exe

実行結果

つづいて実行してみます。Mind8の結果です。記述は割愛していますがMind7/9βも同じです。

C:\developments\vscode\mind9>katagami2dim
配列初期状態(構造体宣言時)
添え字2:1
    添え字1:1
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:2
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:3
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:4
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:5
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
添え字2:2
    添え字1:1
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:2
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:3
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:4
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:5
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0

2重ループで値設定
添え字2:1
    添え字1:1
    二次元配列の例1の値: = 2
    二次元配列の例2の値: = 0
    添え字1:2
    二次元配列の例1の値: = 3
    二次元配列の例2の値: = 1
    添え字1:3
    二次元配列の例1の値: = 4
    二次元配列の例2の値: = 2
    添え字1:4
    二次元配列の例1の値: = 5
    二次元配列の例2の値: = 3
    添え字1:5
    二次元配列の例1の値: = 6
    二次元配列の例2の値: = 4
添え字2:2
    添え字1:1
    二次元配列の例1の値: = 3
    二次元配列の例2の値: = -1
    添え字1:2
    二次元配列の例1の値: = 4
    二次元配列の例2の値: = 0
    添え字1:3
    二次元配列の例1の値: = 5
    二次元配列の例2の値: = 1
    添え字1:4
    二次元配列の例1の値: = 6
    二次元配列の例2の値: = 2
    添え字1:5
    二次元配列の例1の値: = 7
    二次元配列の例2の値: = 3

一次元配列となる集合でクリア
添え字2:1
    添え字1:1
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:2
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:3
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:4
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:5
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
添え字2:2
    添え字1:1
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:2
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:3
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:4
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0
    添え字1:5
    二次元配列の例1の値: = 0
    二次元配列の例2の値: = 0

定数配列で値設定
添え字2:1
    添え字1:1
    二次元配列の例1の値: = 100
    二次元配列の例2の値: = 200
    添え字1:2
    二次元配列の例1の値: = 101
    二次元配列の例2の値: = 201
    添え字1:3
    二次元配列の例1の値: = 102
    二次元配列の例2の値: = 202
    添え字1:4
    二次元配列の例1の値: = 103
    二次元配列の例2の値: = 203
    添え字1:5
    二次元配列の例1の値: = 104
    二次元配列の例2の値: = 204
添え字2:2
    添え字1:1
    二次元配列の例1の値: = 100
    二次元配列の例2の値: = 200
    添え字1:2
    二次元配列の例1の値: = 101
    二次元配列の例2の値: = 201
    添え字1:3
    二次元配列の例1の値: = 102
    二次元配列の例2の値: = 202
    添え字1:4
    二次元配列の例1の値: = 103
    二次元配列の例2の値: = 203
    添え字1:5
    二次元配列の例1の値: = 104
    二次元配列の例2の値: = 204

二次元配列で値設定
添え字2:1
    添え字1:1
    二次元配列の例1の値: = 100
    二次元配列の例2の値: = 100
    添え字1:2
    二次元配列の例1の値: = 101
    二次元配列の例2の値: = 101
    添え字1:3
    二次元配列の例1の値: = 102
    二次元配列の例2の値: = 102
    添え字1:4
    二次元配列の例1の値: = 103
    二次元配列の例2の値: = 103
    添え字1:5
    二次元配列の例1の値: = 104
    二次元配列の例2の値: = 104
添え字2:2
    添え字1:1
    二次元配列の例1の値: = 100
    二次元配列の例2の値: = 100
    添え字1:2
    二次元配列の例1の値: = 101
    二次元配列の例2の値: = 101
    添え字1:3
    二次元配列の例1の値: = 102
    二次元配列の例2の値: = 102
    添え字1:4
    二次元配列の例1の値: = 103
    二次元配列の例2の値: = 103
    添え字1:5
    二次元配列の例1の値: = 104
    二次元配列の例2の値: = 104

C:\developments\vscode\mind9>

最後に下記の「二次元配列で値設定する」が実行されて、2次元配列の値が同期したことがわかります。

katagami2dim.src
二次元配列で値設定するとは (・ → ・)
        二次元配列の例1を  二次元配列の例2に 入れること。

参考情報

この小技を使った記述例の記事です。

おわりに

いかがでしたでしょうか?なにかの参考になれば幸いです。

  • ほとんどの記事ではMind7、8、そして9βでの検証を行っています。
  • Mind8公式マニュアルの基礎情報をベースに、Mind7・8の上級者向け情報も網羅しています。

興味を持たれた方は日本語プログラミング言語Mind公式サイトにアクセスすると、Mindコンパイラをダウンロードできますよ。

面白い!、楽しい、カンタン、難しいのも書ける!みんなでやってみよう:relaxed:しい、カンタン、難しいのも書ける!みんなでやってみよう:relaxed:

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?