Programa para revisar los errores de sintaxis de un programa en C.

Iniciado por NOB2014, 8 Octubre 2016, 14:54 PM

0 Miembros y 2 Visitantes están viendo este tema.

NOB2014

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. -

CitarEjercicio 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. -
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

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.

NOB2014

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.
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

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.

NOB2014

if( ptrArchivo != NULL ){
fseek(ptrArchivo,0,SEEK_END);
tamanio = ftell(ptrArchivo);
fclose( ptrArchivo );
}else{
printf( "\n ERROR - el archivo no se pudo abrir..." );
exit(EXIT_FAILURE);
}


Ahora me quiero ver con el resto. - :huh: :huh: :huh:
Saludos.
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

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:

#include <stdio.h>
#include <stdlib.h>

long int tamanioArchivo( FILE *ptrArchivo, long int tamanio );
char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio, char *archivoMem );
void corrector( long int tamanio, char *archivoMem );

int main( int argc, char **argv ){
FILE *ptrArchivo = NULL;
long int tamanio = 0;
char *archivoMem = NULL;

ptrArchivo = fopen("corregir.c", "r+t");

if( ptrArchivo != NULL ){
tamanio = tamanioArchivo( ptrArchivo, tamanio );
archivoMem = cargarArchivoMemoria( ptrArchivo, tamanio, archivoMem );
corrector( tamanio, archivoMem );
free( archivoMem );
fclose( ptrArchivo );
}else{
printf( "\n ERROR - el archivo no se pudo abrir..." );
exit(EXIT_FAILURE);
}

return EXIT_SUCCESS;
}

long int tamanioArchivo( FILE *ptrArchivo, long int tamanio ){
fseek(ptrArchivo,0,SEEK_END);
tamanio = ftell(ptrArchivo);

return tamanio;
}

char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio, char *archivoMem ){
int i=0;
archivoMem = (char *)calloc( tamanio, sizeof(char) );

if( archivoMem != NULL ){
while( !feof(ptrArchivo) ){
*(archivoMem+i) = fgetc( ptrArchivo );
i++;
}
}else{
printf( "\n ERROR - Fallo la asignación de memoria..." );
exit(EXIT_FAILURE);
}

return archivoMem;
}

void corrector( long int tamanio, char *archivoMem ){
int i;
for( i=0; i<tamanio; i++ ){
printf("%d", *(archivoMem+i) );
}
}


El archivo a copiar:

#include <stdio.h>

int main( void ){

printf( "\n Hola mundo\n\n" );

return 0;

}


Gracias y un abrazo. -
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

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

long int tamanioArchivo( FILE *ptrArchivo, long int tamanio )
{
    fseek(ptrArchivo,0,SEEK_END);
    tamanio = ftell(ptrArchivo);
    rewind(ptrArchivo); //volver al inicio
    return tamanio;
}

NOB2014

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.
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

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.

NOB2014

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. -

#include <stdio.h>
#include <stdlib.h>

long int tamanioArchivo( FILE *ptrArchivo, long int tamanio );
char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio );
void corrector( long int tamanio, char *archivoMem );

int main( int argc, char **argv ){
FILE *ptrArchivo = NULL;
long int tamanio = 0;
char *archivoMem = NULL;

ptrArchivo = fopen("corregir.c", "r+t");

if( ptrArchivo != NULL ){
tamanio = tamanioArchivo( ptrArchivo, tamanio );
archivoMem = cargarArchivoMemoria( ptrArchivo, tamanio );
corrector( tamanio, archivoMem );
free( archivoMem );
fclose( ptrArchivo );
}else{
printf( "\n ERROR - el archivo no se pudo abrir..." );
exit(EXIT_FAILURE);
}

return EXIT_SUCCESS;
}

long int tamanioArchivo( FILE *ptrArchivo, long int tamanio ){
fseek(ptrArchivo,0,SEEK_END);
tamanio = ftell(ptrArchivo);
rewind(ptrArchivo);

return tamanio;
}

char *cargarArchivoMemoria( FILE *ptrArchivo, long int tamanio ){
int i=0;
char *archivoMem = NULL;
archivoMem = (char *)calloc( tamanio, sizeof(char) );

if( archivoMem != NULL ){
while( !feof(ptrArchivo) ){
*(archivoMem+i) = fgetc( ptrArchivo );
i++;
}
}else{
printf( "\n ERROR - Fallo la asignación de memoria..." );
exit(EXIT_FAILURE);
}

return archivoMem;
}

void corrector( long int tamanio, char *archivoMem ){
int i,j, operUno[16] = {0}, linea=1;
char c, *operDos = "\"#.(){}[]<>;,=/\\";


for( i=0; i<tamanio; i++ ){
c = *(archivoMem+i);
if( c != '\n' ){
for( j=0; j<16; j++ ){
if( c == *(operDos+j) ){
operUno[j] += 1;
}
}
}else{
linea++;
}
}

for( j=0; j<16; j++ ){
printf("\n %c = %d", *(operDos+j) , operUno[j] );
}
}


Saludos.
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.-