hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
可変長構造体 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

written by kz3

可変長構造体

構造体とは

構造体とは複数の異なるビット列のデータを1つのデータ型として定義したものです。
詳しい説明はちょくとさんのところで^^;
ちょくとさんのトップページ下部にはサイト内ワード検索が出来る入力ボックスがあるので「構造体」として検索すればサイト内の関連ページがいろいろ出てきます。
これを私kz3は「ちょこっと検索ボックス」と名づけました。(ちょくとさん見てるかな。´ロ`)

通常の構造体のサイズはメンバのバイト数とパディングを考慮すれば構造体のサイズは計算できます。
簡単なものとしてRECT構造体を見てみよう。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
-
|
|
|
|
!
    typedef struct tagRECT{
        LONG left;
        LONG top;
        LONG right;
        LONG bottom;
    } RECT;

LONG型は32ビット(4バイト)なので全体で16バイトですね?この構造体をHSPで作るには、

Everything is expanded.Everything is shortened.
  1
 
    dim rect , 4

とします。sdimではだめなのでしょうか?
sdimでもいけますがメモリへのアクセス方法が変わってきます。
dimは要素へのアクセスに添え字を使えますがsdimには使えません。
dimでは1要素32ビットなのでrect構造体の各メンバへアクセスするのに好都合というわけです。
しかし構造体の中には16ビットや8ビットのメンバが混在しているものもあります。
そういう時はsdimでメモリを確保しますがこちらは添え字によるアクセスは出来ない(1次元配列の場合)のでメモリ読み書き命令(関数)を使ってアクセスします。

可変長構造体とは

(普通の)構造体はサイズが固定です。
これに対して可変長構造体とは構造体のサイズが可変。不変ではないのです。変わるのです。
実行時にプログラマが構造体のサイズを増やしたり減らしたりして使います。
といっても制限なしに増やせるわけではありませんし、ベースとなる構造体のサイズ未満にすることはできません。
構造体の最後のメンバに限ってそのメンバのサイズを構造体の後ろのメモリに伸ばしていけるのです。
構造体の途中のメンバのサイズを増やしていったらそれ以降のメンバのオフセットが変わってしまいますものね?

ここでは例としてパレット設定で使っているLOGPALETTE構造体について説明します。(ただし、パレット設定では実際はPALETTEENTRY構造体の配列だけあればいいのです・・・。)

LOGPALETTE構造体とPALETTEENTRY構造体

まだ内容は書き途中です。
とりあえず構造体の定義だけ。
  • LOGPALETTE構造体
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
    
    -
    |
    |
    |
    !
    
        typedef struct tagLOGPALETTE {
            WORD         palVersion;
            WORD         palNumEntries;
            PALETTEENTRY palPalEntry[1];
        } LOGPALETTE;
    LOGPALETTE構造体は2つの16ビット整数型と1つのPALETTEENTRY構造体をメンバに持っています。
  • PALETTEENTRY構造体
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
    
    -
    |
    |
    |
    |
    !
    
        typedef struct tagPALETTEENTRY {
            BYTE        peRed;
            BYTE        peGreen;
            BYTE        peBlue;
            BYTE        peFlags;
        } PALETTEENTRY;
    PALETTEENTRY構造体は4つの8ビット整数型をメンバに持っています。

使用例

コメント

  • 書き途中なり〜。 -- kz3 2005-10-02 16:05:23 (日)

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:45:04 (2436d)