×

よくある誤り

ERBを書いているとよくやってしまうミスをまとめてみた。
うpする前にここを見てチェックすると幸せになれるはず。


文法の間違い

タイプミス
以下の文はどちらもエラーを起こす。
TALENT:PLAYER;0 = 0
PRNTFORML %CALLNAME:MASTER%が調教中
前者は:が;になっている。後者はPRINTFORMLがPRNTFORMLになっている。
このような単純なミスは、ぱっと見では意外と発見できないものだ。
テキストエディタの設定でキーワードを色分けするようにしておけば、こういったミスはすぐ発見できる。
見えない誤字
分かりづらいが、以下の文はどちらもエラーを起こす。
PRINTVL MONEY
PRINTL(誰か……助けて……)
前者は、PRINTVLとMONEYの間に全角スペースが入っている。
後者は逆に、PRINTLと(の間にスペースが入っていない。
どちらも、キーワードと引数の区切りがされていないと判断されてしまうため、
「〜の行頭に不明な命令もしくは変数があります」とエラーになる。

また、イベント関数の属性指定(#PRI、#SINGLE、#LATER)は行末にスペースやタブを入れてはいけない。

全角スペースやタブは目に見えないため、この手のエラーは非常に気づきにくい。
テキストエディタによっては、こういった見えない記号が画面表示されるように設定できるので、
そういった機能のあるテキストエディタを使うことを薦める。

対応しないENDIF

IF文が書かれたら、必ず対応するENDIFが書かれていなければならない。
では、以下の文はどうだろうか。
IF A == 2
IF B > 3
C = 3
ELSE
C = B
ENDIF
ELSEIF A == 1
IF B > 2
C = 2
ELSE
C = B
SIF B != C
D += 1
ELSE
A = 1
ENDIF
この文は、ENDIFが一行足りないのだが、どこに足りないのかが一見まったく分からない。
IF文を書く際、特にこの例のような多重構造のIF文の場合は、階層ごとにスペースやタブで
インデントを入れること。

上記の文にインデントを入れると以下のようになる。

 IF A == 2
 	IF B  3
 		C = 3
 	ELSE
 		C = B
 	ENDIF
 ELSEIF A == 1
 	IF B  2
 		C = 2
 	ELSE
 		C = B
 	ENDIF		←このENDIFが抜けていた
 	SIF B != C
 		D += 1
 ELSE
 	A = 1
 ENDIF

ASSIのチェック忘れ

;助手の[小悪魔]を見る
SIF TALENT:ASSI:87
TIMES A,1.50
    :
上記の文はどこもおかしいところがないように見えるが、これだけではエラーを起こす可能性がある。
それは「助手がいない時」だ。
変数ASSIは、助手がいる時は助手のキャラ登録番号が入るが、助手がいない時には-1が代入される。
すると上記の式ではTALENT:-1:87を参照することになる。
キャラ登録番号が-1のキャラを参照しようとするが、登録番号は0〜(CHARANUM-1)の範囲しかないため、TALENT:-1:87を参照した時点で
「配列の不正な位置を参照しました」というエラーが出てしまう。

ASSIを使う時には、必ず
IF ASSI > 0
SIF TALENT:ASSI:87
TIMES A,1.50
ENDIF
     :
のように、ASSIに助手番号がちゃんと入っているかどうかチェックすること。

条件式の間違い

<と>の間違いには特に注意すること。他には&と|、/と%なども。
また、==と=は違う。変数の代入に使うのが = 、IF文等の比較に使うのが == 。よく、
IF A = 0
とやってしまうので気をつけよう。

最終行の改行

最終行に改行がないため、最終行の命令(ENDIFなど)が認識されない。
結果として、見た目では正しく書けているはずなのに実行時エラーとなってしまう。
IF A == 2
 〜処理〜
ENDIF
上記では正しく書けている様に見えるが、ENDIFの行に改行がないため実行時エラーとなってしまう。
ERBの編集を行った後、「末尾の1行下」までエディタのカーソルが移動できるかを確認すれば
この事象は回避できる。
また、CSVにも同様に発生するため追加したコマンドが表示されないといった場合は
このチェックをやってみる事をお奨めする。

小数

Emueraは小数を切り捨てて0にする。
BASE / MAXBASE * 100
BASE * 100 / MAXBASE
同じように見えるが、BASEは現在値MAXBASEは最大値なので通常BASE<MAXBASEである。
前者は「BASE / MAXBASE」の部分でBASE=MAXBASEの1か、小数になり切り捨てられて0かの2つにしかならない。
後者はBASEがMAXBASEの何%なのかを出せる。

FOR〜NEXT

FOR LOCAL:0, 6, 12
 IF ABL:(ARG:0):(LOCAL:0)
  LOCAL:1 += 1
  IF LOCAL:1 > 1
   BREAK
  ENDIF
 ENDIF
NEXT
PRINTFORML {LOCAL:0}
この場合ABLの6〜11が1以上ならLOCAL:1が増えていく。
LOCAL:0が12になるとループが止まるのでABLの12はチェックされない。

またCONTINUEやBREAKが入るとFORでループさせる変数(上の例だとLOCAL:0)が1増える。
上の例でLOCAL:0が9のときBREAKするとPRINTFORMLで出てくるのは10になる。

Menu

メニュー







他OSで動かす方法



リンク

どなたでも編集できます

広告募集中