• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

capzulu

problema com listas ligadas

3 mensagens neste tópico

boas pessoal,

tenho umas funções para mexer numa lista ligada mas não estou a conseguir chamar uma dentro da outra


typedef struct objecto clientes, *pclientes; 
struct objecto{
char ip[20];
time_t tempo;
pclientes prox;
};

void actualiza_tempo(pclientes p, char *ip){
time_t t=time(NULL);

while( p!=NULL && (strcmp(p->ip,ip)!=0) )
	p=p->prox;
if (p!=NULL)
	p->tempo=t;
}

primeiro esta nao percebo com altera valores na lista real sem retornar nada

e depois tenho mais estas

pclientes elimina(pclientes p, char *ip){
pclientes actual, ant=NULL;

actual = p;
while(actual!=NULL && (strcmp(actual->ip,ip)!=0)){
	ant = actual;
	actual = actual->prox;
}
if(actual==NULL)
	return p;
if(ant==NULL) /*1º nó da lista*/
	p=actual->prox;
else
	ant->prox=actual->prox;
free(actual);
return p;
}

void elimina_tempo(pclientes p){
time_t t=time(NULL);

while( p!=NULL ){
	if((t-p->tempo)>10)
//			elimina(p,p->ip);
	p=p->prox;
}
}

no main tenho...

actualiza_tempo(cliente,ip);
elimina_tempo(cliente);

a ultima função não está muito bem feita mas era para não me dar erros a compilar.

O problema é que não estou a conseguir eliminar clientes, dá-me um erro de memória.

Se alguém me pudesse ajudar agradecia.

Estou a fazer um programa com sockets para uma cadeira, depois de terminado eu posto aqui no forum... já que reparei que não existe muito sobre esse tópico

Abraços pessoal

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
O problema é que não estou a conseguir eliminar clientes, dá-me um erro de memória.

Ao comentares a instrução elimina(p, p->ip) a instrução seguinte passou a ser a instrução do corpo do if.

Podes acrescentar uns {} ao teu código.

	while( p!=NULL ){
	if((t-p->tempo)>10)
	{
//			elimina(p,p->ip);
	}
	p=p->prox;
}

Só não percebo porque é que dá "erro de memória" ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só não percebo porque é que dá "erro de memória" ...

aparece-me isto

*** glibc detected *** ./servidor: double free or corruption (fasttop): 0x0804b2d8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e47a85]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7e4b4f0]
./servidor[0x804931f]
./servidor[0x80494a2]
./servidor[0x8048dcb]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7df2450]
./servidor[0x8048971]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:05 138172     /home/capzulu/Área de Trabalho/sockets/udp/servidor
0804a000-0804b000 rw-p 00001000 08:05 138172     /home/capzulu/Área de Trabalho/sockets/udp/servidor
0804b000-0806c000 rw-p 0804b000 00:00 0          [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0 
b7c21000-b7d00000 ---p b7c21000 00:00 0 
b7ddb000-b7ddc000 rw-p b7ddb000 00:00 0 
b7ddc000-b7f25000 r-xp 00000000 08:05 383219     /lib/tls/i686/cmov/libc-2.7.so
b7f25000-b7f26000 r--p 00149000 08:05 383219     /lib/tls/i686/cmov/libc-2.7.so
b7f26000-b7f28000 rw-p 0014a000 08:05 383219     /lib/tls/i686/cmov/libc-2.7.so
b7f28000-b7f2b000 rw-p b7f28000 00:00 0 
b7f2b000-b7f35000 r-xp 00000000 08:05 364341     /lib/libgcc_s.so.1
b7f35000-b7f36000 rw-p 0000a000 08:05 364341     /lib/libgcc_s.so.1
b7f36000-b7f3a000 rw-p b7f36000 00:00 0 
b7f3a000-b7f3b000 r-xp b7f3a000 00:00 0          [vdso]
b7f3b000-b7f55000 r-xp 00000000 08:05 367807     /lib/ld-2.7.so
b7f55000-b7f57000 rw-p 00019000 08:05 367807     /lib/ld-2.7.so
bfa37000-bfa4c000 rw-p bffeb000 00:00 0          [stack]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora