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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con interprete de mi propio lenguaje de script sencillo
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con interprete de mi propio lenguaje de script sencillo  (Leído 2,465 veces)
harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Ayuda con interprete de mi propio lenguaje de script sencillo
« en: 28 Octubre 2014, 01:12 am »

Hola, amigos. Estoy desarrollando un programa que rellena las casillas de un array con una X según la posicion y las ordenes que se indiquen desde un fichero de texto que actúa como script.

En cuanto al programa, mi único problema está en la parte en donde interpreta los scripts.

Voy dividiendo linea por linea usando strtok(...), y hasta ahí todo bien. Copio el contenido del puntero que devuelve strtok hacia un buffer de 16 caracteres para no tener que preocuparme por cosas raras con punteros.

El problema viene cuando intento usar strcmp(...) para ver si la linea actual coincide con la instruccion "fill" o "inc_x". Cuando lo hace, el programa crashea.

¿Podría alguien ayudarme a solucionar mi problema, o darme una mejor idea de como hacerlo? Gracias de antemano

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define NROWS 5//32
  5. #define NCOLUMNS 5//32
  6. int parse_script(char filename[]){
  7.    unsigned int x = 0;
  8.    unsigned int y = 0;
  9.    char array[NROWS][NCOLUMNS];
  10.    unsigned int file_size;
  11.    unsigned int i = 0;
  12.  
  13.    FILE *script_file;
  14.    char *script_content;
  15.    char *current_line;
  16.    char current_instruction[16];
  17.  
  18.    for(x = 0; x < NCOLUMNS; x++){
  19.        for(y = 0; y < NROWS; y++){
  20.            array[x][y] = 'O';
  21.        }
  22.    }
  23.  
  24.    ///First step, read all file content before preprocess it.
  25.    script_file = fopen(filename, "r");
  26.  
  27.    ///If all is good, get the size of file
  28.    fseek(script_file, 0, SEEK_END);
  29.    file_size = (unsigned long ) ftell(script_file);
  30.    rewind(script_file);
  31.  
  32.    ///Resize the array to the size of file
  33.    script_content = (char *) calloc (1, (size_t) file_size);
  34.  
  35.    ///Read the data from the file and put it in the array
  36.    fread((char *)script_content, file_size, 1, script_file);    ///Last step: Free resources
  37.  
  38.    ///Second step: Execute instruction by instruction
  39.    ///The program must divide the content in lines using \n
  40.    x = 0;
  41.    y = 0;
  42.    char delimiters[] = "\r\n";
  43.    current_line = strtok((char *) script_content, delimiters);//argumentos: frase, caracter delimitador
  44.    while(current_line != NULL)
  45.    {
  46.  
  47.       strncpy(current_instruction, current_line, 16);
  48.       printf("%s \n", current_line);
  49.  
  50.       ///Here, the program must analyze the instruction and take an action
  51.       if(strcmp("fill", current_instruction) == 0){
  52.            array[x][y] = 'X';
  53.  
  54.       }
  55.  
  56.       if(strcmp("inc_x", current_instruction) == 0){
  57.            x++;
  58.  
  59.       }
  60.  
  61.       current_line = strtok(NULL, delimiters);
  62.    }
  63.  
  64.    ///Third step: Show array.
  65.    printf("\nThe content of the array is: \n");
  66.    for(x = 0; x < NCOLUMNS; x++){
  67.        for(y = 0; y < NROWS; y++){
  68.            printf("%c", array[x][y]);
  69.            printf(" ");
  70.        }
  71.        printf("\n");
  72.  
  73.    }
  74.    printf("End of array. Thanks for use my program\n");
  75.  
  76.    free(script_content);
  77.    fclose(script_file);
  78. }
  79.  
  80. int main(int argc, char *argv[])
  81. {
  82.    if(argc < 2)
  83.        return -1;
  84.  
  85.  
  86.  
  87.    if(strcmp(argv[1], "-w") == 0){
  88.        parse_script(argv[2]);
  89.        return 0;
  90.    }
  91.  
  92.    printf("Invalid command!!\n");
  93.  
  94.    return 0;
  95. }
  96.  
  97.  

Fichero de prueba usado (escribir su ruta en la linea de comandos como parametro despues del nombre del ejecutable):

Código
  1. fill
  2. inc_x
  3.  


« Última modificación: 28 Octubre 2014, 01:19 am por harry_the_blogger » En línea

Vista mi blog es enriquemesa.blogspot.com
T. Collins

Desconectado Desconectado

Mensajes: 206


Ver Perfil
Re: Ayuda con interprete de mi propio lenguaje de script sencillo
« Respuesta #1 en: 28 Octubre 2014, 02:08 am »

Te crashea o no compila? Porque para usar strcmp, strcpy etc tienes que incluir #include <string.h>, y has utilizado mal "strncpy" porque solo admite dos argumentos.

Cambiando eso he conseguido que me compile, pero no he probado si hace lo que quieres.


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Ayuda con interprete de mi propio lenguaje de script sencillo
« Respuesta #2 en: 28 Octubre 2014, 02:28 am »

Porque para usar strcmp, strcpy etc tienes que incluir #include <string.h>
Cierto, falta ese encabezado.

y has utilizado mal "strncpy" porque solo admite dos argumentos.
La función strncpy es parte de la biblioteca estándar de C.

Un problema con ella es que copia los caracteres del origen al destino, como máximo los indicados por su tercer argumento pero si copia ese máximo no agrega el terminador de cadena '\0', en su lugar se puede utilizar la función sprintf en la forma:
Código
  1. /* strncpy(current_instruction, current_line, 16); */
  2. sprintf(current_instruction, "%.*s", 15, current_line);

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
T. Collins

Desconectado Desconectado

Mensajes: 206


Ver Perfil
Re: Ayuda con interprete de mi propio lenguaje de script sencillo
« Respuesta #3 en: 28 Octubre 2014, 02:47 am »

Cierto, falta ese encabezado.
La función strncpy es parte de la biblioteca estándar de C.

Un problema con ella es que copia los caracteres del origen al destino, como máximo los indicados por su tercer argumento pero si copia ese máximo no agrega el terminador de cadena '\0', en su lugar se puede utilizar la función sprintf en la forma:
Código
  1. /* strncpy(current_instruction, current_line, 16); */
  2. sprintf(current_instruction, "%.*s", 15, current_line);

Un saludo

Tienes razón, no conocía strncpy y al cambiar todo a la vez  y ver que compilaba ni probé por qué lo había puesto él así. Gracias por la aclaración.
« Última modificación: 28 Octubre 2014, 02:53 am por T. Collins » En línea

harry_the_blogger

Desconectado Desconectado

Mensajes: 105


Visita mi blog es enriquemesa.blogspot.com


Ver Perfil WWW
Re: Ayuda con interprete de mi propio lenguaje de script sencillo
« Respuesta #4 en: 29 Octubre 2014, 00:49 am »

Gracias por responder. No he podido solucionarlo!! He tratado de hacer lo que me dijo TCollins

Cierto, falta ese encabezado.
La función strncpy es parte de la biblioteca estándar de C.

Un problema con ella es que copia los caracteres del origen al destino, como máximo los indicados por su tercer argumento pero si copia ese máximo no agrega el terminador de cadena '\0', en su lugar se puede utilizar la función sprintf en la forma:
Código
  1. /* strncpy(current_instruction, current_line, 16); */
  2. sprintf(current_instruction, "%.*s", 15, current_line);

Un saludo

Pero aún así falla. ¿Podría alguien decirme alguna otra forma de conseguir comparar la linea actual con una instruccion??? Gracias.
En línea

Vista mi blog es enriquemesa.blogspot.com
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Script sencillo para hackear claves WEP funcionando. « 1 2 3 »
Hacking Wireless
SnakingMax 24 38,046 Último mensaje 8 Mayo 2011, 02:18 am
por zit0
Diseñan robots capaces de crear su propio lenguaje
Noticias
KarlosVid(ÊÇ) 3 2,720 Último mensaje 19 Mayo 2011, 20:37 pm
por ShotgunLogic
Un compilador para un lenguaje de programación sencillo
Programación General
leogtz 3 20,236 Último mensaje 27 Septiembre 2013, 23:06 pm
por leogtz
[Aporte] Script sencillo que invade el pc y lo realentece
Hacking
sabeeee 6 4,829 Último mensaje 12 Marzo 2014, 22:47 pm
por dantemc
Pikachu ya tiene su propio lenguaje de programación
Noticias
wolfbcn 5 4,264 Último mensaje 10 Septiembre 2017, 18:53 pm
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines