Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus Weber

Trocando um vetor por outro [REHASH]

Recommended Posts

Boa noite, eu estou fazendo uma função que dobra o valor de um vetor estático, por exemplo,

 

Chave * rehash(Chave vet[]){
	extern int posicoes;
	int maximo;
	maximo = posicoes;
	posicoes = posicoes*2;
	Chave vet1[posicoes];
	Chave *n;
	Chave a;
	
		
	inicializaVetor(vet1, posicoes);
	int i;
	for(i=0;i<maximo;i++){
		n = &vet[i];
		
		a.numero = n->numero;
		a.string = n->string;
		a.prox = NULL;
		
		
		if(a.numero!=0) insere(a, vet1);
		
		if(COLISAO==2){
			while(n->prox!=NULL){
				n = n->prox;
				a.numero = n->numero;
				a.string = n->string;
				a.prox = NULL;
				if(a.numero!=0) insere(a, vet1);
				
			}
			
		}
		
	}
	
	imprimeVetor(posicoes,vet1);
	return &vet1;
	
}

e na funcao insere:

 

int insere(Chave c, Chave* vet){
	extern int numeroElementos, posicoes;
	numeroElementos = numeroElementos+1;
	float fatorCarga = (float) numeroElementos/posicoes;
	printf("%f, Insere %d na chave %d\n", fatorCarga, c.numero, escolheHash(10,c)); 
	
	
	if(fatorCarga>CARGAMAXIMA){
		vet = rehash(vet);
		printf("REHASH\n");
	}
	if(vet[escolheHash(posicoes,c)].numero==0){
		vet[escolheHash(posicoes, c)] = c;
	}else{
		//printf("HASH: %d %d\n", escolheHash(10,c), c.numero);
	
		tratarColisao(c, escolheHash(posicoes,c), vet, posicoes);
	}
	
	
	
	
	
	
	return numeroElementos;
	
}

 

Eu nunca fiz algo assim, e ele não tá funcionando, fica dando Rehash toda hora, tipo, quando ele dar a primeira rehash não pára mais de dar rehash's...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu programa tem comportamento indefinido.

 

O vetor vet1 morre quando rehash retorna.

Não entendi, eu queria que o vetor vet1 retornasse para o vet[].

 

colocando um vet = rehash()

 

porém o vet é estático.

 

eu nunca fiz isso, nao sei nem por onde começar :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema é este:

Ao declarar uma variável dentro de um bloco (entre chaves, {...}), ela só existirá dentro deste (isto vale para funções), ou seja, você pode referência-la, pois um ponteiro é um endereço, o endereço continua válido, afinal é uma posição na memória, mas seu conteúdo pode ter sido alterado, pode estar protegido ou continuar como estava. Veja o exemplo:

int* var ()
{
    int iVar[32]; // Variável declarada

    *iVar = 0;
    return iVar;
} // iVar não mais existe, apenas seu endereço persiste.

//...
    printf("iVar = %d\n", *var()); // Comportamento indefinido, uma vez que var() aponta um endereço que pode conter qualquer tipo de dados, o espaço antes reservado para iVar, agora já é livre. Pode ou não funcionar ou gerar falha de segmentação.
//...

é equivalente a:

int* var ()
{
    int* iVar = malloc(sizeof(int) * 32); // Variável declarada

    *iVar = 0;
    free(iVar);
    return iVar;
} // iVar não mais existe, apenas seu endereço persiste.

//...
    printf("iVar = %d\n", *var()); // Comportamento indefinido, uma vez que var() aponta um endereço que pode conter qualquer tipo de dados, o espaço antes reservado para iVar, agora já é livre. Pode ou não funcionar ou gerar falha de segmentação.
//...


Obs.: Geralmente utilizar um endereço qualquer, sem altera-lo, não causa falha de segmentação, o que é muito mais danoso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.