Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

rdolxd

ajuda num codigo

Mensagens Recomendadas

rdolxd    0
rdolxd

Boas, estou a tentar passar todas as strings que tenho numa estrutura de dados (arvore AVL) para um array de strings, e estou a tentar fazer com que a inserção das strings seja de forma ordenada, mas esta me a dar segmentation fault, podem me ver e ajudarem me a compreender onde estou a falhar sff.

int length(char **s){
 int i=0;
 while(s[i]!=NULL) i++;
 return i;
}
char** swap(char **s,int a, int b){
 char *aux=s[a];
 s[a]=s[b];
 s[b]=aux;
 return s;
}
char** shiftr(char **s,int i){
 for(;i<length(s);i++){
   s=swap(s,i,i+1);
 }
 return s;
}
char** extractclient(Catcliente c,char **s){
 int meio,min=0,max=length(s)-1;
 if (c!=NULL){
   if (s==NULL){
  s=(char**)malloc(sizeof(char*));
  s[0]=strdup(c->string);
  s[1]=NULL;
  s=extractclient(c->e,s);
  s=extractclient(c->d,s);
   }
   else{
  while((max-min!=1)){
    meio=((length(s)-1)+min)/2;
    if(strcmp(s[meio],c->string)<0){
	  min=meio;
    }
    else{
	  max=meio;
    }
  }
  s=(char**)realloc(s,(length(s))*sizeof(char*));
  s=shiftr(s,max);
  s[max]=strdup(c->string);
  s[length(s)]=NULL;
  s=extractclient(c->e,s);
  s=extractclient(c->d,s);
   }
 }
 return s;
}

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rdolxd    0
rdolxd

quantoa memória está a ser reservada aqui ?

s=(char**)malloc(sizeof(char*));

Apenas um apontador para um caracter, mas eu estou a usar a função strdup que devolve um apontador de caracter, essa função por si propria não está já a reservar espaço na memoria para a string, penso eu

Editado por rdolxd

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
HappyHippyHippo    1140
HappyHippyHippo

Apenas um apontador para um caracter

agora que todos sabemos que só estás a reserver um ponteiro ...


s[0]=strdup(c->string); // 1
s[1]=NULL; // 2 ???
[/Code]


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
rdolxd    0
rdolxd

agora que todos sabemos que só estás a reserver um ponteiro ...


s[0]=strdup(c->string); // 1
s[1]=NULL; // 2 ???
[/Code]

Estava a tentar arranjar alguma maneira de tentar saber o comprimento do array, foi um bocado forma estupida agora que penso nisso e desesperada pois estava a tentar fazer isto o mais depressa possivel. Lembrei me de experimentar agora a divisão de sizeof(s)/sizeof(char*) para saber o tamanho do array (visto que estou sempre a realocar mais 1) e retirei os NULLs. Ja não me dá segmentation fault, mas o programa tbm chega a parte que tem de chamar a função e está ali empancado, não haverá uma maneira mais eficiente de fazer isto?

Edit: burrice minha, já funciona, obrigado pela ajuda

Editado por rdolxd

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.