3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Alejandro Blanco -
Número de respuestas: 14
En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Guillermo Wajner Barrios -
Buenas noches, al probar la funcion imprimirNombreYApellido obtengo un resultado de la siguiente forma:

>El nombre de la persona es: ?}
>El apellido de la persona es: Doe

El nombre "?}" varía cada ejecución independientemente de la entrada. Por el comportamiento calculo que esta accediendo a un espacio de memoria incorrecto, pero no entendería por qué, sobre todo cuando la implementación es análoga a la del apellido.

Este es el resultado de ejecutar el código con valgrind: https://pastebin.com/HTYAN5FX

¿Cuál puede ser el motivo de este error?


En respuesta a Guillermo Wajner Barrios

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Facundo Burdin Ponce De Leã“N -
Pude resolverlo. Viste que usas una función strpcy (o algo así). Bueno, volve a usar la misma función en las funciones que te retornan el nombre y el apellido nombrePersona y apellidoPersona. Con eso se debería solucionar el error.
En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Agustina Latorre Jauregui -
Buenos días, no termino de entender qué se supone que haga en nombrePersona y apellidoPersona, porque pide una función que retorne el nombre/apellido de la persona, sin embargo es un procedimiento y me da una persona y un nombre, que no es pasado por referencia.
Entonces si asumo que tengo que devolverlo en un return, ¿cuál de los dos retorno y por qué me dan más info que supuestamente sería innecesaria?
En respuesta a Agustina Latorre Jauregui

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Alejandro Blanco -
Agustina.
Los procedimientos nombrePersona y apellidoPersona reciben como parámetro una variable del tipo persona y una segunda que es un array of char para "devolver" el nombre o apellido de la persona. En realidad el segundo parámetro es un puntero.
Porque? Esto se debe a que en C y C++ el nombre de un arreglo es en realidad un puntero al primer elemento.

Si quieren leer un poco más de esto, recomiendo que busquen documentación de C/C++ sobre la relación de punteros y arreglos. Si tienen el libro "The C Programming Language" de Kernighan & Ritchie, se describe la relación de punteros y arreglos en el capitulo 5, Pointer and Arrays (5.3, Pointers and Arrays).

En definitiva, el 2do parámetro de estas funciones son punteros a char.

Espero que ahora quede un poco más claro.

Saludos

Alejandro B
En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Alan Joskowicz Fidalgo -
Los procedimientos nombrePersona y apellidoPersona son del tipo void por lo que no retornan ningún valor. A su vez, el cabezal proporcionado para ambos procedimientos pasan por valor el parámetro nombre, por lo que no existe forma de que se retorne algo (ni como función ni por referencia).

Propongo que la intención era algo del estilo:

void nombrePersona(TPersona persona, char &nombre) {
[iteración que asigna carácter por carácter del parámetro nombre del de la persona a nombre]
}

De esta forma, pasando por referencia, la variable nombre del principal.cpp queda con el valor del nombre de la persona. Sin embargo, esto implica que hay que modificar el principal.cpp para que cuando se llame esta función sea del estilo nombrePersona(persona, nombre[0]); indicando que se pasa como parámetro el primer carácter del arreglo nombre.

¿Está permitido modificar los cabezales de la función y el principal.cpp? En caso de que no, ¿cómo puede solucionarse?
En respuesta a Alan Joskowicz Fidalgo

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Alejandro Blanco -
Alan.

No, fijate mi respuesta a Ezequiel y Agustina (https://eva.fing.edu.uy/mod/forum/discuss.php?d=300679#p665244)

Saludos

Alejandro B
En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Fernando Javier Acuña Gomez -

Buenas tardes,

me sucede algo similar a los demás compañeros.

el nombre aparece como una serie de simbolos, mientras que el apellido aparece correcto, a pesar que utilizo el mismo código para ambos:


En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Máximo Timoteo Piccirillo Malanga -

Buenas tardes, me está generando este error de memoria. Según entiendo el problema se genera ya que se solicita memoria para crear una fecha pero luego se finaliza el programa sin liberar la memoria solicitada para la fecha, sin embargo sí se libera la memoria solicitada para la persona. Hay algún detalle que pasé por alto? Gracias.


En respuesta a Máximo Timoteo Piccirillo Malanga

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Alejandro Blanco -
Máximo.

EL problema parece estar en la implementación de liberarTpersona. Fijate si estas liberando correctamente la memoria de la fecha de nacimiento de la persona y la memoria usada para almacenar la info en persona

Saludos
Alejandro B
En respuesta a Alejandro Blanco

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Roberto Hernández -
Liberar la memoria usada para almacenar la info en persona sería borrar los dos arreglos de 'char' que contienen el nombre y el apellido? Es eso? En caso de que sí, cómo se hace?
En respuesta a Roberto Hernández

Re: 3. Implementar las funciones nombrePersona, apellidoPersonay liberarTPersona

de Maria de las Nieves Freira -
Hola, Roberto.
No, eso no es necesario, porque se borra al borrar la variable persona. 
Solo tenés que liberar lo apuntado por el campo fecha de la persona (usar las funciones de TFecha), y luego alcanza con borrar la variable persona. (No olvidar al final poner la variable en NULL.)