Happening Posted April 24, 2012 at 11:32 AM Report #451091 Posted April 24, 2012 at 11:32 AM Boas passa-se o seguinte, estou a implementar uma biblioteca de funções para a tabela hash. Ao tentar apagar toda a tabela (não tenho teste para esta função) ele corre mas quando é chamada nos testes das outras funções ele dá-me erro... Aqui está o meu código, se alguém pudesse ajudar agradecia muito... void tabela_apaga(tabela_dispersao *td) { elemento *temp; int i=0; for(i=0;i<td->tamanho;i++) { while(td->elementos[i]!=NULL) { temp=td->elementos[i]->proximo; free(td->elementos[i]->string); free(td->elementos[i]); td->elementos[i]=temp; } } free(td->elementos); free(td); } Fiz algumas alterações mas continua a não funcionar... O que fiz foi o seguinte utilizei uma função esvazia (que remove todos os elementos das listas e as deixa a NULL). Ficou assim: void tabela_apaga(tabela_dispersao *td) { if(td!=NULL){ tabela_esvazia(td); free(td->elementos); free(td); } } A função esvazia é a seguinte (desconfio que esta não me está a limpar todos os valores das varias listas) int tabela_esvazia(tabela_dispersao * td) { int i=0; elemento *temp; if(td==NULL) return TABDISPERSAO_INVALIDA; for(i=0;i<td->tamanho;i++) { while(td->elementos[i]!=NULL) { temp=td->elementos[i]->proximo; free(td->elementos[i]->string); free(td->elementos[i]); td->elementos[i]=temp; } } return TABDISPERSAO_OK; }
HappyHippyHippo Posted April 24, 2012 at 12:31 PM Report #451099 Posted April 24, 2012 at 12:31 PM como sabes que não funciona ?? o que consideras erro ?? perguntas e mais perguntas .... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bsccara Posted April 24, 2012 at 12:36 PM Report #451100 Posted April 24, 2012 at 12:36 PM Saber a definição do tipo 'tabela_dispersao' ajudava...
Happening Posted April 24, 2012 at 01:01 PM Author Report #451107 Posted April 24, 2012 at 01:01 PM Ora bem, para a implementação desta biblioteca forneceram-nos um teste para as funções. O meu IDE é o visual studio logo utilizei os break points e vi que o erro estava quando ia para a função apaga... Eu sei o que é uma tabela de dispersão. tens uma struct que eu chamo struct mãe definida por typedef struct { hash_func *hfunc; /* apontador para a função de hash */ elemento **elementos; /* vetor de listas */ int tamanho; /* tamanho do vetor de listas */ } tabela_dispersao; depois vais ter outra struct definida por typedef struct elem typedef struct elem { char *string; struct elem * proximo; } elemento; o que acontece é que a primeira o vector de listas vai ter varios apontadores para as listas e a partir dai são listas ligadas. Espero ter sido claro ?
bsccara Posted April 24, 2012 at 01:07 PM Report #451110 Posted April 24, 2012 at 01:07 PM Eu sei o que é uma tabela de dispersão. tens uma struct que eu chamo struct mãe definida por Eu não estava a dizer que tu não sabias, mas sim que eu não sabia...
Happening Posted April 24, 2012 at 01:39 PM Author Report #451113 Posted April 24, 2012 at 01:39 PM Ah ok desculpa, não tinha percebido
bsccara Posted April 24, 2012 at 03:09 PM Report #451129 Posted April 24, 2012 at 03:09 PM Não vejo erros no teu código. A criação da estrutura para um elemento será qualquer coisa do género: td = malloc(sizeof(tabela_dispersao)); td ->elementos = malloc(sizeof(elemento *) * 1); td->tamanho = 1; td->elementos[0] = malloc(sizeof(elemento)); td->elementos[0]->string = malloc(...); td->elementos[0]->proximo = NULL; Correcto ? Tem em atenção que o bloco para conter uma string tem de ter mais um byte (ou dois se fôr UTF-16, no Windows) para o zero final. Se, nalgum lado, escreveres fora das zonas de memória dos 'malloc' irás corromper as estruturas de gestão da alocação de memória e os problemas irão manifestar-se mais tarde ao tentar usar as função de alocação e libertação de memória.
Happening Posted April 24, 2012 at 04:05 PM Author Report #451146 Posted April 24, 2012 at 04:05 PM O erro que me dá é o seguinte: [shadow=red,left]HEAP CORRUPTION DETECTED: after Normal block (#112) at 0x00F05A80. CRT detected that the application wrote to memory after end of heap buffer.[/shadow]
HappyHippyHippo Posted April 24, 2012 at 04:44 PM Report #451160 Posted April 24, 2012 at 04:44 PM deve ser erro de inicialização de ponteiros, pois não é normal ser de pedir demasiada memória verifica se estás a inicializar correctamente os ponteiros da - tabela_dispersão - elemento NOTA : verifica principalmente a atribuição de NULL's a pointeiros IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
bsccara Posted April 24, 2012 at 05:21 PM Report #451177 Posted April 24, 2012 at 05:21 PM O erro é precisamente o que te disse: estás a escrever fora dum bloco alocado. Isso pode estar a acontecer em qualquer outro código executado antes do ponto em que dá erro. Este exemplo provoca esse tipo de problema : string = malloc(20); strcpy(string,"01234567890123456789"); /* Apesar de parecer que metes 20 bytes num buffer para 20, estás a meter 21 (a string tem um 0 final implicito) */ free(string); /* Pode dar erro aqui ou mais tarde, depende da implementação das rotinas de gestão de memória */
Happening Posted April 25, 2012 at 01:30 PM Author Report #451357 Posted April 25, 2012 at 01:30 PM Bah já sei, na função adiciona so estava a fazer o malloc(strlen(valor)*sizeof(char)) mas tem de ser malloc((strlen(valor)+1)*sizeof(char)); . Obrigado a todos pela ajuda 😉
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now