最終更新:ID:1m8jKxq6Dw 2011年08月28日(日) 21:45:57履歴
ERBを書いているとよくやってしまうミスをまとめてみた。
うpする前にここを見てチェックすると幸せになれるはず。
うpする前にここを見てチェックすると幸せになれるはず。
以下の文はどちらもエラーを起こす。
このような単純なミスは、ぱっと見では意外と発見できないものだ。
テキストエディタの設定でキーワードを色分けするようにしておけば、こういったミスはすぐ発見できる。
TALENT:PLAYER;0 = 0前者は:が;になっている。後者はPRINTFORMLがPRNTFORMLになっている。
PRNTFORML %CALLNAME:MASTER%が調教中
このような単純なミスは、ぱっと見では意外と発見できないものだ。
テキストエディタの設定でキーワードを色分けするようにしておけば、こういったミスはすぐ発見できる。
分かりづらいが、以下の文はどちらもエラーを起こす。
後者は逆に、PRINTLと(の間にスペースが入っていない。
どちらも、キーワードと引数の区切りがされていないと判断されてしまうため、
「〜の行頭に不明な命令もしくは変数があります」とエラーになる。
また、イベント関数の属性指定(#PRI、#SINGLE、#LATER)は行末にスペースやタブを入れてはいけない。
全角スペースやタブは目に見えないため、この手のエラーは非常に気づきにくい。
テキストエディタによっては、こういった見えない記号が画面表示されるように設定できるので、
そういった機能のあるテキストエディタを使うことを薦める。
PRINTVL MONEY前者は、PRINTVLとMONEYの間に全角スペースが入っている。
PRINTL(誰か……助けて……)
後者は逆に、PRINTLと(の間にスペースが入っていない。
どちらも、キーワードと引数の区切りがされていないと判断されてしまうため、
「〜の行頭に不明な命令もしくは変数があります」とエラーになる。
また、イベント関数の属性指定(#PRI、#SINGLE、#LATER)は行末にスペースやタブを入れてはいけない。
全角スペースやタブは目に見えないため、この手のエラーは非常に気づきにくい。
テキストエディタによっては、こういった見えない記号が画面表示されるように設定できるので、
そういった機能のあるテキストエディタを使うことを薦める。
IF文が書かれたら、必ず対応するENDIFが書かれていなければならない。
では、以下の文はどうだろうか。
IF文を書く際、特にこの例のような多重構造のIF文の場合は、階層ごとにスペースやタブで
インデントを入れること。
上記の文にインデントを入れると以下のようになる。
では、以下の文はどうだろうか。
IF A == 2この文は、ENDIFが一行足りないのだが、どこに足りないのかが一見まったく分からない。
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
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
;助手の[小悪魔]を見る上記の文はどこもおかしいところがないように見えるが、これだけではエラーを起こす可能性がある。
SIF TALENT:ASSI:87
TIMES A,1.50
:
それは「助手がいない時」だ。
変数ASSIは、助手がいる時は助手のキャラ登録番号が入るが、助手がいない時には-1が代入される。
すると上記の式ではTALENT:-1:87を参照することになる。
キャラ登録番号が-1のキャラを参照しようとするが、登録番号は0〜(CHARANUM-1)の範囲しかないため、TALENT:-1:87を参照した時点で
「配列の不正な位置を参照しました」というエラーが出てしまう。
ASSIを使う時には、必ず
IF ASSI > 0のように、ASSIに助手番号がちゃんと入っているかどうかチェックすること。
SIF TALENT:ASSI:87
TIMES A,1.50
ENDIF
:
<と>の間違いには特に注意すること。他には&と|、/と%なども。
また、==と=は違う。変数の代入に使うのが = 、IF文等の比較に使うのが == 。よく、
また、==と=は違う。変数の代入に使うのが = 、IF文等の比較に使うのが == 。よく、
IF A = 0とやってしまうので気をつけよう。
最終行に改行がないため、最終行の命令(ENDIFなど)が認識されない。
結果として、見た目では正しく書けているはずなのに実行時エラーとなってしまう。
ERBの編集を行った後、「末尾の1行下」までエディタのカーソルが移動できるかを確認すれば
この事象は回避できる。
また、CSVにも同様に発生するため追加したコマンドが表示されないといった場合は
このチェックをやってみる事をお奨めする。
結果として、見た目では正しく書けているはずなのに実行時エラーとなってしまう。
IF A == 2上記では正しく書けている様に見えるが、ENDIFの行に改行がないため実行時エラーとなってしまう。
〜処理〜
ENDIF
ERBの編集を行った後、「末尾の1行下」までエディタのカーソルが移動できるかを確認すれば
この事象は回避できる。
また、CSVにも同様に発生するため追加したコマンドが表示されないといった場合は
このチェックをやってみる事をお奨めする。
Emueraは小数を切り捨てて0にする。
前者は「BASE / MAXBASE」の部分でBASE=MAXBASEの1か、小数になり切り捨てられて0かの2つにしかならない。
後者はBASEがMAXBASEの何%なのかを出せる。
BASE / MAXBASE * 100同じように見えるが、BASEは現在値MAXBASEは最大値なので通常BASE<MAXBASEである。
BASE * 100 / MAXBASE
前者は「BASE / MAXBASE」の部分でBASE=MAXBASEの1か、小数になり切り捨てられて0かの2つにしかならない。
後者はBASEがMAXBASEの何%なのかを出せる。
最新コメント
2024-07-04
2024-06-23
2024-06-20
2024-05-20
2023-02-01
2022-03-31
2022-02-13