ホーム >> 左脳Script >> Adobe Flash >> Action Script >> 理不尽な VerifyError とシーケンス ~ifとbreakとcontinue~

理不尽な VerifyError とシーケンス ~ifとbreakとcontinue~



VerifyError: Error #1068: int and * cannot be reconciled.

実行時に、上記のエラーが出て止まってしまいます。
しかも、内部のスタックやらなんやらの情報がずらずらとトレースされるのですが、なんのことやらサッパリ判りません。


原因究明調査の旅へ

ところが、検索してみてもまともな(判りやすい)回答が見つかりません。
仕方が無いので、ソレっぽい情報を纏めてみました。

  1. かろうじて「int and * cannot be reconciled.」が、「int と * は一緒に出来ない」云々言っている所までは判った。

  2. http://d.hatena.ne.jp/mzp/20081109/abc
    にて、ソレっぽい情報を得た。

    どうやら if 文や関係演算子が絡むらしい。

    しかし、コード中には、一切一つも全く関係演算子を使っていない。 しかし、意味不明のトレースを見るに、Flash の中間言語?バイトコードニーモニック?が表示されているので、 コンパイルすると、関係演算子と同じ形になるコードがあるのかもしれない。


  3. 検索結果の残骸にある僅かな文章からヒントを得た。
    ActionScript で switch ブロック内で if 文を使うと VerifyError ...
    出力されるエラーメッセージは「VerifyError: Error #1068: [クラス名] and [クラス名] cannot be reconciled.」となります。 ところでこの現象、break すると再現しなくなります。↓に正常動作するコードを示します。 for (var i:int = 0; i < 10; ...
    yamuyam.com/2009/01/actionscript-verifyerror-1068/ - 類似ページ
    もはや、キャッシュも残っていないページだが、この概要文中に「break を入れると出ない」とある。


時には直感に従う事も肝要

「if 等の条件分岐」「breakなどの制御文」など、シーケンス制御文が絡む事から、コード中にある「countinue文」も、今回の不具合に絡んでいるのではないか?と直感しました。

実際のコードは「while ステートメントの中に、多数のif があり、conntinue と break でかなり複雑な?シーケンスを組んでいる」ものです。(後述参照)

そこで、上記の直感に従い「コード中の continue を全て削除し、if と else で同等のシーケンスにする」ようコードを調整してみました。
すると「なんと言う事でしょう!」、ばっちり「VerifyError: Error #1068: int and * cannot be reconciled.」が出なくなり、内部状態の膨大なトレースも吐き出される事は無くなりました。

問題のあったシーケンス記述。

while(~)
{
    if(~)
    {
        if(~)
        {
            if(~)
            {
                ~
                break;
            }
            ~
            continue;
        }
        ~
        if(~) break;
        if(~)
        {
            ~
            continue;
        }
        if(~)
        {
            ~
            continue;
        }
        ~
    }
    ~
}








 >> 
「continue文の排除」修正をした。

while(~)
{
    if(~)
    {
        if(~)
        {
            if(~)
            {
                ~
                break;
            }
            ~
        //  continue;
        }
        else
        {
            ~
            if(~)
            {
                break;
            }
            else if(~)
            {
                ~
            //  continue;
            }
            else if(~)
            {
                ~
            //  continue;
            }
            else
            {
                ~
            }
        }
    }
    else
    {
        ~
    }
}



実は元々は ActionScript2.0 でエラーも出ずに動作していたコードだったのですが、これを ActionScript3.0 へ持ってきた所で、このような理解不能の不具合に見舞われる事になってしまったのです。


こんな事が原因だったとは・・・まさに青天の霹靂。


オチ

コードのシンタックスには問題が有りませんし、現に ActionScript2 環境で動作していたのに、ActionScript3 で何故不具合を起こすのでしょうか。シーケンスがしっかり判断されていないのでしょうか?ActionScript2 より ActionScript3 のコンパイラが馬鹿になってしまったのでしょうか?

現在、コンパイラは Flex SDK に頼っている(バージョン 3.4.0.9721)が、ここに問題があるのかもしれません。


根本的な原因が掴めませんでした。しかし、回避方法はなんとか判ったと思います。


コードシンタックス的?に問題が無くても、ifステートメントは、if{~}else{~}の形に書かないと、 コンパイラに正しく理解してもらえない。

「言ってる事がイカに論理的に正しくても、くどいほど判りやすく説明しないと理解を得られない」

まさに、現実の人間関係でもありそうな事が、まさに「たかがActionScriptコーディング」で起きてしまったのだ。
こんなのは現実だけで十分ではないか。むむむ。

今日の教訓:シーケンス制御記述は真面目に書きましょう。



トラックバック(0)

トラックバックURL: http://n-yagi.0r2.net/sanoupulurun/mt-tb.cgi/239

コメントする

ホーム >> 左脳Script >> Adobe Flash >> Action Script >> 理不尽な VerifyError とシーケンス ~ifとbreakとcontinue~

アーカイブ

このブログ記事について

このページは、n-yagiが2009年11月25日 22:32に書いたブログ記事です。

ひとつ前のブログ記事は「HTMLLoader を使った Web ページのサムネイル表示」です。

次のブログ記事は「ニコニコ動画をダウンロードするには」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。