Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - blackray

#1
Scripting / Generador de Arrays [BETA]
10 Septiembre 2009, 16:44 PM
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!
#2
ASM / Re: [DUDA] mover a la pila
10 Septiembre 2009, 03:07 AM
Muchas gracias y disculpa las molestias :P

Yo lei un tutorial basico de asm, el problema es que dicen: bp apunta a la base de la pila y sp a el valor que acaba de ser empujado a ella y si solo metemos un valor, yo creia que bp y sp iban a apuntar a la misma posicion  :xD

Saludos!
#3
ASM / Re: [DUDA] mover a la pila
10 Septiembre 2009, 00:58 AM
Si me ayudaste :P

Y si hago...

mov ax,5
mov bp,6
push ax

En este caso perdere el 6 de bp y [bp] sera = a 5, estoy en lo correcto?

Gracias! :D
#4
Scripting / Re: Ayuda con VIRUS en BAT
9 Septiembre 2009, 21:28 PM
WTF xD usa el comando for pero URGENTEMENTE
Ese codigo se puede resumir en 5 lineas por dios xD
Mira por el foro en tutorial avanzado de batch, ahi te explica bien el comando for ;)

Saludos!
#5
ASM / [DUDA] mover a la pila
9 Septiembre 2009, 19:33 PM
Aqui estoy con mis dudas  :xD

Segun lei los registros sp y bp contienen el valor mas reciente introducido en la pila y el valor de la base de la pila respectivamente.

Entonces...

mov ax,5
push ax ; la pila tiene de base el valor 5
mov bp,6 ; ????

Si movemos a el registro bp el valor 6, tambien se modifica el valor de la pila?

Saludos, y gracias! :P
#6
ASM / Re: [Ayuda]MOVSD y MOVSW
7 Septiembre 2009, 16:01 PM
Muchas gracias a los dos, ya lo entiendo perfectamente  ;D

Saludos!
#7
ASM / Re: [Ayuda]MOVSD y MOVSW
6 Septiembre 2009, 20:28 PM
Emm entiendo lo que hace pero no le veo uso ._. si es para hacer un bucle no seria mas facil el tipico loop o con condicionales? =/
Saludos :P
#8
ASM / Re: [Ayuda]MOVSD y MOVSW
6 Septiembre 2009, 19:39 PM
Muchas gracias  :P
mmm y el CLD? tengo entendido que pone a 1 el flag de direccion y que esta relacionado con el movsX ._. en los codes comentados que veo solo dice... hacia adelante ._. mire sobre la instruccion pero solo dice para que sirve, no como se usa  :xD
Saludos!
#9
ASM / [Ayuda]MOVSD y MOVSW
6 Septiembre 2009, 16:54 PM
Hola =P la cuestion es que yo entiendo que copia de SI a DI, lo que no entiendo es la instruccion del flag de direccion como CLD, lei y dice... movimiento para adelante WTF?
:-\ No entiendo muy bien eso, me podeis echar una mano porfavor?  ;D
Saludos!
#10
xD Bueno, la idea es buena :P pero el code se puede optimizar mucho.
Todo el code es interfaz, y ya que la interfaz en la mayoria de los casos, siempre es la misma, podrias crear una etiqueta que obtenga de parametro el mensaje y devuelva la interface.
Filtra las variables... no faltara el listillo de las batch's injections.
Y tambien comprueva si esta en blanco lo que el usuario introduce =P
Saludos!