elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


  Mostrar Temas
Páginas: [1] 2 3
1  Programación / Programación C/C++ / [Aporte] Interpretador de Brainfuck Commandline en: 10 Enero 2015, 16:24 pm
Hace algo de tiempo se me ocurrio, y lo hice, y bueno, en un intento por procrastinar un poco, he decidido subirlo. Probablemente no sea del todo eficiente, y tenga bastante fallos, me encantaría que le echarais un vistazo a ver que os parece. Para usarlo, el código en brainfuck tiene que estar escrito en un archivo de texto plano. Simplemente lo arrastras al ejecutable o pones en la cmd
Código:
braincmduck "archivo.txt" "archivo2.txt" "archivo3.txt"
Los irá ejecutando uno después de otro.

MODIFICACIÓN: El código que puse a la primera era una versión antigua, ya lo he cambiado. También, cuando quereis introducir un valor 0, teneis que presionar la tecla de backspace. Esto lo hice porque era la unica tecla inutil, de esta manera puedes introducir saltos de linea también.

Código:
#include<stdio.h>
#include<conio.h>
#include"espacio.h"
#include"funciones.h"

int main (int argc, char **argv)
{
    int num_arg = argc;
    //Bucle, no sale hasta que ha realizado el proceso con todos los argumentos
    while (num_arg > 1)
    {
          //Crea las variables necesarias¡
          int tamanyo = 0;
          //Pide el tamaño del array a crear
          if (tamanyo_array(argv[num_arg - 1], tamanyo))
             return 1;
          //Crea el array del tamaño necesario
          char ordenes[tamanyo];
          //Rellena el array con las ordenes;
          ordenes_array(argv[num_arg - 1], ordenes);
          //Crea el puntero
          espacio* espacio_actual = new espacio;
          //Ejecuta las ordenes
          ejecutar(espacio_actual, ordenes, 0, tamanyo-1, tamanyo, true);
          //Reduce en uno el numero de argumentos
          num_arg--;
          printf("\n");
    }
    return 0;
}

espacio.h:
Código:
//Fichero de la clase espacio
//Definicion y funciones

#include<stdio.h>
#include<conio.h>

class espacio{
      public:
       //Constructores
       espacio() : anterior(NULL), contenido(0), siguiente(NULL) {}
       espacio(espacio* anterior, espacio* siguiente) : anterior(anterior),  contenido(0), siguiente(siguiente)
       {
       if (anterior != NULL)
          anterior->cambiar_sig(this);
       if (siguiente != NULL)
          siguiente->cambiar_ant(this);
       }
       //Funciones
       int suma (void);
       int resta (void);
       int mostrar (void);
       int entrada (void);
       int punt_siguiente (espacio* &espacio_actual);
       int cambiar_sig (espacio* nuevo_siguiente);
       int punt_anterior (espacio* &espacio_actual);
       int cambiar_ant (espacio* nuevo_anterior);
       int retornar (void);
      private:
       //Variables
       espacio* anterior;
       int contenido;
       espacio* siguiente;
};

int espacio::suma (void)
{
    //Suma 1 al contenido
    this->contenido++;
    return 0;
}

int espacio::resta (void)
{
    //Resta 1 al contenido
    this->contenido--;
    return 0;
}

int espacio::mostrar (void)
{
    //Muestra el caracter ASCII del contenido
    printf("%c", contenido);
    return 0;
}

int espacio::entrada (void)
{
    //El primer caracter pulsado se convierte en el valor de contenido
    //Si este es 13, se convierte en 0
    //De lo contrario, se muestra el caracter pulsado
    this->contenido = getch();
    if (this->contenido == 8)
       this->contenido = 0;
    else
       if (this->contenido == 13)
          printf("\n");
       else
          printf("%c", this->contenido);
    return 0;
}

int espacio::punt_siguiente (espacio* &espacio_actual)
{
    //Si no hay un siguiente, lo crea
    if (this->siguiente == NULL)
       espacio_actual = new espacio(this, NULL);
    //Si hay un siguiente, iguala el puntero a su direccion de memoria
    else
       espacio_actual = this->siguiente;
    return 0;
}


int espacio::cambiar_sig (espacio* nuevo_siguiente)
{
    this->siguiente = nuevo_siguiente;
    return 0;
}

int espacio::punt_anterior (espacio* &espacio_actual)
{
    //Si no hay un anterior, lo crea
    if (this->anterior == NULL)
       espacio_actual = new espacio(NULL, this);
    //Si hay un anterior, iguala el puntero a su direccion de memoria
    else
       espacio_actual = this->anterior;
    return 0;
}

int espacio::cambiar_ant (espacio* nuevo_anterior)
{
    this->anterior = nuevo_anterior;
    return 0;
}

int espacio::retornar (void)
{
    return this->contenido;
}

funciones.h:
Código:
//Fichero de funciones

int ejecutar (espacio* &espacio_actual,char ordenes[], int pos_inicial, int pos_final, int tamanyo, bool var_ejecutar)
{
    //Comprueba si se ha de ejecutar
    if (!var_ejecutar)
       return 0;
    //Crea la variable que dirá la posición en el string
    int pos_actual = pos_inicial;
    //Crea el contador de caracteres [
    int contador = 0;
    //Crea una int auxiliar
    int pos_auxiliar;
    //No deja el bucle, hasta que al llegar a la posición final, o hemos acabado el string o el actual es = 0
    while (pos_actual != pos_final+1 || (espacio_actual->retornar() && (pos_actual != tamanyo || ordenes[pos_actual-1] == ']')))
    {
          //Si la posicion anterior era la final, y aun así se continua el string, se vuelve a la posicion de inicio
          if (pos_actual > pos_final)
             pos_actual = pos_inicial;
          //Lee las acciones y las ejecuta
          if (ordenes[pos_actual] == '+')
             espacio_actual->suma();
          if (ordenes[pos_actual] == '-')
             espacio_actual->resta();
          if (ordenes[pos_actual] == '.')
             espacio_actual->mostrar();
          if (ordenes[pos_actual] == ',')
             espacio_actual->entrada();
          if (ordenes[pos_actual] == '>')
             espacio_actual->punt_siguiente(espacio_actual);
          if (ordenes[pos_actual] == '<')
             espacio_actual->punt_anterior(espacio_actual);
          if (ordenes[pos_actual] == '[')
          {
             //Comprueba si el bucle se ha de ejecutar o saltar
             if (!espacio_actual->retornar())
                var_ejecutar = false;
             //Guarda la localizacion del comienzo
             pos_auxiliar = pos_actual + 1;
             //Localiza desde donde hasta donde llega el bucle
             while (contador != -1)
             {
                   pos_actual++;
                   if (ordenes[pos_actual] == '[')
                      contador++;
                   if (ordenes[pos_actual] == ']')
                      contador--;
             }
             //Se resetea el contador
             contador = 0;
             //Ejecuta el bucle
             ejecutar(espacio_actual, ordenes, pos_auxiliar, pos_actual, tamanyo, var_ejecutar);
             //Resetea la variable ejecutar
             var_ejecutar = true;
          }
          //Se aumenta en uno la posicion actual
          pos_actual++;
    }
    return 0;
}

int tamanyo_array (char nombre[], int &tamanyo)
{
    //Abre el archivo
    FILE *archivo = fopen(nombre, "rt");
    //Devuelve error si no existe
    if (archivo == NULL)
       return 1;
    //Recorre el texto buscando los caracteres + - . , < > [ y ]
    char instruccion = fgetc(archivo);
    while (instruccion != -1)
    {
          if ((instruccion == '+') || (instruccion == '-') || (instruccion == '.') || (instruccion == ',') || (instruccion == '>') || (instruccion == '<') || (instruccion == '[') || (instruccion == ']'))
             tamanyo++;
          instruccion = fgetc(archivo);
    }
    //Cierra el archivo
    fclose(archivo);
    return 0;
}

int ordenes_array (char nombre[], char ordenes[])
{
    //Crea las variables necesarias
    int contador = 0;
    //Abre el archivo
    FILE *archivo = fopen(nombre, "rt");
    //Recorre el texto buscando los caracteres + - . , < > [ y ]
    char instruccion = fgetc(archivo);
    while (instruccion != -1)
    {
          if ((instruccion == '+') || (instruccion == '-') || (instruccion == '.') || (instruccion == ',') || (instruccion == '>') || (instruccion == '<') || (instruccion == '[') || (instruccion == ']'))
          {
             ordenes[contador] = instruccion;
             contador++;
          }
          instruccion = fgetc(archivo);
    }
    //Cierra el archivo
    fclose(archivo);
    return 0;
}
2  Programación / Scripting / [BATCH] Acceso denegado en REG QUERY en: 1 Enero 2013, 14:43 pm
Hace algo de tiempo que estoy haciendo pruebas e intentando hacer un trozo de codigo que vaya cambiando al programa de carpeta de manera aleatoria. Otros objetivos del codigo son contener la ruta de la carpeta en una clave del registro y que no necesite mas de una sola ventana para funcionar correctamente. Al principio el codigo funciona bien, si no existe la clave del registro la crea con su ruta y vuelve a empezar, y si existe y la ruta que contiene la clave es la misma en la que esta el programa, se copia a una carpeta aleatoria y ejecuta la copia. Si la ruta de la clave es diferente a la del programa, el programa elimina la carpeta de la anterior copia (Cuya ruta esta en la clave) y vuelve a empezar. El problema esta que al volver a empezar despues de haber borrado la anterior copia, el comando REG QUERY deniega el acceso y el programa no puede leer la clave del registro. Habia pensado en usar el comando runas en lugar de un GOTO en el momento de volver a empezar el programa, pero eso implicaria abrir otra ventana. Pongo el codigo abajo, probablemente tenga mas fallos que el que ya nombre. Espero que alguien pueda ayudarme, muchas gracias de antemano.

Código:
@ECHO OFF
SetLocal EnableDelayedExpansion
:SeteandoVariables
SET ClaveDelRegistro=HKLM\SOFTWARE
SET ValorDelRegistro=CD
SET MELT=1
SET NAME=

:ModificandoClaveDelRegistro
REG QUERY "%ClaveDelRegistro%" /v "%ValorDelRegistro%">temp
FOR /F "tokens=3*" %%A IN ('findstr REG_SZ "temp"') DO (IF "%%B" NEQ "" SET B= %%B
SET RutaAntigua=%%A!B!)
REG ADD "%ClaveDelRegistro%" /v "%ValorDelRegistro%" /f /d "%~dp0
IF "%RutaAntigua%"=="" (GOTO SeteandoVariables)
IF "%RutaAntigua%" NEQ "%~dp0" (SET MELT=0)
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 ATTRIB -H -S "%RutaAntigua:~0,-1%" /S /D
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 CD "%RutaAntigua%"
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 FOR /R %%A IN (*.*) DO (DEL /P "%%A")
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 cd ..
IF "%RutaAntigua%" NEQ "" IF %MELT%==0 rd /S "%RutaAntigua%"

:EligiendoCarpeta
CD /D %HOMEDRIVE%\
SET /A MAX=%RANDOM% %% 4000 + 1000
FOR /D /R %%A IN (*) DO (SET Carpeta=%%A
SET /A NUM=!RANDOM! %% %MAX% + 1
IF !NUM!==1 (GOTO ComprobandoErrorN1))

:ComprobandoErrorN1
echo %Carpeta%
IF %ERRORLEVEL% NEQ 0 (GOTO EligiendoCarpeta)
IF "%CARPETA%" NEQ "%CARPETA:)=%" (GOTO EligiendoCarpeta)

:GenerandoNombre
SET /A CHARNUM=%RANDOM% %% 25 + 1
SET CONT=0
FOR /L %%A IN (1,1,%CHARNUM%) DO (
SET /A CHAR=!RANDOM! %% 51
FOR %%B IN (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 1 2 3 4 5 6 7 8 9 0 ! @ # $ ~ ( = [ ] { } . , ; ' - _ +) DO (
SET /A CONT=!CONT!+1
IF !CHAR!==!CONT! SET CHAR=%%B
)
IF !CHAR!==0 (SET CHAR= )
SET NAME=!NAME!!CHAR!
SET CONT=0
)

:Informando
echo %NAME%
echo %MELT%

:ComprobandoMelt
IF %MELT%==0 (echo NO MELT THIS TIME)
IF %MELT%==0 (GOTO SeteandoVariables)

:CreandoCarpeta
cd "%Carpeta%"
md "%NAME%"
ATTRIB +H +S "%NAME%"
cd "%NAME%"

:Copiando
copy "%~f0" "CD.bat"
pause


:AbriendoCopia
"%Carpeta%\%NAME%\CD.bat"
3  Sistemas Operativos / Windows / Duda con valores de registro en: 27 Diciembre 2012, 21:46 pm
¿Existe algun valor del registro que contenga el nombre de la cuenta de Administrador? El nombre de la cuenta de administrador cambia segun el idioma y me gustaria saber si hay alguna manera de tener esta cuenta localizada sea cual sea el idioma. Gracias de antemano.
4  Programación / Scripting / [BATCH] Problema con comandos TASKKILL y TASKLIST en: 25 Diciembre 2012, 20:56 pm
Cuando intento usar los comandos TASKKILL o TASKLIST me responde "Error: Espacio de nombres no válido". Gracias de antemano.

PD: Esto ocurre en un portatil con Win7, en mi torre con WinXP los mismos comandos con la misma sintaxis funcionan correctamente.

PD2: Tambien me ocurre con wmic USERACCOUNT y con getmac.
5  Foros Generales / Dudas Generales / [DUDA] ¿Como funciona la codificacion? en: 24 Diciembre 2012, 13:31 pm
Me gustaria saber como funciona la codificacion de programas, no entiendo como hacen para que el ordenador pueda usar los programas codificados sin mas y tu no puedas abrir el programa y leer el codigo. Gracias de antemano.
6  Programación / Scripting / [BATCH] [RESUELTO] Problema con tokens en comando FOR /F en: 23 Diciembre 2012, 14:25 pm
He buscado pero no encuentro como solucionar el problema. Cuando voy a la linea de comandos e introduzco
Código:
FOR /F "tokens=3*" %A IN ("HOLA QUE TAL ESTAS") DO (echo %A)
Me responde solo "TAL" en vez de "TAL ESTAS". Tambien he probado con "tokens=1,3" y con "tokens=1-3" pero en ambos casos solo me responde "HOLA" en vez de "HOLA TAL" y "HOLA QUE TAL". He buscado en varias paginas y en la ayuda del comando FOR pero no encuentro nada diferente.  Tambien he probado lo mismo en mis dos ordenadores y en una maquina virtual (Los ordenadores Win7 y WinXP, la maquina virtual WinXP), pero el resultado es el mismo. Gracias de antemano.
7  Programación / Scripting / [BATCH] [SOLUCIONADO] Variable con la carpeta Startup en: 16 Diciembre 2012, 14:43 pm
¿Existe alguna variable de entorno que contenga la direccion de la carpeta de Inicio? He buscado y probado con el comando set, a ver si salia en la lista de variables, pero no. La idea es poder localizar la carpeta de inicio del usuario en cualquier Windows. Gracias de antemano.
8  Programación / Scripting / [BATCH] [RESUELTO] Duda con comando FOR en: 15 Septiembre 2012, 15:54 pm
Hace algo de tiempo encontre en algun sitio un codigo en batch que usa FOR para mostrarte un texto letra a letra. Es decir si el texto es "Hola" te lo devuelve:
H
o
l
a
El problema es que no me acuerdo del script y no encuentro la pagina de nuevo. Muchas gracias de antemano

PD: Como se que alguno saldra con http://www.usaelputogoogle.com/, en mi defensa he de decir que intento tener el script antes de las 7 de la tarde de hoy y no se si me dara tiempo a encontrarlo.

PD2: Ya encontre lo que buscaba, era simplemente
Código:
FOR %%A IN (H O L A) DO (echo %%A)
9  Programación / Scripting / [BATCH] Emitir pitidos en: 14 Septiembre 2012, 18:28 pm
Hace una semana encontre que cuando tecleas una opcion no disponible con el comando choice, el ordenador pita. Asi que hoy me puse a investigar y saque como hacer que el programa emita un numero concreto de pitidos, sin necesidad de la respuesta del usuario. El codigo es este:
Código:
@ECHO OFF
echo XS>a.tmp
choice /C S<a.tmp >nul
del a.tmp
Esto emitiria 1 pitido. El numero de equis en la linea:
Código:
echo XS>a.tmp
Determina el numero de pitidos

PD: La letra X en la linea
Código:
echo XS>a.tmp
Se puede cambiar por cualquier otra letra que no sea S.
10  Programación / Scripting / [BATCH] Duda con comando echo en: 12 Agosto 2012, 12:51 pm
Bueno, estoy haciendo pequeño cursillo para aprender batch, y estaba escribiendo la parte de los caracteres especiales al usar el comando echo (&, >... etc), y me entro la duda de que pasaria si escribia en la consola
Código:
echo ^
Al hacerlo se ha imprimido "¿Más?" y al escribir algo y luego darle al enter imprime abajo la que hayas escrito. La verdad, no se por que hace eso ni para que sirve, pero me ha entrado curiosidad y me parece que quizas podria ser interesante incluir esto en el cursillo. Gracias de antemano.

Re-edición: Me he dado cuenta que al escribir directamente
Código:
^
Te hace la misma pregunta y luego intenta ejecutar lo que has escrito como si fuera un comando
Re-Re-edición: He probado usando
Código:
SET X=^
Y despues de preguntarte "¿Más?" setea X como lo que has escrito, asi que me da que es un caracter especial, aun que aun no entiendo exactamente su uso.
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines