stuncloud / UWSCR

UWSC互換スクリプト実行ツール
MIT License
50 stars 5 forks source link

SETCLEARすると2次元配列が1次元配列になってしまう。 #140

Closed DIYJii closed 5 months ago

DIYJii commented 5 months ago

概要

UWSCR実行時エラー ReadNews.UWS 255行目: HitCtAry[0][DG] = HitCtAry[0][DG] + 1 [Evaluator::get_index_value] 配列ではありません (0) とのエラー・メッセージ。

調べた結果、少し前のステップにあるSETCLEARが表題にある問題を起こしている事が判明。

再現スクリプト

Dim AAA[4][2]
Print AAA     // [[, , ], [, , ], [, , ], [, , ], [, , ]]
SETCLEAR(AAA,0)
Print AAA          // [0, 0, 0, 0, 0]

再現手順

配列もPrintで打てる,UWSCには無かった機能👍  これが、無かったら問題個所は見つからなかったかも😊

バージョン

0.16.0

不具合発生環境

Windows 10

stuncloud commented 5 months ago

119 に似た感じですね

現状では指定値を各要素に入れるだけになっていますが、要素が配列であればその要素に指定値を入れるようにします

119 とは異なり正しい多次元配列である必要もないので、とにかく配列のネストであれば指定値に置き換える動きにしました

// 2次元
arr = [
    [1,2],
    [3,4]
]
print arr // [[1, 2], [3, 4]]
setclear(arr, 0)
print arr // [[0, 0], [0, 0]]

// 3次元
arr = [
    [
        [1,2],
        [3,4]
    ], 
    [
        [5,6],
        [7,8]
    ]
]
print arr // [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
setclear(arr, 0)
print arr // [[[0, 0], [0, 0]], [[0, 0], [0, 0]]]

// 多次元配列ではないがネストしている状態
arr = [
    1, 
    [2,3], 
    [
        [4], 
        [5,6]
    ]
]
print arr // [1, [2, 3], [[4], [5, 6]]]
setclear(arr, 0)
print arr // [0, [0, 0], [[0], [0, 0]]]

このような動作になります この修正は次回リリースで反映されます

DIYJii commented 5 months ago

早速の対応ありがとうございます。了解です。 とりあえずは、For-For で0フィルするようにしました。 180x6 のサイズなので、チョット重たそうですけど。

stuncloud commented 5 months ago

@DIYJii 正しい多次元配列であれば、埋める値自体を配列にするという手があります

Dim AAA[4][2]
Print AAA // [[, , ], [, , ], [, , ], [, , ], [, , ]]
SETCLEAR(AAA, [0, 0, 0]) // 要素3の一次元配列で埋める
Print AAA // [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
DIYJii commented 5 months ago

すみません。 SetClearに180個もの0は書けないと思っていましたが、私の勘違いで、6個で済む事に気付きました。 ありがとうございました。