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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Programa para revisar los errores de sintaxis de un programa en C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Programa para revisar los errores de sintaxis de un programa en C.  (Leído 12,715 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Programa para revisar los errores de sintaxis de un programa en C.
« en: 8 Octubre 2016, 14:54 pm »

Hola, muy buen día, ¿cómo están? -
Les comento, termine de estudias con el manual de COMO PROGRAMAR C C++ Y JAVA DEITEL&DEITEL-4° Edición-Español y para refrescar conceptos estoy leyendo El lenguaje de programación C - Kernighan, Ritchie, y piden que haga el siguiente programa. -

Citar
Ejercicio 1-24. Escriba un programa para revisar los errores de sintaxis rudimen­
tarios de un programa en C, como paréntesis, llaves y corchetes no alineados. No
olvide las comillas ni los apóstrofos, las secuencias de escape y los comentarios.
(Este programa es difícil si se hace completamente general.)

La primera duda que tengo es ¿pondrían el código en una variable char o en un archivo?
Desde ya muchas gracias, saludos. -


En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #1 en: 8 Octubre 2016, 15:51 pm »

Sería ideal cargar el código a una cadena. Así pues, el código puede estar inicialmente en un archivo si quieres: luego, lo cargas y listo.
Trabajar directamente con el archivo sería más lento y algo más complejo.
Y por memoria no habrá problema. Un código dificilmente va a ocupar más de 1 MB.


En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #2 en: 8 Octubre 2016, 16:42 pm »

Hola.
Decirme si lo que pienso hacer es una forma correcta, cuento con getchar() el total de caracteres que tiene el archivo y luego con este dato reservo memoria dinámica para cargarlo en precisamente en memoria ¿es una buena alternativa?. -
Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #3 en: 8 Octubre 2016, 23:41 pm »

Para saber el tamaño del archivo, posicionas el cursor al final (con fseek y SEEK_END, por ejemplo), y luego obtienes la posición con ftell.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #4 en: 9 Octubre 2016, 00:14 am »

Código
  1. if( ptrArchivo != NULL ){
  2. fseek(ptrArchivo,0,SEEK_END);
  3. tamanio = ftell(ptrArchivo);
  4. fclose( ptrArchivo );
  5. }else{
  6. printf( "\n ERROR - el archivo no se pudo abrir..." );
  7. exit(EXIT_FAILURE);
  8. }

Ahora me quiero ver con el resto. - :huh: :huh: :huh:
Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #5 en: 9 Octubre 2016, 23:39 pm »

Hola, muy buen Domingo.
Tengo un problema con la función cargarArchivoMemoria (línea 36)no sé en que estoy fallando pero no me vuelca el contenido del fichero en la memoria, me podrían decir donde estoy fallando, leí, busque, practique pero debo recurrir a Uds. porque no lo logro. - 

El programa:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. long int tamanioArchivo( FILE *ptrArchivo, long int tamanio );
  5. char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio, char *archivoMem );
  6. void corrector( long int tamanio, char *archivoMem );
  7.  
  8. int main( int argc, char **argv ){
  9. FILE *ptrArchivo = NULL;
  10. long int tamanio = 0;
  11. char *archivoMem = NULL;
  12.  
  13. ptrArchivo = fopen("corregir.c", "r+t");
  14.  
  15. if( ptrArchivo != NULL ){
  16. tamanio = tamanioArchivo( ptrArchivo, tamanio );
  17. archivoMem = cargarArchivoMemoria( ptrArchivo, tamanio, archivoMem );
  18. corrector( tamanio, archivoMem );
  19. free( archivoMem );
  20. fclose( ptrArchivo );
  21. }else{
  22. printf( "\n ERROR - el archivo no se pudo abrir..." );
  23. exit(EXIT_FAILURE);
  24. }
  25.  
  26. return EXIT_SUCCESS;
  27. }
  28.  
  29. long int tamanioArchivo( FILE *ptrArchivo, long int tamanio ){
  30. fseek(ptrArchivo,0,SEEK_END);
  31. tamanio = ftell(ptrArchivo);
  32.  
  33. return tamanio;
  34. }
  35.  
  36. char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio, char *archivoMem ){
  37. int i=0;
  38. archivoMem = (char *)calloc( tamanio, sizeof(char) );
  39.  
  40. if( archivoMem != NULL ){
  41. while( !feof(ptrArchivo) ){
  42. *(archivoMem+i) = fgetc( ptrArchivo );
  43. i++;
  44. }
  45. }else{
  46. printf( "\n ERROR - Fallo la asignación de memoria..." );
  47. exit(EXIT_FAILURE);
  48. }
  49.  
  50. return archivoMem;
  51. }
  52.  
  53. void corrector( long int tamanio, char *archivoMem ){
  54. int i;
  55. for( i=0; i<tamanio; i++ ){
  56. printf("%d", *(archivoMem+i) );
  57. }
  58. }

El archivo a copiar:

Código
  1. #include <stdio.h>
  2.  
  3. int main( void ){
  4.  
  5. printf( "\n Hola mundo\n\n" );
  6.  
  7. return 0;
  8.  
  9. }

Gracias y un abrazo. -
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
geeke

Desconectado Desconectado

Mensajes: 93


Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #6 en: 10 Octubre 2016, 00:11 am »

Debes colocar el indicador de posición al comienzo del fichero nuevamente

Código
  1. long int tamanioArchivo( FILE *ptrArchivo, long int tamanio )
  2. {
  3.    fseek(ptrArchivo,0,SEEK_END);
  4.    tamanio = ftell(ptrArchivo);
  5.    rewind(ptrArchivo); //volver al inicio
  6.    return tamanio;
  7. }
« Última modificación: 10 Octubre 2016, 01:59 am por geeke » En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #7 en: 10 Octubre 2016, 02:07 am »

Hola, geeke, muchas gracias por ocuparte. -
Me voy a dar un fuerte tirón de orejas, a esta altura no me debería ocurrir estos errores tan de primer grado. -

Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #8 en: 10 Octubre 2016, 17:10 pm »

Tu función cargarArchivoMemoria no está bien diseñada.  En ella pasas como argumento archivoMem que resulta ser una declaración de una variable local de la función. Si retornas el dato a través del retorno de la función deberías quitar ese argumento de la llamada y transformarlo en declaración de variable local.
Si lo quieres como argumento de llamada deberías pasarlo por referencia (puntero a puntero) y modificarlo bien dentro de la función. Entonces puedes devolver el puntero a la cadena como valor de retorno u otra cosa para indicar éxito o fallo de la función.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Programa para revisar los errores de sintaxis de un programa en C.
« Respuesta #9 en: 10 Octubre 2016, 19:00 pm »

Hola, MAFUS.
Si amigo muchas gracias por la aclaración, cuando tengas un ratito de tiempo revisarla, por favor, para saber si ahora está correcto, dejo todo el código para que se fijen en la función en la línea 55, parece que da resultados correctos, lo hice de esta manera para no utilizar mil if o un switch. - 
En cuanto a las barras invertida antes de la " y \ es porque me daba error y parece que no las tiene en cuenta como un elemento mas. -

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. long int tamanioArchivo( FILE *ptrArchivo, long int tamanio );
  5. char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio );
  6. void corrector( long int tamanio, char *archivoMem );
  7.  
  8. int main( int argc, char **argv ){
  9. FILE *ptrArchivo = NULL;
  10. long int tamanio = 0;
  11. char *archivoMem = NULL;
  12.  
  13. ptrArchivo = fopen("corregir.c", "r+t");
  14.  
  15. if( ptrArchivo != NULL ){
  16. tamanio = tamanioArchivo( ptrArchivo, tamanio );
  17. archivoMem = cargarArchivoMemoria( ptrArchivo, tamanio );
  18. corrector( tamanio, archivoMem );
  19. free( archivoMem );
  20. fclose( ptrArchivo );
  21. }else{
  22. printf( "\n ERROR - el archivo no se pudo abrir..." );
  23. exit(EXIT_FAILURE);
  24. }
  25.  
  26. return EXIT_SUCCESS;
  27. }
  28.  
  29. long int tamanioArchivo( FILE *ptrArchivo, long int tamanio ){
  30. fseek(ptrArchivo,0,SEEK_END);
  31. tamanio = ftell(ptrArchivo);
  32. rewind(ptrArchivo);
  33.  
  34. return tamanio;
  35. }
  36.  
  37. char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio ){
  38. int i=0;
  39. char *archivoMem = NULL;
  40. archivoMem = (char *)calloc( tamanio, sizeof(char) );
  41.  
  42. if( archivoMem != NULL ){
  43. while( !feof(ptrArchivo) ){
  44. *(archivoMem+i) = fgetc( ptrArchivo );
  45. i++;
  46. }
  47. }else{
  48. printf( "\n ERROR - Fallo la asignación de memoria..." );
  49. exit(EXIT_FAILURE);
  50. }
  51.  
  52. return archivoMem;
  53. }
  54.  
  55. void corrector( long int tamanio, char *archivoMem ){
  56. int i,j, operUno[16] = {0}, linea=1;
  57. char c, *operDos = "\"#.(){}[]<>;,=/\\";
  58.  
  59.  
  60. for( i=0; i<tamanio; i++ ){
  61. c = *(archivoMem+i);
  62. if( c != '\n' ){
  63. for( j=0; j<16; j++ ){
  64. if( c == *(operDos+j) ){
  65. operUno[j] += 1;
  66. }
  67. }
  68. }else{
  69. linea++;
  70. }
  71. }
  72.  
  73. for( j=0; j<16; j++ ){
  74. printf("\n %c = %d", *(operDos+j) , operUno[j] );
  75. }
  76. }

Saludos.
En línea

abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines