Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Vaciando una lista

Estas en el tema de Vaciando una lista en el foro de C/C++ en Foros del Web. Me he montado una lista a mi gusto para un juego que estoy haciendo. En esta lista voy metiendo las teclas que voy pulsando y ...
  #1 (permalink)  
Antiguo 30/07/2006, 04:54
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 20 años
Puntos: 0
Vaciando una lista

Me he montado una lista a mi gusto para un juego que estoy haciendo.
En esta lista voy metiendo las teclas que voy pulsando y la vacio cuando entre tecla y tecla ha pasado un cierto intervalo de tiempo.

Mi pregunta es si estoy vaciando correctamente la lista, ya que a veces el juego se me queda colgado y nose que es lo que me pasa.
s8 es un signed int de 8 bytes
u32 es un unsigned int de 32 bytes
Aquí las estructuras::
Código:
typedef struct button
{	s8 tecla;	//tecla pulsada
	bool hold;	//esta mantenido pulsado?
	u32 time;	//Numero de segundos desde que empezó la partida
}button;


//Puntero a un nodo
typedef struct nodo
{	button boton;
	struct nodo* next;	//apunta al suiguiente
	struct nodo* prev;	//apunta al anterior
}nodo;

typedef struct lista{
	nodo* last;  	//apunta al ultimo
	nodo* first;  	//apunta al primero
	nodo* eye;		//apunta al que al ultimo visto
	int elm;		//numero de elementos
}lista;
Aqui las funciones
Código:
/*	Crear la lista
*/
lista* newLista(void)
{	lista* q;		//q de query(lista)
	q=(lista *)malloc(sizeof(lista));
	if(!q)
	{	//perror("No se ha reservado memoria para el listón");
	}
	else
	{	q->last=NULL;
		q->first=NULL;
		q->eye=NULL;
		q->elm=0;
	}
	return q;
}

/*	Insertar elemento en la lista
*/
void inserta(lista* lista,button boton)
{	nodo* nuevo;
	nuevo=(nodo*)malloc(sizeof(nodo));
	if(!nuevo) //Si no hay espacio...
	{	//perror("No hay espacio en memoria");
	}
	else
	{	nuevo->boton=boton;
		nuevo->next=NULL;
		nuevo->prev=NULL;

		if(lista->elm > 0)
		{	nuevo->prev=lista->last;		//El prev del nuevo apunta al ultimo de la lista
			lista->last->next=nuevo;		//El ultimo de la lista apunta al nuevo	
                        lista->last=nuevo;                         //El apuntador last apunta al nuevo						
		}
		else	//Si es el primer elemento...
		{	lista->first=nuevo;
			lista->eye=nuevo;
			lista->last=nuevo;
		}
		lista->elm++;	//Aumentamos el contador
	}
}

/* Modifica el ultimo valor
*/
void updateUltimo(lista* lista,button boton)
{	lista->last->boton=boton;
}

/*	Leemos el siguiente elemento de la lista
*/
button leer(lista* lista)
{	button temp;
	temp=lista->eye->boton;
	if(lista->eye->next)
	{	lista->eye=lista->eye->next;	//Apuntamos al siguiente
	}
	else
	{	lista->eye=lista->first;
	}
	
	return temp;
}

/*	Leemos el ultimo elemento de la lista
*/
button leerUltimo(lista lista)
{	button temp;
	if(lista.last!=NULL)
	{	temp=lista.last->boton;
		return temp;
	}
	else
	{	temp.tecla=myNULL;
		return temp;
	}
}

/*	Vaciamos la lista
*/
void vaciar(lista* lista)
{	nodo* aux;
	while(lista->elm > 0)	//Mientras no esté vacia vamos a ir vaciando elementos
	{	aux=lista->last;
		lista->elm--;
		if(lista->elm > 0)
		{	lista->last=lista->last->prev;		
		}
		free(aux);		
	}
	lista->first=NULL;
	lista->last=NULL;
}
No se si el free lo hago sobre el elemento correcto o deberia hacer un free de (lista->last)... nose, a veces con esto de los punteros me hago un lio

Última edición por clinisbut; 02/08/2006 a las 01:21
  #2 (permalink)  
Antiguo 01/08/2006, 14:57
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años, 7 meses
Puntos: 0
en la funcin de vaciar no veo un error, sin en bargo, me parece que el if que utilizasa es inecesario. Puesto que esta dentro de while, simpre que lo ejecutes es porque ya fue evaualdo como verdadera(la expreseiocn) en el while.
while(lista->elm > 0)
{
...
if(lista->elm > 0)
{
lista->last=lista->last->prev;
}
...
pero te prometo revisarlo detenidamente.

Por cierto, que te hacer pensar que que es esta funcion el problema.
__________________
-> La duda adecuada es un buen comienzo <-
  #3 (permalink)  
Antiguo 02/08/2006, 01:34
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 20 años
Puntos: 0
He arreglado un detalle que me provocaba que no funcionara correctamente el leerUltimo(), en la función que inserta no actualizaba el puntero last.

Por lo demás, los cuelgues ya no me ocurren, igual tenía el error en otro lugar, pero de todas maneras no estaba muy seguro de estar liberando la memoria correctamente.
  #4 (permalink)  
Antiguo 07/08/2006, 02:48
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 20 años
Puntos: 0
Bueno, creo que ya queda descartado que el problema provenga de mi lista, pero para mejorarla (o no) me pregunto lo siguiente:

Este "manager" de lista que me he montado solo me sirve para almacenar datos del tipo BUTTON (struct button), por lo que si quiero almecenar otro tipo de datos tengo que montarme todo un "manager" entero nuevo...

No hay manera de que el struct nodo pueda aceptar diferentes tipos de datos??¿¿

He leido (pero no se si es correcto, ni tampoco lo he probado) que los punteros a void son como "comodines" para cualquier tipo de datos... nose si andarian por ahi los tiros

Última edición por clinisbut; 10/08/2006 a las 03:06
  #5 (permalink)  
Antiguo 09/08/2006, 19:26
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años, 7 meses
Puntos: 0
Estas en lo correcto, uedes utilzar punteros void* en ves de "button", sin embargo yo te recomendaria que utilizares palteillas (me parese que son propies de c++), si lo hicieras asi, tu clase quedaria algo asi.

template<class T>
typedef struct nodo
{ T val;
struct T* next; //apunta al suiguiente
struct T* prev; //apunta al anterior
}nodo;

Cuando creas un objeto lo haras asi.
nodo<int> NodoInt; //ahora tienes un nodo que alamacena int
nodo<button> NodoButton; //ahora tienes un nodo que alamacena Button

Talvez tenga que corregir, lo siento, yo naci en C++ y no le he prestado atencion al estilo C.
__________________
-> La duda adecuada es un buen comienzo <-
  #6 (permalink)  
Antiguo 10/08/2006, 03:12
 
Fecha de Ingreso: diciembre-2004
Mensajes: 278
Antigüedad: 20 años
Puntos: 0
El problema es que estoy desarrollando en c y las caracteristicas de c++ no las domino nada (digamos que aún me falta por dominar c).
Creo que probaré el puntero a void para empezar...

Para utilizar las plantillas que me comentas debo incluir en el proyecto las STL verdad? o me equivoco? Són independientes de la plataforma donde se hagan correr?
es que el proyecto lo estoy desarrollando para una NDS (arm7 y arm9), lo digo por si me diera por utilizar plantillas (que no se hacer servir la verdad).

Gracias!
  #7 (permalink)  
Antiguo 12/08/2006, 17:36
arm
 
Fecha de Ingreso: mayo-2006
Mensajes: 112
Antigüedad: 18 años, 7 meses
Puntos: 0
No conosco ninguno de los terminos que mencionas, si son de c, te repito que no lo he estudiado. Sin embargo se que puedes compilar tos archivos de C en C++ sin "problemas adicionales", es decir, puedes usar tododos el codigo que tines y tal cual compilar, pero tienes que consegirte un compilador C/C++(yo uso Dev C++ el cual es libre), eso no es dificil por que todos los que yo conosco tinen esa capacidad. Los terminos propios de C++ los puedes dejar para despues.
Si con STL te refires a plntillas, pues te menciono que no neceitas incluir alguna para que cress la plantilla Nodo.
__________________
-> La duda adecuada es un buen comienzo <-
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:58.