Hatena::ブログ(Diary)

senzogawaのNな日々 このページをアンテナに追加 RSSフィード

2004 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2011 | 01 | 03 | 04 | 05 | 06 |
2012 | 01 | 08 | 09 |
2013 | 02 |

2006-12-06

文字列でフラグ

| 文字列でフラグを含むブックマーク 文字列でフラグのブックマークコメント

 NScripterグローバル変数フラグを保存したい場合、単に変数一つ一つをフラグとして使う方法はあるのだが、この場合、フラグが増えると異なるフラグで変数番号が衝突してしまったりする危険性が高くなる。


 ラベルログやファイルログでうまく対処できることもあるが、そういった対応が難しい場合、フラグを使うのは仕方ないにしても、せめて、使用する変数番号の数を最小にしたいところだ。

 というわけで、文字列をフラグ群として扱うサンプルを作成してみた。

http://senzogawa.s90.xrea.com/dl/sflag.zip


 やり方は、まず、"0000"といった形式で文字列を保存しておき、0をOFF、1をONと見立てる。

 そして、1番目がONなら"1000"といったように、左から順に、指定された位置の文字をフラグとして扱う。

 要するに2進数でのフラグを逆にしたような形なので、知っていれば難しくはないと思う。


 ちなみに、仕組み自体は、実際に音楽ファイルの読み込み判定に使っている。

 音楽ファイルはファイルログが出ないようなので、この方法は有効だったと思う。


 コードとしては以下のようになる。複合条件のテストをしてないので、動作は保障しない。

0001: ;; FILE:    sflag.nsc
0002: ;; MODULE:  sflag
0003: ;; BRIEF:   文字列フラグを操作する。
0004: *sflag
0005: defsub sflaginit
0006: defsub sflagon
0007: defsub sflagoff
0008: defsub sflagat
0009: defsub sflagonall
0010: defsub sflagoffall
0011: numalias flag_arg,100
0012: numalias flag_self,flag_arg
0013: numalias flag_ret,flag_arg+1
0014: numalias flag_pos,flag_arg+2
0015: numalias flag_len,flag_arg+3
0016: return
0017: 
0018: 
0019: ;; FUNC:  文字列フラグを初期化する。
0020: ;; USAGE: sflaginit $フラグ,フラグ
0021: ;; NOTE:  フラグ数は1以上を指定すること。
0022: *sflaginit
0023: getparam s%flag_self,%flag_len
0024: if %flag_len<1 mesbox "sflag: invalid length","ASSERT!":end
0025: mov $%flag_self,""
0026: for %flag_len=%flag_len to 1 step -1
0027: 	add $%flag_self,"0"
0028: next
0029: return
0030: 
0031: 
0032: ;; FUNC:  文字列フラグの指定位置を立てる。
0033: ;; USAGE: sflagon $フラグ,位置
0034: ;; NOTE:  位置は0以上フラグ数未満であること。
0035: *sflagon
0036: getparam s%flag_self,%flag_pos
0037: len %flag_len,$%flag_self
0038: if %flag_pos<0 mesbox "sflagon: negative index","ASSERT!":end
0039: if %flag_pos>=%flag_len mesbox "sflagon: over max index","ASSERT!":end
0040: mid $flag_self,$%flag_self,0,%flag_pos
0041: mid $%flag_self,$%flag_self,%flag_pos+1,%flag_len
0042: mov $%flag_self,$flag_self+"1"+$%flag_self
0043: return
0044: 
0045: 
0046: ;; FUNC:  文字列フラグの指定位置をおろす。
0047: ;; USAGE: sflagoff $フラグ,位置
0048: ;; NOTE:  位置は0以上フラグ数未満であること。
0049: *sflagoff
0050: getparam s%flag_self,%flag_pos
0051: len %flag_len,$%flag_self
0052: if %flag_pos<0 mesbox "sflagoff: negative index","ASSERT!":end
0053: if %flag_pos>=%flag_len mesbox "sflagoff: over max index","ASSERT!":end
0054: mid $flag_self,$%flag_self,0,%flag_pos
0055: mid $%flag_self,$%flag_self,%flag_pos+1,%flag_len
0056: mov $%flag_self,$flag_self+"0"+$%flag_self
0057: return
0058: 
0059: 
0060: ;; FUNC:  文字列フラグの指定位置の値を取得する。
0061: ;; USAGE: sflagat %値(0:off、1:on),$フラグ,位置
0062: ;; NOTE:  位置は0以上フラグ数未満であること。
0063: *sflagat
0064: getparam i%flag_ret,s%flag_self,%flag_pos
0065: mid $flag_ret,$%flag_self,%flag_pos,1
0066: atoi %%flag_ret,$flag_ret
0067: return
0068: 
0069: 
0070: ;; FUNC:  文字列フラグのすべての位置を立てる。
0071: ;; USAGE: sflagonall $フラグ
0072: ;; NOTE:  
0073: *sflagonall
0074: getparam s%flag_self
0075: len %flag_len,$%flag_self
0076: mov $%flag_self,""
0077: for %flag_len=%flag_len to 1 step -1
0078: 	add $%flag_self,"1"
0079: next
0080: return
0081: 
0082: 
0083: ;; FUNC:  文字列フラグのすべての位置をおろす。
0084: ;; USAGE: sflagoffall $フラグ
0085: ;; NOTE:  
0086: *sflagoffall
0087: getparam s%flag_self
0088: len %flag_len,$%flag_self
0089: mov $%flag_self,""
0090: for %flag_len=%flag_len to 1 step -1
0091: 	add $%flag_self,"0"
0092: next
0093: return


 そういえば書いてなかったと思うが、サクラエディタならコピペして「^[0-9]{4}: 」を空文字列に正規表現で置換すると行番号を削除できる。

 自分でもダウンロードすら面倒な時は、そうやって動かすことが多い。

トラックバック - http://d.hatena.ne.jp/senzogawa/20061206