Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;
}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...
>
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 :(
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.
Seu programa tem comportamento indefinido.
O vetor vet1 morre quando rehash retorna.