You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
En el pdf de ejercicios, hay 2 ejercicios con el número 3. Uno es sobre escribir un programa que procesa archivos de texto. El otro es sobre encontrar errores.
En el ejercicio 3, encontrar errores, hay más de los que marca el resuelto. Algunos tal vez no se noten pero sería importante tenerlos en cuenta:
Declaración de prototipos de funciones: Al no declarar antes de llamar a Errorx() el compilador asume que son funciones que devuelven int. Declarando las mismas como corresponde se soluciona el warning.
Función Error1: el int i puede declararse dentro del for, ya que no se utiliza fuera del mismo. Además el for utiliza el post-incremento. lo cual es innecesario ya que genera un temporal con el valor previo y en ningún momento se utiliza dicho valor previo. en asm se generan más instrucciones al usar post-inc/post-dec. En este caso el for corregido quedaria:
for (inti=0; i<10; ++i)
Función Error2: cadena2 es un puntero a char. que se lo inicializa con la dirección del primer carácter del string "El Zumba", constante y generado por el compilador. Esto no representaría ningún problema de no ser por el código: strcpy(cadena2, cadena3);
Utilizar cadena2 como destino de una copia es UB, ya que según el estandar es posible que el string "El Zumba" se genere en un segmento readonly, y por lo tanto al intentar escribir hace segfault (en windows funciona, en linux con el gcc no).
Para solucionarlo debería declararse cadena2 como array de char en el stack, de esta forma se asegura su posterior modificación.
Funcion Error2: malloc sin free. Ni st ni cadena3 se utilizan fuera de la función. Al perder referencia de las mismas se leakea memoria.
Funcion Error3: los prompts que aparecen en el código no se imprimen en pantalla, ya que la función de scanf es leer, no escribir. Se deberian intercalar los prompts (utilizando printf) con los input propiamente dichos:
printf("Inserte un numero ");
scanf("%d", &x);
printf("\nInserte una cadena ");
scanf("%30s", &st[0]);
printf("\n");
La función ModificarCadena tampoco se declara, pasa lo mismo que en punto 1
Por último, el búfer no se libera.
Función Error4: acá parece que se cambió el problema original; debido a que el resuelto tiene partes que en el problema son completamente diferentes (por ejemplo raiz de 2), la raiz es de 16 en el problema. El string "La raiz de 2 no me dio menor a 1!!!" presta a confusión.
Otra cosa a tener en cuenta es que la comparación entre doubles rara vez se hace con ==, siendo necesario tomar valor absoluto y compararlos por un delta pequeño, ya que los errores de precision del formato IEEE754 hacen que, por ejemplo 0.0 != 0.00000000000001
Funcion Error5: nuevamente no se declara antes del uso.
The text was updated successfully, but these errors were encountered:
int
. Declarando las mismas como corresponde se soluciona el warning.int i
puede declararse dentro del for, ya que no se utiliza fuera del mismo. Además el for utiliza el post-incremento. lo cual es innecesario ya que genera un temporal con el valor previo y en ningún momento se utiliza dicho valor previo. en asm se generan más instrucciones al usar post-inc/post-dec. En este caso el for corregido quedaria:Función Error2:
cadena2
es un puntero achar
. que se lo inicializa con la dirección del primer carácter del string "El Zumba", constante y generado por el compilador. Esto no representaría ningún problema de no ser por el código:strcpy(cadena2, cadena3);
Utilizar cadena2 como destino de una copia es UB, ya que según el estandar es posible que el string "El Zumba" se genere en un segmento readonly, y por lo tanto al intentar escribir hace segfault (en windows funciona, en linux con el gcc no).
Para solucionarlo debería declararse cadena2 como array de
char
en el stack, de esta forma se asegura su posterior modificación.Funcion Error2:
malloc
sinfree
. Nist
nicadena3
se utilizan fuera de la función. Al perder referencia de las mismas se leakea memoria.Funcion Error3: los prompts que aparecen en el código no se imprimen en pantalla, ya que la función de scanf es leer, no escribir. Se deberian intercalar los prompts (utilizando
printf
) con los input propiamente dichos:La función ModificarCadena tampoco se declara, pasa lo mismo que en punto 1
Por último, el búfer no se libera.
Otra cosa a tener en cuenta es que la comparación entre doubles rara vez se hace con ==, siendo necesario tomar valor absoluto y compararlos por un delta pequeño, ya que los errores de precision del formato IEEE754 hacen que, por ejemplo 0.0 != 0.00000000000001
The text was updated successfully, but these errors were encountered: