パーレンと中置記法で出てきた YoYoGames 公式ドキュメントで示されているコードについて補足します。

このエントリーをはてなブックマークに追加

型が一致しない場合のエラーとか


    a = ((b == c) || d);

上記式は truefalse しか返しません。要するにこれは if ステートメントは別の書き方ができるってことで、

    if ((b==c)||d) { STATEMENT; };

これとやっていることは大差ありません。

ただし処理系に依存するため (b==c) の部分はサンプルとしてちょっと微妙で、型の一致しない変数を等価比較した場合の動作互換性を考慮していないです。

実際に (b==c) の部分は利用するビルドターゲット毎にエラーが出たり出なかったりします。型の不一致をきちんとチェックする場合と、チェックせず暗黙的にキャストされる場合もあるからです。

例えば HTML5 だと文字列型と数値の等価比較がエラー扱いにならない上、文字列型と数値で型が違っていてもコアーション(coercion=強制型変換)が機能してしまうので

    b="100"; c=100; if (b==c)

という記述はエラーが発生せず、かつ (b==c)true です。

    var a,b,c,d; // このコードはHTML5ではエラーが出ません
    a="sample";b="100";c=100;d=false;
    a=((b==c) || d); // この部分が本来は変数型の不一致です
    if a draw_text(x,y,a+"!?");


    GM_studio_14_debug_result_html5

しかし型の不一致のまま等価比較した場合、Windows PC や Android ではコンパイル後にエラーが出ます。これは型が不一致のまま等価比較したのが原因です。

Invalid comparison typeとエラーメッセージが出ているのが以下のスクリーンショット。

    GM_studio_14_debug_result_windowsPC_eroor

処理系依存について

基本的には HTML5 あるいは Javascript が型の不一致でも等価比較できてしまうから問題なのですが、これはバグではなく言語仕様の差です。そもそも GML はインタプリタなので演算における型の不一致をコンパイル前に検出できません。

しかし特定のスクリプト言語ではコアーション(強制型変換/coercion)があるため、文字列と数値の比較でもへっちゃらだし、文字列と数値を明示的なキャスト無しでも計算に利用できたりします。

    ("100"+100==200)

これが成り立ってしまう言語(Lua)があるってことです。

ちなみに上記例の場合、HTML5 モジュールでの出力はどうなるかというと

    GM_studio_14_debug_result_html5_corecion

文字列にキャストされました。

そして以下が Lua という計量言語におけるコアーションの結果です。

    Lua_corecion_result

処理系依存ですが同じ書き方でもエラーが出たり出なかったり、演算結果も違ってきます。GML を使う以上コードの互換性には気を付けたいので、なるべく無難にコードを書いたほうが良いです。

静的型付けな言語だとコンパイルすら通らないのですが、GML は動的型付けなのでビルドして実行するまでデータ型に依存したエラーは検出されないのです。

次のページへ

Leave a Reply

Your email address will not be published. Required fields are marked *

WordPress › Error

There has been a critical error on this website.

Learn more about troubleshooting WordPress.