Consulta sobre retorno en las funciones

Iniciado por NicoSanhueza, 25 Junio 2018, 04:15 AM

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

NicoSanhueza

Buenas noches a todos, espero que esten bien.
El problema dice lo siguiente:

"Cree en el main() una variable del tipo struct dat del problema 1. Inicialize aa en 0.0 y pp en NULL.

Cree una funcion que retorne una estructura del tipo struct dat del problema 1 y asigne este retorno a la variable creada en el main().
Los valores de la estructura de retorno debe recibirlos como argumentos de la funcion y deben ser 78.9 para aa y una direccion de una variable que ya exista(Ud. debe crearla) en el main del mismo tipo."

Tengo entendido si se requiere modificar los valores se debe utilizar un puntero, en este caso deberá ser un puntero a estructura.
Mi problema esta en el momento del retorno de la función.
¿Esta mal planteada o hay un error en el main?

Cualquier tip de utilidad será bienvenido.
GRACIAS DE ANTEMANO  ;-)


OBS: la estructura del problema 1 ya esta en el codigo que  está a continuacion

Código (cpp) [Seleccionar]

typedef struct dat
{
    double aa;
    int* pp;
}dat;

int f=34;

dat func(dat*);

int main()
{
dat var;

dat* puntero=malloc(sizeof(dat));

var.aa=0.0;
var.pp=NULL;

var=func(puntero);



printf("%d",var.aa);
printf("%d",var.pp);


return 0;
}

dat func(dat* x)
{
    x->aa=78.9;
    x->pp=&f;

    return x;
}

SrMcLister

#1
Buenas NicoSanhueza.
A ver te comento, tienes un lio bastante interesante en la cabeza.
Lo voy a explicar en C++, puesto que C no tengo conocimientos.

Si creas una variable tipo dat llamada var, y a eso le asignas el retorno de una función con la que trabajas con punteros, estás buscandole 3 pies al gato no se si me entiendes...
La func recibe un puntero a estructura, y devuelve una estructura...
Si recibe un puntero y trabajas con el puntero... como vas a devolver una estructura?!... es decir, si quisieras devolver una estructura deberías crearte una variable auxiliar tipo dat en la que cambiar los datos.

Te lo modifiqué en C++ para que lo veas y que tuviera sentido:

Código (cpp) [Seleccionar]

#include <iostream>
using namespace std;

typedef struct{
   double aa;
   int* pp;
}dat;

int f=34;
dat func(dat*);

int main(){
    dat var;
    dat* puntero= new dat;
   
    var.aa=0.0;
    var.pp=NULL;
   
    cout << "Antes de modificar"<< endl;    
    cout << var.aa << ", " << var.pp << endl;
   
    var=func(puntero);
   
    cout << "Después de modificar"<< endl;    
    cout << var.aa << ", " << *var.pp << endl;
    return 0;
}

dat func(dat* x){
   dat aux;
   //Asignación de los nuevos valores al puntero pasado por parametros
   x->aa=78.9;
   x->pp=&f;
   //Rellenado de la nueva estructura a devolver con los valores del puntero
   aux.aa=x->aa;
   aux.pp=x->pp;
   return aux;    
}


Como verás, si la función devuelve una estructura, es obligatorio que devuelva una estructura, no un puntero a estructura.

Esta es otra opción que es más parecido a lo que tu querías hacer.

Código (cpp) [Seleccionar]

...
int main(){
     dat var;
     dat* puntero= new dat;
     ...
     var=*func(puntero);
     
     cout << "Después de modificar"<< endl;     
     cout << var.aa << ", " << *var.pp << endl;
     return 0;
}

dat* func(dat* x){
    x->aa=78.9;
    x->pp=&f;
    return x;
}


Echale un vistazo y comentas.

Un saludo.
Código (cpp) [Seleccionar]

return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());

MAFUS

Creo que no va por ahí la cosa, a mi entender el prototipo de la función es:
dat func(double real, int* puntero);

ThunderCls

Cita de: NicoSanhueza en 25 Junio 2018, 04:15 AM
Código (cpp) [Seleccionar]

dat func(dat* x)
{
    x->aa=78.9;
    x->pp=&f;

    return x;
}


Primero, la función esta mal planteada. No tiene mucho sentido lo que haces en este código, pero aun siguiendo tu lógica tienes un error, ya que segun el prototipo la función devuelve un tipo de dato struct en cambio tu estas devolviendo un puntero. En todo caso debes desreferenciar el puntero al retornarlo:
Código (cpp) [Seleccionar]
return *x;
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/