• ベストアンサー

Flash 8 レベル反復

Flash8 Win-XP で作業しています。 SharedObject を利用したデータを制作していますが、ある「btn_script」を押すと、 1 つのアクション内で 256 レベルの反復を超えました。 無限ループの可能性があります。 このムービーではこれ以上のアクションの実行は無効になります。 と「出力」されます。 この警告はなにを意味するものでしょうか? ・データ全体に関する「警告」でしょうか? ・このスクリプトのみに関する「警告」でしょうか? ご存知の方教えていただけませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.1

for や while でループの終了条件が成立せずループから抜け出せなくなった場合、システムのフリーズなど最悪の事態を避けるために、Flash Player は警告を出してスクリプトの実行を中断するかどうかを尋ねてきます。 その警告もこれと同様の措置です。一箇所で処理が延々と繰り返されるだけで先に進めなくなった時、システムを守るために強制的にスクリプトが中断されます。 例えば、関数内で自分自身を呼び出す”再帰呼び出し”において、再帰を終了する条件に不備があるとその警告が出ます。 //*** //呼び出した回数 times = 0; //自分自身を呼び出す関数 function Self_Call() { //呼び出した回数を数える times++; trace( times ); //自分自身を再度呼び出す Self_Call(); } Self_Call(); //*** 関数を呼び出すと、一旦もとの流れから外れて関数で定義された処理を行い、関数が終了すると、もとの流れに戻ってきて続きのスクリプトが実行されます。 ActionScript では関数内で自分と同じ名前の関数を呼び出すこともできますが、その際は、ある条件になったら呼び出しをやめるように設計しなければなりません。 しかし、上記のスクリプトでは呼び出しの終了条件を定めていないため、一度関数が呼び出されると延々と自分自身を呼び出し続け、もとの流れを遠く離れてどんどん支流に逸れていく一方です。 結局、いつまでも最初の Self_Call(); を終了することができないために、もとの流れには二度と戻れません。これはつまり、スクリプトの実行がこの一箇所で滞ってしまってここから先に進めないということなので、再帰呼び出しを 256 回繰り返した時点でスクリプトの実行そのものが強制的に打ち切られます。 ご質問の件は、何が原因で先に進めなくなっているのか分かりませんが、「特定の条件が成立するまで同様の作業を繰り返す」というような再帰的な特性を持つ処理に何か問題があるのではないでしょうか。 再帰呼び出しでは、終了条件を入れたつもりでも実は誤りがあって条件が成立せず、終了できなくなっていることがよくあります。 SharedObject に書き込むデータを収集する・ SharedObject から取り出したデータを解析して利用する処理あたりに、再帰的な特性があるように思います。 データが複雑すぎる入れ子構造になっていないかどうか、解析する時に終了条件がきちんと成立するかどうかなどを、確認してみてはいかがでしょう。

mcx
質問者

お礼

大変詳細にご説明いただき有難うございました。 SharedObject でのcookie容量を超えたデータの保存によるエラーかと考えて質問させていただきましたが、システム上の永遠反復によるものだとのことで、システムの設計により解消できるとのことですね。 早速考え直してみます。

関連するQ&A