Bueno :P esto lo hize como despedida de batch, mi gran amigo desde hace mucho tiempo :xD
Se trata de un generador de arrays de hasta 5 dimensiones... tiene posibilidad de expander sin perder datos, guardar un array en un fichero, cargarlo desde un programa, crear punteros a cierta casilla de un array, etc.
Tambien tiene variables de ayuda para saber el tamaño de un array y bueh xD eso. Se le puede dar un valor por defecto a todas las casillas del array cuando se definen declarando la variable "default".
Otra cosa... hay un bug con los espacios que aqui no voy a comentar que se arregla con call:putbar o call:quitbar ;D
Aqui os dejo el codigo y luego explico la sintaxis:
@echo off&SETLOCAL ENABLEDELAYEDEXPANSION
GoTo:code
:;By blackray;:
:array
FOR %%x IN ("%~1","%~2","%~3") DO (
IF [%%x]==[""] (
echo Error.&GoTo:EoF
)
)
IF "%default%"=="" (
SET default=0
)
IF /i "%~1"=="newarray" (
IF NOT "%~7"=="" (
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
SET array[5]=%~6
SET array[6]=%~7
CALL:new5
GoTo:EoF
)
IF NOT "%~6"=="" (
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
SET array[5]=%~6
CALL:new4
GoTo:EoF
)
IF NOT "%~5"=="" (
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
CALL:new3
GoTo:EoF
)
IF NOT "%~4"=="" (
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
CALL:new2
GoTo:EoF
)
IF NOT "%~3"=="" (
SET array[1]=%~2
SET array[2]=%~3
CALL:new1
GoTo:EoF
)
)
IF /i "%~1"=="expandarray" (
CALL:defined %~2
IF NOT "%~7"=="" (
SET array[rows]=!%~2.rows!
SET array[columns]=!%~2.columns!
SET array[len]=!%~2.len!
SET array[len4]=!%~2.len4!
SET array[len5]=!%~2.len5!
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
SET array[5]=%~6
SET array[6]=%~7
CALL:edit5
GoTo:EoF
)
IF NOT "%~6"=="" (
SET array[rows]=!%~2.rows!
SET array[columns]=!%~2.columns!
SET array[len]=!%~2.len!
SET array[len4]=!%~2.len4!
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
SET array[5]=%~6
CALL:edit4
GoTo:EoF
)
IF NOT "%~5"=="" (
SET array[rows]=!%~2.rows!
SET array[columns]=!%~2.columns!
SET array[len]=!%~2.len!
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
SET array[4]=%~5
CALL:edit3
GoTo:EoF
)
IF NOT "%~4"=="" (
SET array[rows]=!%~2.rows!
SET array[columns]=!%~2.columns!
SET array[1]=%~2
SET array[2]=%~3
SET array[3]=%~4
CALL:edit2
GoTo:EoF
)
IF NOT "%~3"=="" (
SET array[rows]=!%~2.rows!
SET array[1]=%~2
SET array[2]=%~3
CALL:edit1
GoTo:EoF
)
)
IF /i "%~1"=="pointer" (
CALL:defined %~4
IF /i "%~2"=="asign" (
IF NOT "%~4"=="" (
SET array[val]=%~3
SET array[var]=%~4
CALL:asign
GoTo:EoF
)
)
IF /i "%~2"=="create" (
CALL:defined %~4
SET array[var]=%~3
SET array[where]=%~4
CALL:create
GoTo:EoF
)
)
IF /i "%~1"=="save" (
CALL:defined %~2
SET array[save]=%~2
SET array[dir]=%~3
CALL:save
GoTo:EoF
)
IF /i "%~1"=="load" (
SET array[dir]=%~2
SET array[state]=%~3
CALL:load
GoTo:EoF
)
echo Error.&GoTo:EoF
:new1
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
FOR /L %%e IN (0,1,%array[2]%) DO (
SET %array[1]%[%%e]=%default%
)
SET default=0
GoTo:EoF
:new2
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
FOR /L %%f IN (0,1,%array[2]%) DO (
FOR /L %%c IN (0,1,%array[3]%) DO (
SET %array[1]%[%%f.%%c]=%default%
)
)
SET default=0
GoTo:EoF
:new3
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
FOR /L %%f IN (0,1,%array[2]%) DO (
FOR /L %%c IN (0,1,%array[3]%) DO (
FOR /L %%r IN (0,1,%array[4]%) DO (
SET %array[1]%[%%f.%%c.%%r]=%default%
)
)
)
SET default=0
GoTo:EoF
:new4
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
SET %array[1]%.len4=%array[5]%
FOR /L %%f IN (0,1,%array[2]%) DO (
FOR /L %%c IN (0,1,%array[3]%) DO (
FOR /L %%r IN (0,1,%array[4]%) DO (
FOR /L %%p IN (0,1,%array[5]%) DO (
SET %array[1]%[%%f.%%c.%%r.%%p]=%default%
)
)
)
)
SET default=0
GoTo:EoF
:new5
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
SET %array[1]%.len4=%array[5]%
SET %array[1]%.len5=%array[6]%
FOR /L %%f IN (0,1,%array[2]%) DO (
FOR /L %%c IN (0,1,%array[3]%) DO (
FOR /L %%r IN (0,1,%array[4]%) DO (
FOR /L %%p IN (0,1,%array[5]%) DO (
FOR /L %%k IN (0,1,%array[6]%) DO (
SET %array[1]%[%%f.%%c.%%r.%%p.%%k]=%default%
)
)
)
)
)
SET default=0
GoTo:EoF
:edit1
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
FOR /L %%e IN (%array[rows]%,1,%array[2]%) DO (
SET %array[1]%[%%e]=%default%
)
SET default=0
GoTo:EoF
:edit2
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
FOR /L %%f IN (%array[rows]%,1,%array[2]%) DO (
FOR /L %%c IN (%array[columns]%,1,%array[3]%) DO (
SET %array[1]%[%%f.%%c]=%default%
)
)
SET default=0
GoTo:EoF
:edit3
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
FOR /L %%f IN (%array[rows]%,1,%array[2]%) DO (
FOR /L %%c IN (%array[columns]%,1,%array[3]%) DO (
FOR /L %%r IN (%array[len]%,1,%array[4]%) DO (
SET %array[1]%[%%f.%%c.%%r]=%default%
)
)
)
SET default=0
GoTo:EoF
:edit4
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
SET %array[1]%.len4=%array[5]%
FOR /L %%f IN (%array[rows]%,1,%array[2]%) DO (
FOR /L %%c IN (%array[columns]%,1,%array[3]%) DO (
FOR /L %%r IN (%array[len]%,1,%array[4]%) DO (
FOR /L %%p IN (%array[len4]%,1,%array[5]%) DO (
SET %array[1]%[%%f.%%c.%%r.%%p]=%default%
)
)
)
)
SET default=0
GoTo:EoF
:edit5
SET %array[1]%=array
SET %array[1]%.rows=%array[2]%
SET %array[1]%.columns=%array[3]%
SET %array[1]%.len=%array[4]%
SET %array[1]%.len4=%array[5]%
SET %array[1]%.len5=%array[6]%
FOR /L %%f IN (%array[rows]%,1,%array[2]%) DO (
FOR /L %%c IN (%array[columns]%,1,%array[3]%) DO (
FOR /L %%r IN (%array[len]%,1,%array[4]%) DO (
FOR /L %%p IN (%array[len4]%,1,%array[5]%) DO (
FOR /L %%k IN (%array[len5]%,1,%array[6]%) DO (
SET %array[1]%[%%f.%%c.%%r.%%p.%%k]=%default%
)
)
)
)
)
SET default=0
GoTo:EoF
:create
SET %array[var]%[array]=%array[where]%
SET %array[var]%=!%array[where]%!
GoTo:EoF
:asign
SET %array[var]%=%array[val]%
SET !%array[var]%[array]!=!%array[var]%!
GoTo:EoF
:defined
IF NOT DEFINED %~1 (
echo Array not exist.&pause>nul&exit
)
GoTo:EoF
:save
CALL:defined %array[save]%
SET %array[save]%>%array[dir]%
GoTo:EoF
:load
IF NOT EXIST "%array[dir]%" (
echo File not found.&GoTo:EoF
)
FOR /F "tokens=*" %%x IN (%array[dir]%) DO (
SET "%%x"
)
IF /i "%array[state]%"=="D" (
DEL /F /Q %array[dir]%
GoTo:EoF
)
IF /i "%array[state]%"=="ND" (
GoTo:EoF
)
GoTo:EoF
:quitbar
SET var=%1
SET %1=!%var%:_= !
GoTo:EoF
:putbar
SET var=%1
SET %1=!%var%: =_!
GoTo:EoF
:code
REM AQUI EL CODIGO :D
Espero que no os parezca cutre :rolleyes:
Bien... ahora lo que es capaz de hacer y como hacerlo:
Crear un nuevo array: call:array newarray nombre tamaño1 [tamaño2] [tamaño3] [tamaño4] [tamaño5]
Los que estan entre [] son opcionales... ya que el minimo puede ser de una dimension pero el maximo de 5... espero que ya llegue xD
Expander un array: call:array expandarray nombre tamaño1 [tamaño2] [tamaño3] [tamaño4] [tamaño5]
Podeis crear una nueva dimension y ampliar dimensiones existentes a la vez sin perder ningun dato guardado :P
Crear puntero a casilla: call:array pointer create nombre casillaarray
Creamos el puntero y apunta a la casilla que se defina xD
Asignar valor a un puntero (se modificara la casilla tambien :P):
call:array pointer asign valor puntero
Pues se le asigna el valor al puntero, modificando tambien la casilla original ya que el puntero apunta a la casilla xD
[En este es donde esta el bug... no le puede asignar un valor con espacios asi que tienes que pasar antes el valor por la etiqueta call:putbar y cuando lo recuperes, pasarlo por el call:quitbar xD]
Guardar un array en fichero: call:array save nombrearray fichero.extensión
Creo que queda claro, guarda el array en un fichero... aqui hay un bug pero no tiene porque pasar nada si se programa bien :P
Leer un fichero con un array guardado: call:array load fichero.extensión ND/D
Se lee, y lo mas interesante quiza es el ND/D indica si se desea eliminar o no tras su lectura, si se especifica ND no se eliminara... si es D si ;D
Y ahora funciones que no son de array pero que ya trae el programa en si:
PUTBAR: call:putbar variable
Cambia todos los espacios ( ) de una variable por barra inferior (_)
QUITBAR: call:quitbar variable
La inversa, cambia todas las barras (_) por espacios ( )
NOTA: EN ESTOS LA VARIABLE SIN %% ;)
Y nada mas... espero que os sirva de algo :P ese fue mi entreteimiento en las vacaciones :xD
Saludos!