Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

capzulu

problema com listas ligadas

Mensagens Recomendadas

capzulu    0
capzulu

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
pmg    102
pmg
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" ...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
capzulu    0
capzulu

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]

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade