電子書籍の厳選無料作品が豊富!

flashMX2004のactionscriptについてです。
あるユーザー定義関数の中で作った変数をあとから利用しようとしても、
その中身自体はパスを指定して参照できるのですが、
その中身を用いた演算や、ほかの変数に値を代入することがどうしてもできず、困っています。
具体的には、まず、ユーザー定義関数A内で配列haiAおよびhaiBを定義して、
そこにそれぞれ1~10の重複しないランダムな数字を格納しています。
そして別のユーザー定義関数B内で別の配列haiCを用意して、
for文を使いhaiC[i]=haiA[i]+haiB[i]を実行したいのですが、
これを記述してもこの時haiAおよびhaiBがobject型(typeofによる)であるためか、
うまく演算をしてくれません。trace(haiC)としても、NaNが返ってきます。
trace(haiA)だとちゃんと数値が出力されるのですが、
これを使った演算などのみうまくいかない状態です。
配列を定義した直後に適当な数値を代入して演算してみるとうまくいくので、
object型とやらになっているのは
ランダム生成&代入のプロセスに原因があるような気がするのですが、よく分かりません。

いまいち概念を理解しておらず、わかりにくい説明で大変恐縮ですが、
お気づきの点等ありましたらアドバイスよろしくお願いいたします。

A 回答 (1件)

確かに関数もオブジェクトです。


しかし,
関数はオブジェクトであるとかオブジェクトでないとかいう問題ではなく,
また,
オブジェクト内の変数を取り出すとかいう前に,
関数内の変数は,関数の処理終了後削除されます。

「変数」
http://homepage3.nifty.com/ginga-b/MX/variables. …
 ~中段下あたり 「変数の種類」より引用 ~
> ローカル変数は、functionの実行時のみ存在し、
> 終了と同時にメモリ上から削除されます。
> function以外の場所で、var宣言しても、
> ローカル変数とはならず、
> メモリ上から削除されることはありません。


というわけで,
ユーザー定義関数 A() で作成された(される)変数を
ユーザー定義関数 B() で使いたい場合は次のような方法取ります。

・A() の実行段階でその中の変数は外へ出して,
 後からその変数を B() で使う。

・A() を実行する前に B() を実行させて,
 そこから A() に引数を渡す。

・B()の変数は外へ出して置いて,
 後からその変数を A() で使用する。

 などなど…



次に,失敗例 と 成功例のいくつか を示します。
あくまでも例です。
また,重複しないランダムな配列要素を作成する部分は省略しています。
また,全ての変数の型指定は話がややこしくなるので省略しています。
(元から私は厳密な型指定はあまり使いませんが。)
つまり,それらについて触れると,
場合分けがさらに多くなって本題が見えにくくなるので省略しています。



//--- 失敗例 --------------
//
// ユーザー定義関数 A の定義
function A() {
var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9);
}
//
// ユーザー定義関数 B の定義
function B() {
var haiC = new Array();
for (var i = 0; i<=9; i++) {
haiC[i] = haiA[i]+haiB[i];
}
trace(haiC);
//↑結果:NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN,NaN
}
//
// ユーザー定義関数 A と B の実行
A();
B();
//-------------------------

↑A() の実行後,即,
  ローカル変数 haiA と haiB は削除されるので,
  B() からその変数は参照できません。




//--- 成功例 1 --------------
//
// 配列 haiA haiB の作成
var haiA = new Array();
var haiB = new Array();
//
// ユーザー定義関数 A の定義
function A() {
haiA = [1, 3, 5, 7, 9, 2, 4, 6, 8, 10];
haiB = [2, 4, 6, 8, 10, 1, 3, 5, 7, 9];
}
//
// ユーザー定義関数 B の定義
function B() {
var haiC = new Array();
for (var i = 0; i<=9; i++) {
haiC[i] = _root.haiA[i]+_root.haiB[i];
}
trace(haiC);
// ↑結果:3,7,11,15,19,3,7,11,15,19
}
//
// ユーザー定義関数 A と B の実行
A();
B();
//-------------------------

↑変数 haiA と haiB をあらかじめ _root に作成し,
  A() の実行ではまずその変数を書きかえ,
  B() からその変数を参照するので成功します。




//--- 成功例 2 --------------
//
// ユーザー定義関数 A の定義
function A() {
_global.haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
_global.haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9);
}
//
// ユーザー定義関数 B の定義
function B() {
var haiC = new Array();
for (var i = 0; i<=9; i++) {
haiC[i] = _global.haiA[i]+_global.haiB[i];
}
trace(haiC);
// ↑結果:3,7,11,15,19,3,7,11,15,19
}
//
// ユーザー定義関数 A と B の実行
A();
B();
//-------------------------

↑A() の実行で haiA と haiB は
  グローバルな変数として作成されます。
  B() からそのグローバル変数を参照するので
  成功します。




//--- 成功例 3 --------------
//
// ユーザー定義関数 A の定義
function A() {
var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9);
// haiA と haiB を連結して戻り値として返す
return (haiA.concat(haiB));
}
//
// ユーザー定義関数 B の定義
function B() {
var haiC = new Array();
// 配列 haiD に A() の戻り値を代入
var haiD = new Array();
haiD = A();
for (var i = 0; i<=9; i++) {
haiC[i] = haiD[i]+haiD[i+10];
}
trace(haiC);
// ↑結果:3,7,11,15,19,3,7,11,15,19
}
//
// ユーザー定義関数 B の実行
B();
//-------------------------

↑まず B() が実行され,
  B() から A() を実行させ値を取ってきます。
  A() には戻り値を返し,
  B() はその戻り値を受け取って
  後の処理をするため成功します。




//--- 成功例 4 --------------
//
// ユーザー定義関数 B の定義
function B(m, n) {
var haiA = new Array();
haiA = m;
var haiB = new Array();
haiB = n;
var haiC = new Array();
for (var i = 0; i<=9; i++) {
haiC[i] = haiA[i]+haiB[i];
}
trace(haiC);
// ↑結果:3,7,11,15,19,3,7,11,15,19
}
//
// ユーザー定義関数 A の定義
function A() {
var haiA = new Array(1, 3, 5, 7, 9, 2, 4, 6, 8, 10);
var haiB = new Array(2, 4, 6, 8, 10, 1, 3, 5, 7, 9);
// ユーザー定義関数 B の実行
B(haiA, haiB);
}
//
// ユーザー定義関数 A の実行
A();
//-------------------------

↑まず A() が実行され,
  A() から B() を実行させますが,
  そのとき B() に引数を送ります。
  B() はその引数を受けとって
  後の処理をするため成功します。




他にもまだ方法や場合があるとは思いますが,
このような方法である関数の値を別の関数ので参照させます。

だいたいは
「成功例 2」のグローバル変数を作成する方法か,
「成功例 4」の次の関数へ引数を渡す方法を使うことが多いのではないかと思います。

「成功例 2」ではグローバル変数を使用していますが,
グローバルではなくて, _root に変数を置いても,また MC の中に変数を置いても良いです。
とにかく関数外に変数を出すということが必要です。





~・~ オマケ ~・~・~・~・~・~・~

「重複しないランダムな整数配列の作成 」

//-------------------
var nyuuArr = new Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
var mylen = nyuuArr.length;
// 出力配列の作成
var syutsuArr = new Array();
//
for (i=0; i<mylen; i++) {
//
// nyuuArr の要素数までの整数の乱数を取得
var ran = Math.floor(Math.random()*nyuuArr.length);
//
// 出力配列 に入力配列の乱数番目の要素を代入
syutsuArr[i] = nyuuArr[ran];
//
// 入力配列の乱数番目の要素を抜き取る
// (nyuuArr.length はこの時点で1つ減る)
nyuuArr.splice(ran, 1);
//
}
//
trace(syutsuArr);
//-------------------


(ひょっとして使えましたら… のオマケです。)
    • good
    • 0
この回答へのお礼

素晴らしい回答ありがとうございます。
論理的で大変分かりやすく、感動に打ち震えております。。
何時間も一人で悩んでいたのが嘘のように問題解決しました。
また様々な方法を示して頂いたお陰で、
知識がかなり深まりました。

ランダム整数配列のスクリプトも、作っていたものよりも
はるかにシンプルで分かりやすかったので、
早速参考にさせていただきました。

この度は本当にありがとうございました。

お礼日時:2006/10/23 21:33

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