Generador de Arrays [BETA]

Iniciado por blackray, 10 Septiembre 2009, 16:44 PM

0 Miembros y 1 Visitante están viendo este tema.

blackray

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!
Nada es imposible.