Falha de segmentação ao executar arquivo.c [RESOLVIDO]

1. Falha de segmentação ao executar arquivo.c [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 04/06/2021 - 14:45h

Boa tarde pessoal, tudo bem ?
Alguem poderia me dar uma força ? Ao eexecutar esse código aparece o erro de falha de segmentação. Mas não vejo nada de errado no código, poderiam me dar uma dica ? Desde já agradeço.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct item
{
int x;
char str[4];
};

struct hashtable
{
int flag;
int tamanho;
struct item *item;
};

struct hashtable *hashtable;

//prototipos ------------------------------------------
void inicia_v(int tam_hash);
int hashcode(int x, int tam_hash);
//void inserir(char *alfanum, int tam_hash);

//main ------------------------------------------
int main()
{
//int tam_hash = 5;

inicia_v(5);

return 0;
}



//funções ------------------------------------------
void inicia_v(int tam_hash) {

int i;
for ( i = 0; i < tam_hash; i++)
{
hashtable[i].flag = 0;
hashtable[i].tamanho = 0;
hashtable[i].item = NULL;
}

}

int hashcode(int x, int tam_hash)
{
return (x) % (tam_hash);
}



  


2. MELHOR RESPOSTA

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 04/06/2021 - 20:25h


DcoderLA escreveu:


perceibi que fatava a alocação de memoria, ainda to aprendendo, então pensei numa abordagem mais simples. O objetivo e implementar hash fechado, mas to na dúvida em conceitos básicos.

Estou tentando agora entender porque so esta sendo inserido a ultima execução de inserir:


Observe parte do código abaixo:
for (i = 0; i < tamhash; i++)
{
thash[i] = -1;
}
}

Nas linhas acima da função inserir hash, você está resetando os valores do hash para -1 a cada vez que é inserido na thash,ou seja, a cada vez que a função inserir é executada, ela apaga o que tinha adicionado antes com -1 e insere no ínicio o valor da key.

Você tem que dividir melhor essa função. O código acima é na verdade um código de inicialização da variável thash, ou seja, sugiro que crie uma função apenas para definir os valores do vetor como sendo -1 e tire esse código acima de dentro da função inserir.
A função inserir deve fazer somente isso, inserir elementos na thash. Enão, fica melhor dividir as funções em iniciar, inserir e display_table como você fez em parte.

Lembre-se também de executar o free(tablehash) antes do return 0 do main, pois assim você estará liberando a memória previamente alocada.


____________________________________________
https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
Uma musiquinha pra relaxar:
https://www.youtube.com/watch?v=5Q02JgxAHu8


3. Re: Falha de segmentação ao executar arquivo.c

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 04/06/2021 - 16:02h

A variável hastable é um ponteiro que não aponta para nenhum conteúdo de memória, e fora que, nem foi alocado memoria pra ela.
Ver na linha com "struct hashtable *hashtable;"
Eu suponho que essa variável você queria que fosse um vetor, mas não foi definido um tamanho para ela, além do caso acima da falta de alocação de memória.

___________________________________________

https://nerdki.blogspot.com/ acessa aí vai lá, é grátis!
Capeta (demo) do meu trabalho:
https://github.com/cpusam
Uma musiquinha pra relaxar:
https://www.youtube.com/watch?v=5Q02JgxAHu8



4. Re: Falha de segmentação ao executar arquivo.c [RESOLVIDO]

Lucas
DcoderLA

(usa Debian)

Enviado em 04/06/2021 - 17:48h


perceibi que fatava a alocação de memoria, ainda to aprendendo, então pensei numa abordagem mais simples. O objetivo e implementar hash fechado, mas to na dúvida em conceitos básicos.

Estou tentando agora entender porque so esta sendo inserido a ultima execução de inserir:



#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int hashcode(int x, int tamhash)
{
return (x % tamhash);
}

int inserir(int *thash, int key, int tamhash)
{
int i, index, hashpos;
//int flag = 0;

hashpos = hashcode(key, tamhash);

for (i = 0; i < tamhash; i++)
{

thash[i] = -1;
}

for (i = 0; i < tamhash; i++)
{
index = (hashpos + i*i) % tamhash;

if(thash[index] == -1)
{
thash[index] = key;
break;
}
}
if(i == tamhash)
{
printf("\nElemento não pode ser inserido.\n");
return 1;
}

return 0;
}

void display_table(int *thash, int tamhash)
{
int i;
printf("\nHash Fechado - Tentativa Quadratica\n");

for(i = 0; i < tamhash; i++)
{
printf("\nv[%d] .... %d", i, thash[i]);
}
printf("\n");
}

int main()
{
int tam_hash = 5;
int *tablehash;

tablehash = (int *)malloc(sizeof(int) * tam_hash);

inserir(tablehash, 2, 5);
inserir(tablehash, 12, 5);
inserir(tablehash, 10, 5);
inserir(tablehash, 50, 5);

display_table(tablehash, 5);

return 0;
}







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts