コメント

このコメントは、【トピック】savePlayData関数の呼び出しでエラーへのコメントです。

コメントの内容

Material 6858 mini akasata(投稿日:2013/08/05 22:08/05/13)
お待たせしました。

開発担当のdycoonとも相談したのですが、本件はシステム的な対応は難しいと判断しています。

本件は、理論上は対策が可能なのですが、保存データの基本構造に関わる部分を変更しなくてはならず、バグを作りこんでしまう可能性が低くありません。
その場合、他のゲームの保存データが動かなくなってしまうことになり、リスクを考えると手を下すことができません。

本件のように、arr1 -> arr2 -> arr1 -> arr2 ・・・と無限に続いてしまうデータ構造を循環参照と呼びます。

循環参照には定番ともいえる対策があるので、ぜひ、お試しください。

いただいたコードを元に対策例を紹介します。

arr1 = createArray()
arr2 = createArray()

arr1[0] = "cake"

# 配列への参照ではなく、ラベルを登録します
# ここでは、ラベルには命名規則として接尾語に"_label"をつけます
arr1[1] = "arr2_label"

arr2[0] = "icecream"

# 配列への参照ではなく、ラベルを登録します
arr2[1] = "arr1_label"

setVariable("arr1", arr1)
setVariable("arr2", arr2)

# ラベルから配列を取得する関数です
def get_arr_from_label(label)
  # 接尾語の取得
  arr = splitString(label, "_")
  suffix = popArray(arr)
  
  # 接尾語がlabelの場合
  if suffix == "label"
    s = joinArray(arr, "_")
    return getVariable(s)
  else
    speak("末尾がlabelじゃないのでエラーです")
  end
end

# 実際に使うとき

# arr2_from_arr1とarr2は同じ内容
arr1 = getVariable("arr1")
arr2_from_arr1 = get_arr_from_label(arr1[1])

# arr1とarr1_from_arr2は同じ内容
arr2 = getVariable("arr2")
arr1_from_arr2 = get_arr_from_label(arr2[1])

# ちゃんと値が入っているかどうかチェック
# 配列を表示するのは面倒なので、joinArrayで文字列に変換してしまいます
speak("arr1: " + joinArray(arr1, ", "))
speak("arr2_from_arr1: " + joinArray(arr2_from_arr1, ", "))
speak("arr2: " + joinArray(arr2, ", "))
speak("arr1_from_arr2: " + joinArray(arr1_from_arr2, ", "))

# もちろん、実際に保存してエラーが出ないかチェックしてください


お手数をおかけし、大変申し訳ありません。
問題解決の一助になりましたら、幸いです。

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

Material 6858 mini akasata(投稿日:2013/08/05 22:08/05/13)
お待たせしました。

開発担当のdycoonとも相談したのですが、本件はシステム的な対応は難しいと判断しています。

本件は、理論上は対策が可能なのですが、保存データの基本構造に関わる部分を変更しなくてはならず、バグを作りこんでしまう可能性が低くありません。
その場合、他のゲームの保存データが動かなくなってしまうことになり、リスクを考えると手を下すことができません。

本件のように、arr1 -> arr2 -> arr1 -> arr2 ・・・と無限に続いてしまうデータ構造を循環参照と呼びます。

循環参照には定番ともいえる対策があるので、ぜひ、お試しください。

いただいたコードを元に対策例を紹介します。

arr1 = createArray()
arr2 = createArray()

arr1[0] = "cake"

# 配列への参照ではなく、ラベルを登録します
# ここでは、ラベルには命名規則として接尾語に"_label"をつけます
arr1[1] = "arr2_label"

arr2[0] = "icecream"

# 配列への参照ではなく、ラベルを登録します
arr2[1] = "arr1_label"

setVariable("arr1", arr1)
setVariable("arr2", arr2)

# ラベルから配列を取得する関数です
def get_arr_from_label(label)
  # 接尾語の取得
  arr = splitString(label, "_")
  suffix = popArray(arr)
  
  # 接尾語がlabelの場合
  if suffix == "label"
    s = joinArray(arr, "_")
    return getVariable(s)
  else
    speak("末尾がlabelじゃないのでエラーです")
  end
end

# 実際に使うとき

# arr2_from_arr1とarr2は同じ内容
arr1 = getVariable("arr1")
arr2_from_arr1 = get_arr_from_label(arr1[1])

# arr1とarr1_from_arr2は同じ内容
arr2 = getVariable("arr2")
arr1_from_arr2 = get_arr_from_label(arr2[1])

# ちゃんと値が入っているかどうかチェック
# 配列を表示するのは面倒なので、joinArrayで文字列に変換してしまいます
speak("arr1: " + joinArray(arr1, ", "))
speak("arr2_from_arr1: " + joinArray(arr2_from_arr1, ", "))
speak("arr2: " + joinArray(arr2, ", "))
speak("arr1_from_arr2: " + joinArray(arr1_from_arr2, ", "))

# もちろん、実際に保存してエラーが出ないかチェックしてください


お手数をおかけし、大変申し訳ありません。
問題解決の一助になりましたら、幸いです。