Tiago Andrade Posted June 16, 2012 at 08:43 PM Report Share #463335 Posted June 16, 2012 at 08:43 PM Olá, Estou aqui com um problema de segmentation fault, que antes não acontecia. O que eu queria era o programa gruardar nós novos no fim da lista. Já tinha escrito esta parte e funcionava. Mas agora, depois de ter reiniciado o PC, e de ter voltado para o projecto, agora esta a dar este erro.. O que poderá ser. void equipa_inserir(char* nome, char* cidade, int pontos, Equipa p) //recebe os parametros e a lista. { Equipa aux, ult; ult=p; //iguala um ponteiro ao outro para se poder movimentar. aux = (Equipa) malloc (sizeof(Equipa_lista)); aux->nome = nome; aux->cidade = cidade; aux->pontos = pontos; aux->next = NULL; if (ult != NULL) { while(ult->next != NULL) //a minha intensão é fazer com que o ponteiro avance ate ao ultimo nó. { ult = ult->next; //O erro está aqui! Onde aparece Segmentation fault. } ult->next=aux; } } Será que alguem me pode ajudar? Obrigado Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 16, 2012 at 08:53 PM Report Share #463337 Posted June 16, 2012 at 08:53 PM afinal os nós da lista são do tipo Equipa ou Equipa_lista ?? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 16, 2012 at 09:06 PM Author Report Share #463339 Posted June 16, 2012 at 09:06 PM Ésta é a minha lista. typedef struct eq *Equipa; typedef struct eq { char* nome; char* cidade; int pontos; Equipa next; } Equipa_lista; São do tipo Equipa. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 16, 2012 at 09:19 PM Report Share #463341 Posted June 16, 2012 at 09:19 PM então responde a esta pergunta que valor tem p quando a lista se encontra vazia ?? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 16, 2012 at 09:35 PM Author Report Share #463342 Posted June 16, 2012 at 09:35 PM Eu inicializei primeiro a null e depois fiz o malloc ao p. Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 16, 2012 at 09:38 PM Report Share #463343 Posted June 16, 2012 at 09:38 PM então o que tem a variável p quando chega à função "equipa_inserir" pela primeira vez ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 16, 2012 at 09:48 PM Author Report Share #463345 Posted June 16, 2012 at 09:48 PM Quando entra na função p tem os valores que o malloc atribuiu. Link to comment Share on other sites More sharing options...
KTachyon Posted June 16, 2012 at 10:39 PM Report Share #463350 Posted June 16, 2012 at 10:39 PM Podes mostrar como é que é feita a chamada à função, com os restantes dados associados? “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 16, 2012 at 11:27 PM Author Report Share #463356 Posted June 16, 2012 at 11:27 PM Este é um bocado do main onde depois faço a chamada a função Equipa iniciar_eq(void){ Equipa p = (Equipa) malloc (sizeof(Equipa_lista)); FILE *fp = fopen("listaequipas.txt", "r"); char line[MAX]; while (fgets(line, MAX, fp) != NULL) { char* nome = (char*) malloc (MAX * sizeof(char)); char* cidade = (char*) malloc (MAX * sizeof(char)); int pontos; sscanf(line,"%[^-]-%[^-]-%d", nome, cidade, &pontos); equipa_inserir(nome, cidade, pontos, p); } fclose(fp); return p; } Link to comment Share on other sites More sharing options...
KTachyon Posted June 17, 2012 at 12:57 AM Report Share #463365 Posted June 17, 2012 at 12:57 AM Eu diria para fazeres um clean and build. Tirando o facto de o primeiro nó da lista não conter informação, o resto parece estar bem. “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.” -- Tony Hoare Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 17, 2012 at 01:14 AM Author Report Share #463370 Posted June 17, 2012 at 01:14 AM Eu estou a usar o Code:Blocks. Onde posso encontrar essa opção? Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted June 17, 2012 at 08:10 AM Report Share #463380 Posted June 17, 2012 at 08:10 AM Quando entra na função p tem os valores que o malloc atribuiu. acabaste de me dar informação suficiente para saber onde está o problema ... o problema que é também tens informação necessária para saber onde está o problema o malloc não atribui nada ao bloco de memória alocada. isto implica que o valor do parâmetro "next" da estrutura alocada "p" tem lixo, isto implica normalmente que é um valor sem significado diferente de 0. quando na função "equipa_inserir" executas o seguinte código: if (ult != NULL) { // ult é um ponteiro que terá o valor de "p" while(ult->next != NULL) { // o valor de utl->next é lixo, um valor número sem significado ult = ult->next; // o valor ult terá o valor do lixo } // o ciclo por ventura acabará quando o lixo terá o valor de 0 ult->next=aux; // o segmentation fault acontece aqui !!! estás a fazer uma atribuição numa posição de memória que (normalmente) é reservada } para resolver o teu problema basta que faças um memset ou em vez de malloc, chames um calloc. nota : passo não obrigatório mas de boa programação = inicialização das variáveis IRC : sim, é algo que ainda existe >> #p@p Portugol Plus Link to comment Share on other sites More sharing options...
Tiago Andrade Posted June 17, 2012 at 04:42 PM Author Report Share #463476 Posted June 17, 2012 at 04:42 PM Muito Obrigado. Com o calloc funcionou. Mas despois de perceber qual era o meu problema, vi que podia fazer o malloc e logo a seguir antes de entrar na função fazer p->next=NULL; Assim o programa funciona na mesma e assim o ficheiro pode aumentar e não tenho que alterar o ficheiro. Obrigado mais uma vez. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now