トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     switch や if での場合分けの上限数
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
kumakuma
Åê¹ÆNo.28856
投稿日時: 2006-9-21 20:19
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
switch や if での場合分けの上限数
こんにちは。

今日は以前よりはましな質問だと思うのですが、
switch や if関数 に上限のcase数などはあるのでしょうか?

ひとつのインスタンスで1800行ほど書くと if が機能しなくなり、switchでやるともっと少ない行で機能しなくなります。

場合分けの個数はだいたい 40個ぐらいなんですが、ActionScriptでは制限があるのでしょうか?
KURAGE
Åê¹ÆNo.28866
投稿日時: 2006-9-21 23:23
常連
居住地: 東京都
投稿: 199
使用環境:
Flash 4?8/Lite 1?2
2000/XP
OSX 10.3
qurage.net
AS2HTML
Re: switch や if での場合分けの上限数
こんにちは

機能しなくなる、というのはif文自体が無効になってしまうという事でしょうか?

タイムライン上で4000回の条件判定を行うif?else if?ステートメントを実行してみましたが、
WinXP + Flash8のオーサリング環境上では問題無く動作しております。
(パブリッシュのタイミングでFlashが固まる事はありましたが・・・)

参考:4000回条件判定を行うIF文を生成する
// 出力結果をコピー&ペーストで使用
var loop = 4000;
trace('stop();');
trace('i = ' + loop + ';');
trace('if (0){}');
for (var i = 1; i <= loop; i++) {
	trace('else if (i == ' + i + ') { trace(i); }');
}
stop();
kumakuma
Åê¹ÆNo.28868
投稿日時: 2006-9-22 0:15
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
こんにちわ
お返事&テストありがとうございます。

そうですね。無効になる感じです。
2つのコンボボックスで片方を選択したときにもう片方の内容を変える というところで if構文を使っているのですが、

片方のコンボボックスのスクリプトで2000行に達するぐらいになるとプレビューしたときに連動するはずのコンボボックスが反応しないようになります。

if の回数ではなさそうなので、行数に上限があるんでしょうか?
KURAGE
Åê¹ÆNo.28869
投稿日時: 2006-9-22 1:20
常連
居住地: 東京都
投稿: 199
使用環境:
Flash 4?8/Lite 1?2
2000/XP
OSX 10.3
qurage.net
AS2HTML
Re: switch や if での場合分けの上限数
こんにちは 

・if処理自体は行われているけど、コンボボックスに反映されない
・if処理自体が行われなくなる

のどちらでしょう?
前者であればコンボボックス側の不具合も考えられます。

また、if構文自体に見落としがある可能性もありますので、
処理が確実に実行されるよう if (true) { ? } 等して動作を確認してみて下さい。
森 巧尚
Åê¹ÆNo.28870
投稿日時: 2006-9-22 1:26
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
単純に行数だけなら、if文を3000行ぐらい並べてみましたが、ちゃんと最後まで動きました。

ですが、コンボボックスに対して何かをしようとしているのであれば、さらにそのコンボボックス内でも何かの処理を行なうために処理が重くなってしまっているのではないでしょうか?

そもそも2000行ものスクリプトは多すぎますね。動かない原因が、もしどこかにバグが隠れているためだったとしても、そこを見つけ出すのは人間として大変ですよね。
同じような処理を繰り返している部分があるはずですから、ループ処理で対応するなど方法を考え直したほうがいいように思います。
もし、処理回数に問題があるのならば、処理回数を減らすなどして対策を考えることも試行錯誤しやすくなりますし。


----------------
森 巧尚
http://www.ymori.com

kumakuma
Åê¹ÆNo.28871
投稿日時: 2006-9-22 1:36
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
KURAGEさん森さんありがとうございます。
お世話になります。

if処理自体が行われるかとうかちょっと判断する技術をもっていないのですが、2000行の内95%は

addItem("項目",1);

のような行です。
これが多すぎるんでしょうか。。
森 巧尚
Åê¹ÆNo.28873
投稿日時: 2006-9-22 1:58
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
引用:

kumakumaさんは書きました:
2000行の内95%は

残りの5%がどのような処理なのかが大きな問題ですね。

しかし、95%もaddItemを使っているのなら、少なくともそこはループで処理できるのではないでしょうか。

例えば、a_cboというコンボボックスに2000回addItemをするならこのようにできます。
for (i = 0; i < 2000; i++) {
	a_cbo.addItem("Item" + i, i);
}


でも、コンボボックスを使っているのなら、1つ1つaddItemするよりも、
あらかじめ配列にデータを入れておいてdataProviderを使えば10倍ぐらいの速さで処理できると思います。
d_array = [];
for (i = 0; i < 2000; i++) {
	d_array[i] = {label:"Item" + i, data:i};
}
a_cbo.dataProvider = d_array;


----------------
森 巧尚
http://www.ymori.com

kumakuma
Åê¹ÆNo.28880
投稿日時: 2006-9-22 14:57
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
こんにちは

dataProvider は使おうとやってみたんですが、
label項目がかなりランダムなので

var list = ["A","D","G"];
my_cb.dataProvider = list;

のようにして設定したかったのですが、
data の部分を操作できなくなってしまい
つねに undefined になるのでひとつひとつlabel と data を両方設定できる additem() でやりまして。。。
森 巧尚
Åê¹ÆNo.28881
投稿日時: 2006-9-22 15:19
モデレータ
居住地: 宝塚
投稿: 650
使用環境:
.5/CS4/Safari3
XP+2000//IE6
Re: switch や if での場合分けの上限数
引用:

kumakumaさんは書きました:
つねに undefined になるのでひとつひとつlabel と data を両方設定できる additem() でやりまして。。。

「やりまして。。。」どうなったのですか???
addItemではうまくいったのですか?
もうすこし具体的にお願いします。

dataの設定をしていないからundefinedになるのは当然です。
dataを使うならdataの値を設定しないといけません。
var Llist = ["A", "D", "G"];
var Dlist = ["1", "2", "3"];
d_array = [];
for (i = 0; i < Llist.length; i++) {
	d_array[i] = {label:Llist[i], data:Dlist[i]};
}
my_cb.dataProvider = d_array;


----------------
森 巧尚
http://www.ymori.com

kumakuma
Åê¹ÆNo.28882
投稿日時: 2006-9-22 15:56
新米
居住地:
投稿: 14
使用環境:
WinXP
Flash 8 Professional
Re: switch や if での場合分けの上限数
どうもありがとうございます。

やりまして。。最初の if構文が機能しなくなるというところに戻っていたわけです。


教えていただいた方法でできそうです。
additem() をdataProvider におきかえてみます。

ありがとうございました。
(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops