C言語でいう構造体、Pascalでいうレコードは、関連のあるデータをあるやり方で並べて一塊にしたものです。Mac OSもC言語系でつくられていますから、システムの関数を呼ぶときには、このような構造体が必要になる場合があります。Mopsではこれをオブジェクトとして実現します。ちなみに、C++ではオブジェクトは構造体として実現されています。
システムコール関数に引数として渡すための構造体をつくるには、まずクラスの
インスタンス変数宣言を"68k_record{"と"}"で囲み、そのクラスのオブジェクトを生成した上で、そのオブジェクトを渡します。
:CLASS MyStruct super{ OBJECT }
68k_Record{
VAR 4ByteIvar
INT 2ByteIvar
BYTE 1ByteIvar
}
..........
これは、実際にAPIにある構造体ではありませんが、イメージはつかめるでしょう。メソッドの中では、それぞれのIvarにメッセージを送ります。構造体のポインタが必要ならば、上のようにスーパークラスをオブジェクトにしてクラス定義し、このクラスに属するオブジェクトの名前を書くだけです。この場合、オブジェクトのベースアドレスがちょうど、このIvar構造体のポインタと一致します。なお、ここで使った"BYTE"は1バイト幅のMops既定クラスです。
インスタンス変数専用オブジェクトであるBYTESとは別物です。注意してください。
上のワードの中で68k_record{は、ソースファイルの中では"record"と"{"の間に改行や空白(タブ)を挟むことができます。Mopsウィンドウから入力するときには、改行はできないようです。
なお、"68k"という文字が付いているのは、もちろん、PPC以前のMacintoshで採用されていたモトローラの68kシリーズのマシンのことを指しています。構造体の要素の配置の仕方は、効率の観点から、機械の規格に依存するものです。Carbon APIでは、かつてのAPIとの互換性を考えて、68k配置(アラインメント)が採用されているそうです。それでシステムに渡す構造体は"68k record"配置にする必要があるということのようです。これは、PPC構造体アラインメントとは異なる配置方法です。
PPCアラインメントの構造体にするには、"68k_Record{"の替わりに"Record{"を使います。使い方は同じです。
インスタンス変数を構造体にすることのメリットは、オブジェクトのサイズがコンパクトになることです。iMopsでは、"68k_Record{"は定義されていません。"Record{" を用いれば64ビットMacOSアラインメントで配置されます。
ちなみに、私は特別な理由がない限り、
インスタンス変数は"Record{ .... }"でくくっています。逆に、特別な理由がない限り、構造体型にはしないという人もいるようです。
スーパークラスをOBJECTにできない場合でも、構造体をつくり、そのポインタを取る方法はあります。これについては、別のページで説明します。
関連項目:
最終更新:2020年01月23日 23:25