複数の変数の中身をずらしたい時、ありませんか?
そんな時にこのラベルがあれば、万事解決!
…というわけで、変数のシフトをするバッチラベルです。
引数を左シフトするコマンドにはshiftというものがあるのですが、変数ではできませんし右シフトもできません。
それをできるようにしてみました。
ここでは、以下の変数をシフトする例として用います。
num[1]=1
num[2]=2
num[3]=3
num[4]=4
num[5]=5
#使用法
call :dShift 引数1 引数2 引数3 引数4
引数1にはシフトする変数の数字以外の部分を入力します。ここではnumです。
引数2にはシフトする変数の数字の初項を入力します。
引数3にはシフトする変数の数字の公差を入力します。正の値だと左シフト、負だと右シフトです。
引数4にはシフトする変数の数字の末項を入力します。
引数2~4は、そのまま```for /l``のカッコ内の数字だと考えると分かりやすいかもしれません。
具体例を挙げて説明します。
#例1:全部を左シフトする
call :dShift num 1 1 5
num[1]=2
num[2]=3
num[3]=4
num[4]=5
num[5]=5
この例に限りませんが、シフトされた端のデータ(ここではnum[5] )はそのまま残ります。
もしリングバッファ的に扱いたい(num[1]の値をnum[5]に持ってきたい)場合は、あらかじめ別の変数に保存しておいて、シフト後に代入する必要があります。この場合の例も後ほど紹介します。
#例2:3~5番目を右シフトする
call :dShift num 5 -1 3
num[1]=1
num[2]=2
num[3]=3
num[4]=3
num[5]=4
#例3:奇数番目だけ左シフトする
call :dShift num 1 2 5
num[1]=3
num[2]=2
num[3]=5
num[4]=4
num[5]=5
#実際のラベル
変数の数字の部分を[ ]で括っていない方は、ラベル内から[ ]を消してください!
:dShift
set str=
for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
call :dShift2%str%
exit /b
:dShift2
set /a %1=%2
shift
if "%2" == "" exit /b
goto dshift2
:dShift_r
set str=
for /l %%i in (%2,%3,%4) do set str=!str! %1[%%i]
set temp=!%1[%2]!
call :dShift2_r%str%
set %1[%4]=!temp!
exit /b
:dShift2_r
set /a %1=%2
shift
if "%2" == "" exit /b
goto dshift2_r