Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problemas Ejercicio 3 #5

Open
ariel- opened this issue Mar 23, 2019 · 1 comment
Open

Problemas Ejercicio 3 #5

ariel- opened this issue Mar 23, 2019 · 1 comment

Comments

@ariel-
Copy link

ariel- commented Mar 23, 2019

  • 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:
  1. 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.
  2. 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 (int i = 0; i < 10; ++i)
  1. 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.

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

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

  1. 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
  2. Funcion Error5: nuevamente no se declara antes del uso.
@leobz
Copy link

leobz commented Mar 26, 2020

@ariel- una consulta, tendrás alguna resolución del Ejercicio 3 (Uso de Commons-Library)?
Porque no me está saliendo y no tengo con que comparar.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants