Ol� pessoal da lista,

O problema � o seguinte: eu n�o sei o que est� acontecendo com o malloc na linha assinalada abaixo.
Quando eu tento executar d� Segmentation Fault.
Mas quando eu executo fora do procedimento insere_btree, ele passa.

O que ser�??

int insere_btree(pagina *Pag, int item)
{
register int i;
pagina NovaRaiz;

/*Pesquisa na btree se item jah existe
/*pesquisa_btree(&*Pag, item)*/
if((**Pag).n == (ordem - 1)){
NovaRaiz = (pagina *)malloc(sizeof(*NovaRaiz)); <--------------------Aqui est� dando problema
if(!NovaRaiz){
printw("Erro na alocacao!");
return -1;
}
(*NovaRaiz).ehfolha = 0;
(*NovaRaiz).n = 0;
(*NovaRaiz).ponteiros[0] = *Pag;
btree_divide_pagina(&NovaRaiz, &Pag, item);
}/*fim if*/
else
insere_btree_nao_cheia(Pag, item);
return 0;
}/*fim insere_btree*/

O programa pode ser visto abaixo:

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

#define ordem 5

typedef struct TipoPagina *pagina;
struct TipoPagina
{
int ehfolha;
int n;
pagina ponteiros[ordem];
int chaves[ordem-1];
};


/******************************INICIALIZA-BTREE************************************\
int inicializa_btree(pagina *raiz)
{
register int i;

*raiz = (pagina *)malloc(sizeof(*raiz));

if(!*raiz){
printw("Falha na alocacao! Nao ha memoria suficiente!");
return -1;
}
else{
(**raiz).ehfolha = 1;
(**raiz).n = 0;
for(i = 0; i < ordem; i++)
(**raiz).ponteiros[i] = NULL;
}

return 0;
}

/****************************************INSERE************************************\
int insere_btree(pagina *Pag, int item)
{
register int i;
pagina NovaRaiz;

/*Pesquisa na btree se item jah existe
/*pesquisa_btree(&*Pag, item)*/
if((**Pag).n == (ordem - 1)){
NovaRaiz = (pagina *)malloc(sizeof(*NovaRaiz));
if(!NovaRaiz){
printw("Erro na alocacao!");
return -1;
}
(*NovaRaiz).ehfolha = 0;
(*NovaRaiz).n = 0;
(*NovaRaiz).ponteiros[0] = *Pag;
btree_divide_pagina(&NovaRaiz, &Pag, item);
}/*fim if*/
else
insere_btree_nao_cheia(Pag, item);
return 0;
}/*fim insere_btree*/

/*****************************INSERE_BTREE_NAO_CHEIA********************************\
int insere_btree_nao_cheia(pagina *PagAtual, int item)
{
int i;

i = (**PagAtual).n - 1;
if((**PagAtual).ehfolha == 1){
while((i >= 0) && (item < (**PagAtual).chaves[i])){
(**PagAtual).chaves[i+1] = (**PagAtual).chaves[i];
i--;
}/*fim while*/
(**PagAtual).chaves[i+1] = item;
(**PagAtual).n++;
}/*fim if*/
return 0;
}/*fim insere_btree_nao_cheia*/


/*****************************INSERE_BTREE_NAO_CHEIA********************************\

int btree_divide_pagina(pagina raiz, pagina Filho, int item)
{
pagina NovoFilho;
int VetTemp[ordem];
register int i, j,
mediano;
j = 0;
for(i = 0; (i < (*Filho).n + 1); i++){
if(item > (*Filho).chaves[j]){
VetTemp[i] = (*Filho).chaves[j];
j++;
if(j > (*Filho).n - 1)
j = (*Filho).n - 1;
}/*fim if*/
else{
VetTemp[i] = item;
item = (*Filho).chaves[j] + 1;
}/*fim if*/
}/*fim for*/
mediano = 3; /*ceil(ordem / 2)*/

NovoFilho = (pagina *)malloc(sizeof(*NovoFilho));
if(!NovoFilho){
printw("Falha na alocacao!");
return -1;
}/*end if*/
(*NovoFilho).ehfolha = 1;
(*NovoFilho).n = mediano - 1;
/*transfere para a proxima pagina os itens maiores que o mediano da pagina anterior*/
for(i = mediano; i < ordem; i++)
(*NovoFilho).chaves[i-mediano] = (*Filho).chaves[i];
(*raiz).ponteiros[(*raiz).n] = NovoFilho;

return 0;
}/*fim btree_divide_pagina*/


/************************************MAIN******************************************\

int main(void)
{
pagina *RAIZ;

inicializa_btree(RAIZ);
insere_btree(RAIZ, 1);
insere_btree(RAIZ, 5);
insere_btree(RAIZ, 2);
insere_btree(RAIZ, 0);
insere_btree(RAIZ, 3);
return 0;
}

Obrigado, Aldo.


Assinantes em 17/10/2002: 2238
Mensagens recebidas desde 07/01/1999: 187173
Historico e [des]cadastramento: http://linux-br.conectiva.com.br
Assuntos administrativos e problemas com a lista: mailto:linux-br-owner@;bazar.conectiva.com.br

Responder a