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

小ワザ

ラベル型

なんだかよくわからないラベル型。
サンプルがほとんどないので、とにかくいろいろ使ってみましょう。

ラベル型って何?

簡単に言うと、gosub命令やgoto命令で使用するラベル*1を変数に入れることが出来るというものです。
たとえば、こんな記述をすることが出来ます。

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
    lb = *test    // lb は label (ラベル) の略
    goto lb        // ラベルじゃなくてラベル型変数
    stop
    
*test
    mes "Hello, world!"
    stop

ラベル配列の利用

ラベル型が本領発揮するパターンの一つに、配列での利用があります。

+  ラベル配列をつかってみる

長いですが……。

このサンプルに「防御コマンド」を追加するのはとっても簡単で、CmdId_Block を追加し、*Cmd_Block を実装し、cmdlist への代入を一部書き換えるだけですみます。

一方、ラベル配列を使わない場合は、たとえば、コマンドを実行する部分が次のように変わります。

+  switchを使う場合

ちょっと冗長ですね。
これにさらに防御コマンドを付けるには、コマンドが呼び出される場所をいちいち探したりする必要があり、すこし面倒です。

また、配列としてもっていれば、後述方法でユーザ定義命令に渡すことができます。

モジュールで使ってみる

モジュールで使用するには、いろいろと注意が必要です。

  • #deffuncや#defcfuncで定義する命令・関数の引数には、直接ラベル型を指定することが出来ません。
    そのため、いったんラベル型変数にラベルを代入し、その変数を var の引数として渡すようにします。
    しかし、マクロを使えばあたかもラベルを直接、命令の引数に指定したかのような記述が出来るようになります ( 下記の例を参照 )。
    • ちなみに、引数タイプに label を指定できますが、これは動作しないので注意してください。
    • あり得ない状況におけるバグではありますが、HSP3.1以前のバージョンでは、関数の引数にラベル・リテラルを書けません。
  • return命令でラベル型を返すことは出来ません。
    ラベル型を返したいときは、変数を介して返す必要があります。

使用例のサンプルを書いてみました。

+  モジュールサンプル

もちろん受け取ったラベルを命令内から呼び出す事も出来ます。

+  モジュールサンプル2

モジュール内に設置したラベルを モジュール外から呼び出すには少しコツが要ります。
モジュールの内部で定義した #deffunc や #defcfunc を呼び出す文がどこにもない場合、そのモジュールは不要なものと判断されて、最適化*2によって削除されてしまいます。
そのため、適当にダミーの命令を作って、呼び出されないような場所にでも書いておく必要があります。
また、モジュール内のラベルには、ラベル名に「@モジュール名」をつけないといけません。

+  モジュールサンプル3

出力メッセージにあるように、ラベルを含んだモジュールの位置は、実際にラベルが使われる場所よりも下でもかまいません。しかし、その場合は「*ラベル名@モジュール名」として参照できないので、定義をモジュールの外*3にする必要があります。

コメント

  • ようやくラベル型を使う機会が出来たので書いてみました。詳しい人追記お願いします。 [ojigi] -- GENKI? 2009-09-20 (日) 00:01:00
  • まだここ利用してる人いたんだ。最適化はcmpoptで抑制可能です。 -- 2009-09-26 (土) 00:10:14

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

*1 「*○○」と書く。サブルーチンとか。
*2 無駄を削ること
*3 モジュール名がない
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-07-04 (日) 01:16:45 (1253d)