SoloCodigo
Programación General => C/C++ => Mensaje iniciado por: Black_angel en Lunes 29 de Diciembre de 2003, 10:11
-
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:
-
(((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
-
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:
-
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!!