オブジェクトとしての構造体

「オブジェクトとしての構造体」の編集履歴(バックアップ)一覧はこちら

オブジェクトとしての構造体」(2020/01/23 (木) 23:25:15) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

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にできない場合でも、構造体をつくり、そのポインタを取る方法はあります。これについては、別のページで説明します。 関連項目: -[[インスタンス変数]] -[[特別なインスタンス変数]] -[[パブリックインスタンス変数]] ---- [[トップページへ>トップページ]] < [[目次へ>Mops細説A面]] ----
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にできない場合でも、構造体をつくり、そのポインタを取る方法はあります。これについては、別のページで説明します。 関連項目: -[[インスタンス変数]] -[[特別なインスタンス変数]] -[[パブリックインスタンス変数]] ---- [[トップページへ>トップページ]] < [[目次へ>Mops細説A面]] ----

表示オプション

横に並べて表示:
変化行の前後のみ表示: