dポイントプレゼントキャンペーン実施中!

ActionScript3で乱数を取得しなおかつ隣とかぶらない続き

以前この質問をさせてもらったのですが、http://okwave.jp/qa/q6030004.html
前回の答えを少しステップアップを目的に処理を一つの関数にすればソースがすっきりできるのではないかと思い以下のようにしてみましたが変数の値が保存されません。

(前回のページを参照:http://okwave.jp/qa/q6030004.html)
function btnClickAction(aaa:int,bbb:int,ccc:int,txt:TextField,ddd:int):void {
var past:int=aaa;
var now:int=bbb;
var nowPartner:int=ccc;
var txtArea:TextField=txt;
var max:int=ddd;

past=now;
//臨時の配列を初期化
var tmpArr:Array=new Array ;
//臨時の配列の要素0~9に数を代入
for (var i:int=0; i<=max-1; i++) {
tmpArr[i]=i+1;
}
//臨時の配列のpast要素を抜きとる
tmpArr.splice(past-1,1);
//臨時の配列のpartPartner要素を抜きとる
for (i=0; i<=tmpArr.length-1; i++) {
if (tmpArr[i]==nowPartner) {
tmpArr.splice(i,1);
}
}
//今のデータを作成
var rnd:int=Math.floor(Math.random()*tmpArr.length);
now=tmpArr[rnd];
//今のデータを表示
txtArea.text=String(now);
}
にして
btn1.addEventListener(MouseEvent.CLICK, btn1Click);
function btn1Click(evt:MouseEvent):void {
 btnClickAction(past1,now1,now2,txt1,10);
}
とするとpast1,now1,now2の値が保存されないのです、やはりこの処理は一つの関数にはできないのでしょか?

■制作環境 FlashCS4 ActionScript3

A 回答 (1件)

こんにちは



結論から言うと、引数が参照渡しではないのでpast1,now1,now2に変更後の値が反映されません。

ActionScriptではプリミティブデータ型は値渡しになるので、
渡した後の変更が元の変数に反映されません。

関数内で操作したデータは戻り値によって返したほうがいいのではないでしょうか?
ActionScriptには連想配列があるので、それを利用すれば複数のデータをまとめて返すことも簡単ですね。
引数を参照渡しで渡して、内部で変更をかけるよりも。
関数の戻り値を受け取り、それを操作したほうがわかりやすいかと思います。

プリミティブデータ型がなんだとか、値渡し?参照渡し?などといった部分の説明は省きます。
ご自身で調べてみてください。

がんばってください
    • good
    • 0
この回答へのお礼

プリミティブデータ型、値渡し、参照渡し、あとリファレンスデータ型も調べてみました。
いままでActionScriptの本を何冊も見てきましたが、値渡しや参照渡しなどの説明は書いてありませんでした。

変数の値のやり取りに上記のようなことがあったんですね、これってけっこう基本で大事な部分ですね、また新しい知識を手にいれることができました。

もう一度がんばって関数を完成させたいと思います。

お礼日時:2010/07/24 12:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!