windows - hvorfor er arrayet fyldt med 'm'

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er ret ny til batch og jeg har forsøgt at skrive nogle enkle sorteringsprogrammer. Dette program bruger det mest grundlæggende sorteringssystem, og koden (fra det jeg kan se) synes at være fejlfri. Men når jeg kører det, genereres en tilfældig liste, og det ser ud som om en sortering foregår, så arrayet er fyldt med bogstavet 'm'. Jeg kan ikke se hvorfor dette sker, så hvis nogen kunne pege på mig i den rigtige retning, vil jeg meget sætte pris på det.


Min kode:


@echo off
color b
title sorting
set ar=0
set num=0
set check=0
set checknum=0
set totalnumber=500
set randmax=5000
:array
if \%num\% LSS \%totalnumber\% (
set /A a[\%num\%]=\%random\% \%\% \%randmax\%
set /A num=\%num\%+1
goto array
)
if \%num\% EQU \%totalnumber\% (
goto echo1
)
:echo1
for /F "tokens=2 delims==" \%\%s in ('set a[') do echo \%\%s
echo sort initialized
goto sort
)
:sort
set n=0
:sortloop
set /A m=\%n\%+1
if \%n\% EQU \%totalnumber\% (
goto check
)
if \%a[\%n\%]\% GTR \%a[\%m\%]\% (
set hold=\%a[\%m\%]\%
set a[\%m\%]=\%a[\%n\%]\%
set a[\%n\%]=\%hold\%
set /A n=\%n\%+1
goto sortloop
)
if \%a[\%n\%]\% LSS \%a[\%m\%]\% (
echo a[\%n\%] check
set /A n=\%n\%+1
goto sortloop
)
:check
set check=0
set checknum=0
:checkloop
set /A checknumplus=\%checknum\%+1
if \%check\% EQU \%totalnumber\% (
goto complete
)
if \%checknum\% EQU \%totalnumber\% (
set n=0
goto sort
)
if \%a[\%checknum\%]\% LSS \%a[\%checknumplus\%]\% (
set /A check=\%check\%+1
set /A checknum=\%checknum\%+1
goto checkloop
)
:complete
for /F "tokens=2 delims==" \%\%s in ('set a[') do echo \%\%s
for /F "tokens=2 delims==" \%\%s in ('set a[') do echo \%\%s > sortedlist.txt

Bedste reference


Når du skal bruge variabler inde i variabler i batch (oftest når du arbejder med arrayer), skal du bruge forsinket ekspansion.


Lige nu siger din kode set hold=\%a[\%m\%]\%. Tolken behandler denne værdi som variablen \%a[\% (som ikke eksisterer, så den bruger ingenting), den bogstavlige karakter m og variablen \%]\% (som heller ikke eksisterer og er derfor tom).


For at omgå dette skal du sætte setlocal enabledelayedexpansion øverst på din kode og derefter ændre din sætte sætning til set hold=!a[\%m\%]! (og gøre det samme med de andre linjer, der bruger det).