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

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

0 Miembros y 1 Visitante están viendo este tema.

MAFUS

Vale , ahora dos cosas más, tres:
calloc es un poco lenta puew además de adquirir memoria la pone a 0. Como llenas toda esta memoria con el contenido del archivo no hace falta ponerla a 0, por tanto puedes usar malloc.

Ya qu adquieres memoria con malloc deberías liberarla, es una buena práctica,  despues de usarla. En main debes usar free para liberar archivoMem.

De igual forma tienes abierto un archivo en ptrArchivo. Debes liberarlo cuando termines de usarlo con fclose.

NOB2014

Lo que me sugieres que haga no está contemplado en las lineas 19 y 20.
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


NOB2014

Tengo casi todo preparado para hacer lo más importante que es corregir errores de sintaxis pero ete aquí que no se me cae una misera idea, preguntarle si hay algo escrito como un tutorial sobre el tema ni lo pienso porque busque bastante en internet y nada, salvo que aya buscado equivocadamente. -
Les dejo una pregunta para tratar de que me den un empujoncito para comenzar, si la primera línea es:
include <stdio.h>
Como harían para encontrar el error. -

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

Es algo complicado.
C no trabaja con comprobaciones sin más. Diría que es más como un autómata finito.
Cuando dudes, fíjate en las salidas que generaría tu compilador:
a < b >
Da error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token

Ha encontrado un nombre que no es una palabra reservada, y espera una de esas cadenas después.

Hombre, no es por ponerte trabas, pero hacer un analizador de C para todos los casos es complicado. Tendrás que tener un montón de palabras y construcciones en cuenta y estudiar a fondo las estructuras que posee.
Una cosa es verificar los comentarios, llaves, corchetes, parantesis y comillas, y otra ya es analizar cada palabra xd

geeke

Cita de: NOB2014 en 10 Octubre 2016, 23:23 PM
Les dejo una pregunta para tratar de que me den un empujoncito para comenzar, si la primera línea es:
include <stdio.h>
Como harían para encontrar el error. -

En primer lugar en el enunciado del ejercicio no se menciona detectar este tipo de errores, te aconsejo resolver primero lo propuesto luego intentar ir mas alla. Te puedo dar una idea de como lo puedes encarar, lo que puedes hacer es usar contadores para cada caso establecerlos a cero. Luego por ejemplo si encuentras una llave de apertura incrementar el contador correspondiente y decrementarlo si encuentras una llave de cierre, posteriormente verificar el contador

Saludos

NOB2014

Hola a todos. -
Gracias Iván por tu participación, siempre con buen aporte, geeke tienes toda la razón me estaba yendo por las ramas, me diste un impulso importante ya que estaba por dejarlo por un tiempo seguir con el libro y retomarlo luego ya que continuar con esto me va a dar mucho conocimiento, bueno a pensar y practicar, a una última cosa, debería tener mucha mala suerte si encuentro un código entre comillas con un solo paréntesis y si ocurre habrá que darse idea, tal vez cuando encuentre comillas dobles debería saltar hasta encontrar la siguiente comillas. -

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

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

Las comillas las puedes tratar como cualquier paréntesis o llave. Las únicas diferencias, es que se abre y se cierra con el mismo símbolo, y la más importante: cuando haya una comilla, ignorarás los paréntesis, llaves y corchetes que haya hasta que se cierren las comillas de nuevo.

Ten en cuenta también, los caracteres de escape. Por ejemplo:
Código (cpp) [Seleccionar]
"abc\"sdf"

O un pelín más complejo:
Código (cpp) [Seleccionar]
"abc\\"
"abc\\\"sdf"

NOB2014

#18
Hola a todos. -
Continuando con mi proyecto me encuentro con la necesidad de guardar la línea donde se encuentra por Ej. una apertura de llave para luego si encuentro un cierre de la misma poner el contador a cero en el correspondiente elemento del vector contador(geeke), pero si no encuentro el cierre de la misma es un error y debo mostrar el mensaje y una referencia en que línea se encuentra el mismo, para ello tengo que utilizar memoria dinámica ya que si bien conozco la cantidad de columnas no así la cantidad de filas (renglones), porque puede ocurrir que haya 3 aperturas de llaves y luego se encontrarían los cierre de las mismas (o no) y de no ser así necesito las referencias de las líneas donde se encuentran. -
Hasta aquí me parece que estoy bien rumbado pero la cuestión es que no sé cómo hacer una tabla con memoria dinámica, para un arreglo lo hice de esta manera(código a continuación) y todo funciona pero para un matriz no me doy idea y no pude encontrar ejemplos en internet, encontré algunos pero es sabiendo de antemano las filas y las columnas. -

   

void ingreso( void ){
size_t ingresos, contador = 0, n, ok, ch;
int *numeros = NULL, *mas_numeros = NULL;

do{
do{
printf( "\n Ingrese un numero entero (0 para finalizar).....: " );
ok = scanf( "%lu", &ingresos ) == 1 && ingresos >= 0;
while( (ch = getchar()) != EOF && ch != '\n');

if( ok == 0 ){
printf( "\n El ingreso es incorrecto, intentelo nuevamente...\n\n\t");
printf("Pulse una tecla para continuar..." ); getchar();
}

}while( !ok );

contador++;
mas_numeros = (int*)realloc(numeros, contador * sizeof(int));

if( mas_numeros != NULL ){
numeros = mas_numeros;
numeros[contador-1] = ingresos;
}
else{
safeFree( numeros );
puts( "Error en asignar memoria....." );
exit(1);
}
}while( ingresos != 0 );

limpiarPantalla();

printf ("\n Numeros introducidos.....: ");
for( n=0; n < contador - 1; n++ )
printf( "%d ",numeros[n] );

ordenar( contador, numeros );

safeFree( numeros );
}

Espero como siempre deseen ayudarme.-
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, ¿cómo están?
Parece que lo logré, el programa que dejo es para practicar es obvio que podía haber asignado toda la memoria de una vez y esta de más aclararles que utilizo un arreglo de una dimensión como si fuera de dos.

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


int main( int argc, char **argv ){
int fil=1, col=5, i, j, x=col, *tmp=NULL ;
int a[] = {33,18,5,2,19,306,202,88,31,64};
int *ptrArr = (int *)malloc( fil*col*sizeof(int) );

if( ptrArr != NULL ){
fil++;
x += col;

tmp = (int *)realloc( ptrArr, x );
if( tmp != NULL ){
ptrArr = tmp;
tmp = NULL;
x=0;
for( i=0; i<fil; i++ ){
for( j=0; j<col; j++ ){
ptrArr[fil*i+j] = a[x];
printf( "%3d ", ptrArr[fil*i+j] );
x++;
}
printf("\n");
}
}else{
printf( "\n No se pudo reasignar memoria" );
return EXIT_FAILURE;
}
}else{
printf( "\n No se pudo reservar memoria" );
return EXIT_FAILURE;
}

free( ptrArr );
ptrArr = NULL;

return EXIT_SUCCESS;

}

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