Consulta informar errores y reserva de memoria para punteros a imagen

Consulta informar errores y reserva de memoria para punteros a imagen

de Santiago Quinteros Vargas -
Número de respuestas: 8

Buenas, en la sección 4.2 que habla del obligatorio2.c dice que el error en la función  que pasa de color a blanco y negro debe ser "detectado y señalado". Esto implica que ademas de devolver un ERROR debe tambien imprimir "hay un error en la funcion..."?. De ser así, en cada error hay que imprimir una cadena que informe los errores? Si no es el caso entonces no entiendo que significa "señalado".


Una segunda pregunta, todas las reservas de tamaño "Imagen" se hacen fuera de las funciones, cierto? 

En respuesta a Santiago Quinteros Vargas

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Leopoldo Agorio -

Hola, la sección 4.2 explica el funcionamiento de la rutina main (y no de la función convertirImagenColorAGris). En un manin el retorno no suele ser relevante ya que el usuario lo va a correr y ya; los errores se le avisan a usuario a través de impresiones por línea de comando.

Todas las reservas de memoria para variables de tipo Imagen se hacen DENTRO de las diversas funciones. Por ejemplo, inicializarImagen establece ''inicializa los datos [...] y reserva memoria para sus nuevos pixeles'', y frases similares se encuentran en duplicarImagen, convertirImagenColorAGris y zoomImagen, en las que se habla explícitamente de alocación de memoria dentro de la función.

En respuesta a Leopoldo Agorio

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Leopoldo Agorio -
Hago un comentario adicional, ya que es un error frecuente de exceso de alocamiento, o mal uso de pasajes por referencia:

Vos en varias de estas funciones tenés una variable en el main y querés pasar por referencia esa variable.
Para ir a un ejemplo más sencillo, veamos un error común que es reservar memoria para un int.

Imaginate que tenes una función exp(int *) que recibe un int por referencia y lo modifica para darte e^x con e el número de Euler. El resultado se trunca digamos para que siga siendo int.
Lo correcto en el main sería esto:
{
int num = 5;
exp(&num);
print(''%d'', num);
}

Ese código de ejemplo funcionaría y te devolvería una impresión en pantalla que diría el número 148 (e^5).

Otra alternativa, esto que pongo abajo, si bien puede funcionar es un uso INCORRECTO de alocación de memoria . Este uso es incorrecto porque int no es un puntero, es un tipo de datos con tamano conocido (sizeofi(int)) y el compilador no requiere alocar memoria, con declararlo el compilador ya asignó memoria para esa variable:
{
int* pnum;
pnum = malloc(sizeof(int));
exp(pnum);
print(''%d'', pnum*);
}
Hacer esto está mal por varios motivos y el primero es la claridad, verdaderamente se vuelve difícil seguir la lógica de algo escrito así. Espero que esto tenga relación con tu pregunta y la de varios compañeros
En respuesta a Leopoldo Agorio

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Rodrigo Javier Paganini Pesce -
Hola, una pregunta, lo último que decís excluye a la reserva de memoria del puntero a imagen, no?
En respuesta a Rodrigo Javier Paganini Pesce

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Leopoldo Agorio -
Hola, aprovecho la pregunta de Rodrigo para hacer una aclaración que Camilo me hizo notar:

Yo tengo el sesgo de haber hecho el pasaje por referencia como en el primer mini código que pegué, y por eso creo no haber entendido la pregunta original. En mi versión del código no manejo nunca un puntero (a int en ese caso, a Imagen en la letra), y nunca tengo que reservar memoria para él.

Sin embargo si optan por la segunda alternativa, que es válida también, deben reservar memoria para el puntero en el bucle principal.
Así que disculpen el enredo, la respuesta a la pregunta original es: ''La ÚNICA reserva de memoria que PUEDE O NO serles útil hacer en el bucle principal, es una eventual reserva de memoria para el puntero a Imagen. Noten que pueden evitar esa reserva de memoria definiendo una variable de tipo Imagen y pasándola por referencia a las funciones que la requieran''.

Espero que la auto-aclaración haya ayudado a Rodrigo también, y mil disculpas por el enredo
En respuesta a Leopoldo Agorio

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Silvina Daniela Datz Helbling -
y es mejor evitar dicha reserva de memoria? o las dos formas son iguales de correctas?
En respuesta a Silvina Daniela Datz Helbling

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Camilo Joaquin Mariño Cabrera -
No es necesario evitar esa reserva, lo importante es que entiendan la diferencia entre ambos ambos métodos como explico Leopoldo.

Para la corrección ambas alternativas son consideras igual de correctas.
En respuesta a Leopoldo Agorio

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Guillermo Cossio Coppes -
Una consulta sobre esto ultimo: si al principio del código, porque me hace mas fácil la lectura, defino lo siguiente:

Imagen img;
Imagen* pimg = &img;

se consideraría un error? Si no me equivoco esto no implicaría una reserva innecesaria de memoria, aunque tal vez no se considera una buena práctica.
En respuesta a Guillermo Cossio Coppes

Re: Consulta informar errores y reserva de memoria para punteros a imagen

de Leopoldo Agorio -
Es válida esa versión, básicamente igual a la opción 1 agregando un nombre de variable. No le veo ningún inconveniente en términos de buenas prácticas y como decís te ahorrás un malloc.