文字列操作におけるエラー文字列

ウディタの文字列操作におけるエラーのまとめと、その有効(?)活用方法について。

文字列操作におけるエラーの一覧

ウディタの文字列操作時に、特定の不正な代入を行うと 代入先の文字列に専用のエラー文字列が代入されます。

エラー文字列と、そのエラー文字列が代入される条件は以下の通りです。

エラー文字列一覧
エラー文字列エラー文字列が代入される条件
<<ERROR>>ロード位置に指定された呼出値が、文字列のものでない。
または、ファイルリスト読み込み時に、指定したフォルダが見つからない
<NoFile>ファイル内容読み込み時に、指定したファイルが見つからない
<<NotFound>>文字列切り出し時に、目印となる文字列が見つからない

※<NoFile>のみ、囲いの大なり小なり記号が1つずつなので注意!

いずれも「そりゃあエラーになるよね」というものばかりですが、ウディタの扱いに慣れてきて、自作システムに挑戦……なんて時に、意外と見落としてしまうものもあります。

これらのエラーが厄介なのは、俗にいう緑帯エラーが出ないこと。不具合の原因が文字列操作時のエラーだった時に、気づくのが遅れてしまいがちなのです。

本来 これらのエラー文字列は、条件分岐に組み込むことでエラーを回避するためのもの(だと思う)なので、緑帯エラーが出ないのは当然といえば当然なのかも知れませんが……^^;

では各エラーの詳細を見てみましょう。

各エラーの詳細

<<ERROR>>(その1)

ロード位置を変数で指定する時に、文字列の呼出値以外を格納した変数を指定してしまうと、このエラー文字列が代入されます。

下のサンプルコードでは、文字列0,1に"<<ERROR>>"が代入されます。

(文字列0番に、通常変数0番の値を代入しようとして失敗している例) ■変数操作: このEvのセルフ変数0 = 2000000 + 0 ■文字列操作:S0[] = 位置[このEvのセルフ変数0]の文字列
(そもそも呼出値(1,000,000以上)の指定が出来ていない例) ■変数操作: このEvのセルフ変数1 = 123456 + 0 ■文字列操作:S1[] = 位置[このEvのセルフ変数1]の文字列

ただ、このエラーには有効利用方法があります。下記サンプルコードをご覧ください。

※基本システム2.20で有効なコードです。

▼ EvSelf[0]=ウルファールの名前 のアドレス(呼出値) ■変数操作: このEvのセルフ変数0 = 1100001200 + 0 ▼ EvSelf[1]=ウルファールのLv のアドレス(呼出値) ■変数操作: このEvのセルフ変数1 = 1100001204 + 0 ▼ ■文字列操作:S0[] = 位置[このEvのセルフ変数0]の文字列 ■文字列操作:S1[] = 位置[このEvのセルフ変数1]の文字列

文字列0番にはウルファールの名前が問題なく代入されますが、文字列1番には"<<ERROR>>"が代入されます。

ロード位置内容結果
1100001200可変DB[0:12:0]
ウルファールの名前
文字列を格納する内容だったので、問題なく代入に成功
1100001204可変DB[0:12:4]
ウルファールのLv
数値を格納する内容だったので、代入に失敗

数値 及び 数値を格納する変数にアクセスした場合のみエラーになることを逆手にとり、アクセスした先が変数なのか文字列なのかを判別することが出来るというわけですね。

(もちろん、判別したいアクセス先の呼出値が正しく設定されている場合の話です

これは基本システム内でも使われているテクニックだったりします。

<<ERROR>>(その2)

ファイルリストを取得する対象のフォルダが見つからない場合も、"<<ERROR>>"が代入されます。

▼ 『Sample』というフォルダを、Dataフォルダ内に用意していなければエラーになる。 ■文字列操作:S1[] =<→のフォルダのファイルリスト取得> "Data/Sample/"

これは余談になりますが、フォルダ名の全角半角は区別されず、最後のフォルダ区切りがなくても問題なく動作します。(ウディタver.2.21時点)

▼ すべて問題なく動作する。 ■文字列操作:S0[] =<→のフォルダのファイルリスト取得> "Data/SystemFile" ■文字列操作:S0[] =<→のフォルダのファイルリスト取得> "Data/systemFile/" ■文字列操作:S0[] =<→のフォルダのファイルリスト取得> "Data/SYSTEMFILE/"

<NoFile>

ファイル内容読み込みの際に、対象のファイルが見つからない場合はエラーになります。まぁ当然です。

ここで注意すべき所は、このエラー文字列だけ 囲いの大なり小なり記号が1つずつ というところです。

例えば、下記のコードは正常に機能しません。

▼ 予め用意しておいた文字列を、Readmeテキストファイルとして出力。 ▼ ただし、Readme.txtに直接何らかのメモを ▼ 書き込んでいるかもしれないユーザーに考慮して、 ▼ 『Readme.txtが見つからなければ』という条件付きで行う。 ■文字列操作:S0[一時文字列] =<ファイル内容読込> "Readme.txt" ■条件分岐(文字): 【1】 S0[一時文字列]が "<<NoFile>>" と同じ -◇分岐: 【1】 [ S0[一時文字列] "<<NoFile>>" と同じ ]の場合↓ |■文字列操作:S1[Readme内容] =<を→のファイルに出力> "Readme.txt" |■ ◇分岐終了◇

囲いの大なり小なり記号の数が違うので、~と同じ の条件を満たすことが出来ません。

<<NotFound>>

最後は文字列切り出しの際のエラーで、~まで切り出し あるいは ~以降を切り出し のときの、「~」の文字列が見当たらなければこのエラー文字列が代入されてしまいます。

下記サンプルコードでは、文字列0番には正常に「あいうえお」と代入されますが、1番の方がエラーになります。

■文字列操作:S0[] = "あいうえお,かきくけこ" ■文字列操作:S1[] = S0[] ■文字列操作:S0[] =<から指定文字まで切り出し> "," ■文字列操作:S1[] =<の指定文字以降を切り出し> "、"

カンマの半角と全角を間違えてしまった例ですね。

カンマやダブルクォートで区切ったデータを文字列として格納していて、それらを切り出しを駆使して取り出す……という処理をしていると引っかかりやすいエラーかも知れません。

本来取り出したいデータではなく、エラー文字列を取り出してしまい、それを緑帯エラーでは警告してくれないわけですからね。

文字列の条件『~を含む』を使うなりして うまく回避しましょう。

その他のエラー

エラー文字列を取得できないため ここまでは触れませんでしたが、『代入先を変数で指定』に失敗した場合の挙動は以下の通りです。

代入先に、数値変数の呼出値を指定してしまった場合

代入先となる変数に「0」が格納されます。

仮に代入内容をすべて半角数値、たとえば「1234」にしていたとしても、指定した変数には「0」が格納されてしまいます。

代入先に、呼出値の領域でない数値(例:100万未満)を指定してしまった場合

何も起きません。緑帯エラーの警告もないため、これが不具合の原因となっている場合に気づきにくいので気を付けましょう。

最後に

自作システムを作る際に エラー文字列を駆使した条件分岐を作ることで、いくらかのエラー対策が出来るようになるかと思います。

筆者もまだまだ勉強中の身ではありますが、この記事がウディタリアンの皆様にとって、何らかの参考になればと思います。

アザー


広告

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA