• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:objectから数値を取り出すには?)

オブジェクトから数値を取り出す方法とは?

このQ&Aのポイント
  • flashMX2004のactionscriptについて質問です。あるユーザー定義関数の中で作った変数をあとから利用しようとしても、その中身自体は参照できるが、演算や他の変数への代入ができない状況です。
  • 具体的には、ユーザー定義関数A内で配列haiAおよびhaiBを定義し、重複しないランダムな数字を格納しています。別のユーザー定義関数B内でhaiCを用意し、haiC[i]=haiA[i]+haiB[i]を実行したいのですが、NaNが返ってきています。
  • 配列を定義した直後に適当な数値を代入して演算すると正常に動作するため、問題はランダム生成&代入のプロセスにある可能性がありますが、理解が追いついておらず、よくわかりません。アドバイスをお願いします。

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

確かに関数もオブジェクトです。 しかし, 関数はオブジェクトであるとかオブジェクトでないとかいう問題ではなく, また, オブジェクト内の変数を取り出すとかいう前に, 関数内の変数は,関数の処理終了後削除されます。 「変数」 http://homepage3.nifty.com/ginga-b/MX/variables.html  ~中段下あたり 「変数の種類」より引用 ~ > ローカル変数は、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); //------------------- (ひょっとして使えましたら… のオマケです。)

pkpkpkpk
質問者

お礼

素晴らしい回答ありがとうございます。 論理的で大変分かりやすく、感動に打ち震えております。。 何時間も一人で悩んでいたのが嘘のように問題解決しました。 また様々な方法を示して頂いたお陰で、 知識がかなり深まりました。 ランダム整数配列のスクリプトも、作っていたものよりも はるかにシンプルで分かりやすかったので、 早速参考にさせていただきました。 この度は本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • オブジェクト形式の並び替え

    いつもお世話になっております。 標題についてご教授願えないでしょうか。 DBからデータをオブジェクト形式で取得しています(pg_fetch_object) これを配列に変換せずに、 中身をランダムに並びかえらる関数はありますでしょうか。 配列に変換せずにできればいいのですが。

    • ベストアンサー
    • PHP
  • 多次元配列への数値の代入。

    こんにちは。 今、多次元配列への数値の代入の仕方で、悩んでいます。 A[][] = new int[n][n]; B[][] = new int[n][n]; 上記のようなn行n列の配列を宣言し、nを入力します。 例えば、n=100と入力すると、100行100列の配列を定義したことになり、Aの配列には1~10000、Bの配列には10001~20000の数値を代入、200×200であれば1~40000、40001~80000…という感じにしたいのですが、いいアイディアが浮かびません。 また、1~nの間でランダムに数値を選び、その数値を代入というのも考えましたが、Javaで乱数を代入できるのかな?という疑問が出来てしまい、わからなくなってしまいました。 何かいい考えがありましたら、ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • VB2012でオブジェクト配列が使えますか?

    Visual Studio 2012 に含まれる Visual Basic で昔の Visual Basic 6のように、オブジェクト配列は使えないのでしょうか? 即ち Object 型で定義した配列に複数の Object を代入し、特定のプロパティーを全て同じ値にしてしまうようなことが出来れば、処理が簡単になるので便利です。色々試してみたのですが、私のレベルでは実現できないので、皆様の知識をお貸しください。

  • HSPで、listboxによって代入されたインデックス番号を演算子に直

    HSPで、listboxによって代入されたインデックス番号を演算子に直す方法がわかりません…。 例) ランダムに4つの数字を発生させて… 9 [+,-,*,/] 1 [+,-,*,/] 3 [+,-,*,/] 5 = 18 このとき選択された演算子が正しいかどうかを判断するプログラムを作りたいのですが 選択された演算子のインデックス番号を変数で受け取ったのはいいのですが、そのあとにどうすればいいのかわかりません…。 関数を使うのでしょうか?詳しくご説明お願いします。

  • プログラミングの分野

    プログラミングについて無知です。すみませんが、下に書いてある内容は、「OSS 」とか「Java言語」とか「Fortran言語」とか「UNIX」に関連する分野でしょうか ?関連するかしないか教えてください。 1 駅名の表示        ファイル名、注釈、文字列定数、エスケープ文字        システムのインストール 2 駅名の読み方       ヘッダーファイル、インクルードファイル、#include 3 駅名表示の切換え       変数、文字変数、ライブラリ関数、ラベル、goto文 4 曜日の算出       ネスト、書式、式、代入文、宣言、整定数、整変数、       代入演算子、(不)等値演算子、関係演算子、論理演算子、真/偽 5 借用権の値段       実数、実定数、実変数、実数名、評価 6 生年月日の入力       ブロック、複文、&演算子 7 利息計算       繰返し、ループ、ラベル(名札)、演算子の優先順序、       増分、初期設定 8 財産形成       演算子の優先順位、プログラムのトレース 9 結婚できるのはいつ       オーバーフロー、sizeof演算子、最適化、シフト演算子、       ループの種類 10 うるう年       関数の定義、関数の型、関数の値、パラメタ、仮引数、       実引数、返却値 11 法王の名前       ブロック構造、スコープルール、無限回ループ、       再帰的呼出し(recursive call)、コンマ演算子 12 おいらの予想       配列、#define、マクロ定義、long

  • flashliteでランダム(シャッフル)を作りたい。

    いつもお世話になります。今回ご質問させて頂く内容はFlashlite1.0で、1~10までの数字をランダムかつ同じ数字がかぶらないように表示する方法(シャッフル)です。Flashlite2.0からは配列が使え、考えればシャッフルする方法もあったのですが、1.0ですと配列が使えない為やり方がわかりません。FlashのASは経験あるのですが、Flashliteの知識や経験があまりなく困っております。どなたかお教え頂けたらと思います。 具体的な内容なのですが、今作ったスクリプトが以下です。iという文字にsetを使い擬似配列(?)を組みarray0~array9という変数をランダムな数字で表すといったスクリプトを組んだのですが、これだとランダムなので同じ数字が何回も出てきてしまいます。これを同じ数字は省いてダブる数字が無いようにしたいと思っています。 ▼スクリプト▼ num = 10; for(i = 0;i < num;i++){ set("array" add i,random(10)); } // 確認用 trace(array0); trace(array1); trace(array2); trace(array3); trace(array4); trace(array5); trace(array6); trace(array7); trace(array8); trace(array9); お手数お掛けして申し訳ありません。どなたかお教え頂ける方がいらっしゃいましたらよろしく御願い致します。 制作環境はAdobe Flash CS3です。

    • ベストアンサー
    • Flash
  • 列の数値群の数値の抽出方法(VBA)

    エクセルVBAでお願いします。 今、B列にRange(Cells(3,2),Cells(I.2))の範囲にランダムな実数値が 格納されているとします。(Iは変数) この数値群から、正の実数で最小値、または負の実数で最大値を抽出したいのですが、どのようなコードを組めばよいでしょうか。 数値群は大小順ではなくランダムに並んでいるとします。お願いいたします。数値群の数は約20000個あります。

  • 数値解析について

    数値解析について //配列d[0]からd[5]まですきな整数を //代入し、内容を小さい順に並べ替えよ // #include<stdio.h> #include<stdlib.h> int main(void) { ///配列の定義 int d[5]; int i; int j; int c; ///配列への数字の代入 d[0] = 3; d[1] = 20; d[2] = 5; d[3] = 9; d[4] = 2; d[5] = 40; ///ソート for(i=0;i<6;++i) { for(j=i;j<6;++j) { ///比較 if( d[i]>d[j] ) { c = d[i]; d[i] = d[j]; d[j] = c; } } } ///結果の表示 for(i=0;i<6;++i) { printf("no %d = %d \n", i+1, d[i]); } } をコンパイルして実効したんですが、なんか配列がちゃんとなりません。どこが間違っているでしょうか? また、 ///ソート for(i=0;i<6;++i) { for(j=i;j<6;++j) { ///比較 if( d[i]>d[j] ) { c = d[i]; d[i] = d[j]; d[j] = c; } } } の部分がどのようにコンピュータで処理されているのか分りません。どのような順番でiとかjが変っていきc = d[i]; d[i] = d[j]; d[j] = c;がどうやって代入を繰り返していっているのか教えてください。すごく長くなりそうですが、できればどうやってループして代入などを繰り返していっているのかコンピュータがやっている全部の過程(ソートと比較の部分です)を教えてください。自分は頭悪いんでどうやっていいか分らなくて混乱しています。 また、コンパイルして実効した時に printf("no %d = %d \n", i+1, d[i]); の部分はどのように表示されるんでしょうか? あと、なんでd[0]~d[4]までは定義しないんでしょうか? お願いします。

  • 変数の中は文字列か数値か調べたい。

    タイトルのとおり、変数に代入された値が 文字列か数値か調べたいのですが、 関数、モジュール、その他の方法等ありましたら 教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 二つのint型配列を一つにするには?

    2種類のint型配列にそれぞれ数が重ならないように数字を代入して行きます。この2種類のプログラムの違いは値を代入する方法以外はすべて同じです。ですから、ユーザー関数で一つにまとめようと考えてます。 2種類の違い:値を代入する方法がが違う。 (1)scanf()関数で人間が値を各要素に代入する。 (2)rand()関数でPC側が値を各要素に代入する。 配列への代入のルール (1)同じ値の場合は代入しなおさなければならない。 基本的には 人間側が値を要素に代入する場合 for( i = 0 ; i < 6 ; i++){ while(1){ scanf("%d",&dut[i]); for (j = 0; j < i ; j++){ if(dut[i] == dut[j]){flg = 1; break;} } if (flg == 0){break;} } } PC側がrand()関数を使い各要素に入力した場合 for( i = 0 ; i < 6 ; i++){ while(1){ pc[i] = rand()%43 + 1; for (j = 0; j < i ; j++){ if(pc[i] == pc[j]){flg = 1; break;} } if (flg == 0){break;} } } 以上の二つの違うところは「rand()関数かscanf()」どちらかが入るだけです。あとはみな同じつづりなのです。だから一つに出来ると思うのです。 共有して使える関数はどんどんまとめちゃうのが私の考えですので。 ※ヘッダ呼び出しや、変数定義など基本的な部分は省いてあります。 間違いがあるときはおしえてください。 ※また、別の方法があるときはぜひおしえてください。