コメント

このコメントは、【トピック】基本変数で二次元配列を扱いたいのですが、記述方法が分かりません。へのコメントです。

コメントの内容

Zararu128x128 mini dycoon(投稿日:2011/05/21 15:05/21/11)
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が保存されています。
そのため、ひとつだけの変数を処理するのならばうまくいきますが
複数の変数を処理する場合問題が出るかと思います。

よろしくお願いします。

コメントの内容(一番最初の投稿)

Zararu128x128 mini dycoon(投稿日:2011/05/21 15:05/21/11)
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が保存されています。
そのため、ひとつだけの変数を処理するのならばうまくいきますが
複数の変数を処理する場合問題が出るかと思います。

よろしくお願いします。