atoiについて調べてみた
 movとsplitによって文字列を構造体のように扱ったりする場合に使うatoi命令ですが、ふと気になったのでその動作について調べてみました。以下スクリプト。

*define
defsub test
game

*test
getparam $0
atoi %0,$0
%0@
return

*start
;atoiは半角数字の文字列を数字に変換する
test "1"
;全角数字は変換できない
test "1"
;半角数字以外の文字が出てきた場合、その直前までを変換する
test "1,2"
;全く変換できない場合は0を返す
test ";"

end


 コメントにも書いてありますが、一応説明。
 atoi命令は「半角数字の文字列を数字に変換する」文字列です。変換対象は半角数字文字列のみであり、全角数字やその他の文字は変換できません。文字列中に変換できない文字があった場合、その直前の文字列までを変換します。もし文字列が全く変換できない場合は0を返します。

 atoi命令では全角数字を変換できませんが、自作命令で簡単に作れます。以下、全角数字変換命令atoi2のスクリプトです。

*define
defsub atoi2
game

*atoi2
getparam i%0,$0
mov $1,""
*atoi2_loop
mid $2,$0,0,2
if $2 < "0" goto *atoi2_end
if $2 > "9" goto *atoi2_end
if $2 == "0" add $1,"0"
if $2 == "1" add $1,"1"
if $2 == "2" add $1,"2"
if $2 == "3" add $1,"3"
if $2 == "4" add $1,"4"
if $2 == "5" add $1,"5"
if $2 == "6" add $1,"6"
if $2 == "7" add $1,"7"
if $2 == "8" add $1,"8"
if $2 == "9" add $1,"9"
len %1,$0
mid $0,$0,2,%1
goto *atoi2_loop

*atoi2_end
atoi %%0,$1
return

*start
atoi2 %10,"12"
%10@
end


 特に難しいことはしていません。もし挙げるとすれば文字列同士の大小比較とmidの使い方くらいでしょうか。動作に関してはatoi命令とほぼ同一で、違いがあるとすれば全角と半角に対する処理が反転している点です。もし全角も半角も関係なく変換したいのであれば、atoi2命令のif文羅列に半角数字に対する処理を追加し、終了判定を弄ればOKです。



 次回更新時は、スプライトの位置情報を取得できるようにlsp命令を上書きする話について書こうと思います。



[2009年2月26日追記]
 atoi2命令ですが、負の値を正しく変換できない不具合があることに気がつきました。ループに入る前に
mid $2,$0,0,2
if $2 == "-" add $1,"-"

 とすれば負も変換できるはず。
[PR]
by lyricist_m | 2009-02-24 21:08 | NScripter
<< スプライトの位置を取得する ダブルオー >>