基本変数で二次元配列を扱いたいのですが、記述方法が分かりません。(質問掲示板

投稿: Logo mini hightoller 投稿:2011/05/16 00:26:16(最新:2011/05/22 00:23:22)
rurun9さんがWikiに書かれている「スクリプト/配列」で、
二次元配列に付いて書かれているのですが、

setVariable("a", createArray() )
  getVariable("a")[n] = createArray()


この場合、a[n][m]はローカル変数となるのでしょうか。
defをまたげず、1st argument is not arrayのエラーがでます。

色々試してみたのですが正解には至りませんでした。
a[n][m]を基本変数にする方法を、
何方か御教授願います。

コメントする

コメントするには、ログインする必要があります。

コメント一覧

Logo mini hightoller(投稿日:2011/05/22 00:23, 履歴)
b = createArray()
#と代入すると、
#bはb[0]~b[n]の集合体となり、
b[0] = 3
#基本変数として宣言したい場合も
setVariable("b", b)#で事足りる。

b = getVariable("b")[0]
speak(toString(b) )
Logo mini hightoller(投稿日:2011/05/21 23:39, 履歴)

setVariable(getVariable(getVariable("c")[0]), 3 )と記述した場合、
("c")[0]に代入するのではなく、その中身に代入される。
#もし開始スクリプト等で
setVariable("a", createArray() )
setVariable(getVariable("a")[0],"Itemname")
#と、変数cの配列に変数名を代入しておけば、
setVariable(getVariable(getVariable("a")[0]), 3 )
b = getVariable("Itemname")
speak(toString(b) )
#なんて使い方もできる。
Logo mini hightoller(投稿日:2011/05/21 23:13, 履歴)
#質問の答えの結論としては
n=0
setVariable("a", createArray() )
getVariable("a")[n] = createArray()
#で、すでに("a")[n][m]は基本変数になっていて、
#何も代入はしてないので("a")[n][m]はnullであり、

#チャプター超えて
n=0;m=0
b = getVariable("a")[n][m] #と呼び出せば、
speak(toString(b)) #で「null」と出る。

n=0;m=0
setVariable("c", createArray() )
getVariable("c")[n] = createArray()
getVariable("c")[n][m] = 3
#と、("c")[n][m]に代入しておけば

#チャプター超えて
n=0;m=0
d = getVariable("c")[n][m] #と呼び出せば、
speak(toString(d)) #で「3」と出る。
Logo mini hightoller(投稿日:2011/05/21 22:08, 履歴)
う、長い。解決策及び詳細な説明有難う御座います。
きちんと消化してから実験、その結果をWikiに書いてみようと思います。
   mini ___(投稿日:2011/05/21 20:35, 履歴)
なんとまあ。

setVariable("b", b)からの
b = getVariable("b")とは、目からウロコの気持ちです。

こんな動きが出来るんですねぇ。
Nyan mini rurun9(投稿日:2011/05/21 16:37, 履歴)
なるほどなるほど、そりゃそうですよね。
というよりちゃんと確認してから書くようにしますよorz

有難うございました
Zararu128x128 mini dycoon(投稿日:2011/05/21 15:49, 履歴)
Rmakeのご利用ありがとうございます。

変数と配列のあたりなど説明不足な点もあるかなと考えましたので
補足的な説明をさせていただきたいと思います。

まず、変数とはなにかというと
値(数値、文字列、配列)を保持する、名前をつけられた物です。
変数と値は別のものだということに注意してください。

次のような例があった場合
c = a + b
setVariable("c", getVariable("a") + getVariable("b"))

aは変数名で、
aに対応する値をとってきて足し算をおこない
cという変数名の変数に足し算の結果の値を保持するようにします。

ローカル変数と基本変数も
どちらについても値そのものではなく変数です。
ローカル変数はイベント、チャプターや関数内で変数の寿命が終わり、
基本変数はイベント、チャプターや関数を超えた寿命があります。
また、基本変数はセーブ時に基本変数名とそれに対応する値の対を
サーバーに保存します。

以下のような表現をされていましたが

>GV("オクラ")[m] = CA()
>だと、オクラ[m]はまだローカル配列。

値(ここでは特に配列)がローカルということはなく
"オクラ"という基本変数名に対応した値に対する操作が
ここではおこなわれているということになります。

よって、GV("オクラ")[m]で代入した値は保存されます。
以下に2次元配列の場合の検証用コードを載せます。
#
def initA()
  setVariable("a", createArray())

  i = 0

  while i < 2
    getVariable("a")[i] = createArray()
    j = 0
    while j < 2
      getVariable("a")[i][j] = toString(i + 1) + ", " + toString(j + 1)
      j = j + 1
    end
    i = i + 1
  end
  
end

def speakA()
  i = 0

  while i < 2
    j = 0
    while j < 2
      speak("getVariable(\"a\")[" + toString(i) + "][" + toString(j) + "] = " + getVariable("a")[i][j])
      j = j + 1
    end
    i = i + 1
  end
end

initA()
speakA()


これは以下のような出力をおこないます。

getVariable("a")[0][0] = 1, 1
getVariable("a")[0][1] = 1, 2
getVariable("a")[1][0] = 2, 1
getVariable("a")[1][1] = 2, 2


また、文字数を減らすためにローカル変数を利用して以下のように書くこともできます。
#
def initB()
  b = createArray()
  
  i = 0

  while i < 2
    b[i] = createArray()
    j = 0
    while j < 2
      b[i][j] = toString(i + 2) + ", " + toString(j + 2)
      j = j + 1
    end
    i = i + 1
  end
  
  setVariable("b", b)
end

def speakB()
  b = getVariable("b")

  i = 0

  while i < 2
    j = 0
    while j < 2
      speak("b[" + toString(i) + "][" + toString(j) + "] = " + b[i][j])
      j = j + 1
    end
    i = i + 1
  end
end

initB()
speakB()


これは以下のように出力されます。

b[0][0] = 2, 2
b[0][1] = 2, 3
b[1][0] = 3, 2
b[1][1] = 3, 3


この書き方でも関数を超えて値を扱えていることが
わかるかと思います。

また、getVariableを余分に重ねることで
意図通りの動作が得られたとありますが、
動いているように見えているだけで
実際には違う動きをしているということについても
ふれたいと思います。

たとえば以下のコードを実行します
#

setVariable("c", createArray())

setVariable( getVariable(getVariable("c")[0]), 3 ) 

speak("getVariable(\"c\")[0] = ", getVariable("c")[0])
speak("getVariable(getVariable(\"c\")[0]) = ", getVariable(getVariable("c")[0]))
speak("getVariable(getVariable(getVariable(\"c\")[0])) = ", getVariable(getVariable(getVariable("c")[0])))



すると次のような結果が出力されます。

getVariable("c")[0] = null
getVariable(getVariable("c")[0]) = 3
getVariable(getVariable(getVariable("c")[0])) = null

getVariable("c")[0]は空のデータを表すnullであり
nullに対応する基本変数に3が保存されています。
そのため、ひとつだけの変数を処理するのならばうまくいきますが
複数の変数を処理する場合問題が出るかと思います。

よろしくお願いします。
Nyan mini rurun9(投稿日:2011/05/17 11:15, 履歴)
ローカルなのか基本なのかは書き方が異なるので、最初に変数に中身が入った時点で決まっちゃいますよー

wiki スクリプト/配列
のコメント欄を古い順に読むと流れがわかるかと思いますが
#配列の要素に代入するときはsetじゃなくてgetで良いからややこしい
getVariable("a")[i]=n

配列基本変数に中身を入れる場合は、書き方だけローカルっぽくても大丈夫という事です。
setVariable( getVariable(getVariable("a")[i]), n )
を簡単に書けるようにしてくれた、喜ぶべきポイントかなぁ、と。

なのでこんな感じで
def C_Spr(ss,xx,yy,xw,yh)
 SV("Spr",createArray())
 SV("ss",ss)
 GV("Spr")[GV("ss")]=createArray()
 GV("Spr")[GV("ss")][1]=xx*80
end
Logo mini hightoller(投稿日:2011/05/16 23:35, 履歴)
GV("オクラ")[m] = CA()
だと、オクラ[m]はまだローカル配列。
SV(GV("オクラ")[m],CA())
と基本配列に指定した場合、
GV(GV("オクラ")[m])=0
と、呼び出さないといけないのかな?
と推測を立てています。

誰も踏み込む必要の無い領域に
足を突っ込んじゃった気がする。。
   mini ___(投稿日:2011/05/16 22:08, 履歴)
def F_Hairetu(n)
  setVariable("オクラ" , createArray())
  m = 0
  while (m < n)
    # こっちだと動きます
    #getVariable("オクラ")[m] = createArray()
    # こっちだと動きません
    #setVariable(getVariable("オクラ")[m] , createArray())
    m = m+1
  end
  m = 0
  while(m < n)
    l = 0
    while(l < 3)
      getVariable("オクラ")[m][l] = m*l
      l = l+1
    end
    m = m+1
  end
end

n = 3
m = 0
F_Hairetu(n)
while(m < n)
  l = 0
  while(l < 3)
    speak("オクラ[" , m , "][" , l , "] = " , 
   getVariable("オクラ")[m][l])
    l = l+1
  end
  m = m+1
end



とりあえず書きなぐってみましたが、一ユーザーなので
詳しくどうこうと語ることは出来ません、すいません。

ただ、
GV() = CA()とすると動き、
SV(GV()[] , CA())とすると動きませんでした、とだけ。
Logo mini hightoller(投稿日:2011/05/16 18:15, 履歴)
自己解決できました。
SV(GV(GV("Spr")[GV("ss")])[1],xx*80)
と、さらに一次配列をgetVariableでくくれば、意図どおりに。。。
普通に書いたらさらに長い;;
Logo mini hightoller(投稿日:2011/05/16 17:23, 履歴)
なるほどWikiの名前はそういうことだったんですか。覚えておきます。

普通配列変数は宣言、つまりsetVariableで書かないと、
ってことですかね。
また教えを受けて色々試したんですが、まだうまくいきません。

以下コード、SVはsetVariable、GVはgetVariableと読み替えて下さい。
def C_Spr(ss,xx,yy,xw,yh)
SV("Spr",createArray())
SV("ss",ss)
SV(GV("Spr")[GV("ss")],createArray())
SV(GV("Spr")[GV("ss")][1],xx*80)
end

4行目で普通二次元配列が作れてないのか、
5行目で普通二次元配列が指定できてないのか、
5行目で1st argument is not arrayになります。
カッコやダブルクォーテーションの位置がさっぱりです。
正しい書き方を教えてください。
Nyan mini rurun9(投稿日:2011/05/16 11:25, 履歴)
wikiは最後に編集した人の名前が残るだけですよー

setVariable("a", createArray() )
n = 0
while n < 10
  getVariable("a")[n] = createArray()
n = n + 1
end

とすると基本変数"a"を二次元配列にできます。
(ここで使われたnはローカル変数です)

変数だけなら宣言不要でイキナリ値を代入できますが、配列変数にしたいときは宣言しないとダメです。
aが配列になっても、a[0]、a[1]、、、、はそれぞれ単なる変数です。
そこで、a[0]を配列に、a[1]も配列に、a[2]も配列に。。。
という地味な指定作業をしないといけません。

おそらくnの中に何も入っていない状態(null)で配列のインデックスに放り込みa[n]と書いてしまうと、存在しないので「コレ配列じゃないんですけど」エラッタになると思われます。


そしてn,mも基本変数だったりする場合は
getVariable("a")[getVariable("n")][getVariable("m")]=0
な感じで書く事になるので、頑張って下さいw