• Miércoles 3 de Julio de 2024, 04:27

Autor Tema:  Valor Por Referencia  (Leído 1077 veces)

Black_angel

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Valor Por Referencia
« en: Lunes 29 de Diciembre de 2003, 10:11 »
0
Hola a todos, esta es la primera vez que entro en este foro, a ver si me pueden ayudar.
  Tengo un programa que trabaja llamando a funciones con argumentos que son apuntadores a estructuras, les pongo la parte de código que me interesa:

void Programa(void)
{
   nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref *));
  una_funcion(dec_listaerrores);
}


void una_funcion(nodo_ref *dec_listaerrores)
{
   nodo_ref *dec1_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
   nodo_ref *dec2_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
  if (!strcmp(lookahead->cadena,"hola"))
    {
      otra_funcion(dec1_listaerrores);
      una_funcion(dec2_listaerrores);
      dec_listaerrores= UNIR(dec1_listaerrores, dec2_listaerrores);
    }
  else
   dec_listaerrores= NULL;
}


nodo_ref esta definido de la forma:
typedef struct e_nodo {
  int ref;
  struct e_nodo *sig;
} nodo_ref;



     El problema es que por ejemplo, si entro a "una_funcion" y lookahead->cadena no es "hola" se va por la parte del else asignando NULL a dec_listaerrores, pero cuando vuelve al procedimiento Programa dec_listaerrores ya no apunta a NULL.
  Espero haberme explicado bien. Les estaría muy agradecido si me explicasen porqué pasa esto y qué tengo que hacer para solucionarlo.
Muchas gracias de antemano. :hola:

plaf

  • Miembro activo
  • **
  • Mensajes: 57
    • Ver Perfil
Re: Valor Por Referencia
« Respuesta #1 en: Lunes 29 de Diciembre de 2003, 20:38 »
0
(((se te colo un "*" en "nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref *));" <----ese)))

el problema es q cuando tu llamas una funcion con un parametro, la funcion crea otra variable local con el mismo valor q ese parametro, asi q el valor del parametro original no cambia
cuando tu haces una_funcion(dec_listaerrores); una_funcion() no trabaja con esa variable, sino q crea otro puntero q apunta donde mismo, asi q puedes cambiar los valores a los q apunta y cuando vuelvas los valores estaran cambiados, pero la variable q pasaste como parametro nunca va a cambiar
si quisieras cambiarla tendrias q pasarle a la funcion un puntero a un puntero, algo asi:

void Programa(void)
{
nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
una_funcion(&dec_listaerrores);
}

void una_funcion(nodo_ref **dec_listaerrores)
{
nodo_ref *dec1_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
nodo_ref *dec2_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
if (!strcmp(lookahead->cadena,"hola"))
{
otra_funcion(dec1_listaerrores);
una_funcion(dec2_listaerrores);
*dec_listaerrores= UNIR(dec1_listaerrores, dec2_listaerrores);
}
else
*dec_listaerrores= NULL;
}


bueno espero haber sido claro, cualquier duda avisas

Black_angel

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Valor Por Referencia
« Respuesta #2 en: Lunes 29 de Diciembre de 2003, 20:42 »
0
Problema resuelto. El problema residía en el manejo de los apuntadores debido a que C pasa los parámetros por valor, hay que trabajar con apuntadores de apuntadores
  Por si acaso alguien alguna vez tiene el mismo problema dejo aquí el código correcto:

void Programa(void)
{
nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref *));
una_funcion(&dec_listaerrores);
}


void una_funcion(nodo_ref **dec_listaerrores)
{
nodo_ref *dec1_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
nodo_ref *dec2_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref));
nodo_ref *aux=(nodo_ref *)malloc(sizeof(nodo_ref));
aux=NULL;
if (!strcmp(lookahead->cadena,"hola"))
{
   otra_funcion(&dec1_listaerrores);
   una_funcion(&dec2_listaerrores);
   aux= UNIR(dec1_listaerrores, dec2_listaerrores);
}

*dec_listaerrores= aux;
}


Un saludo para todos :hola:

Black_angel

  • Nuevo Miembro
  • *
  • Mensajes: 21
    • Ver Perfil
Re: Valor Por Referencia
« Respuesta #3 en: Lunes 29 de Diciembre de 2003, 20:46 »
0
ey, muchas gracias plaf, hemos contestado casi a la vez, jeje. El * que dices del malloc al parecer no me da error, pero tienes razón, creo que sobra.
Muchas gracias!!