Hugão Postado Abril 11, 2011 Denunciar Share Postado Abril 11, 2011 Olá galera.Fiz a fila abaixo, mas ela não insere, não retira e não imprime. Compila normalmente.Na execução ocorre uma mensagem de falha de segmentação:Segmentation faultO fonte da fila:#include <stdio.h> #include <stdlib.h> #include <iostream> #define TAMANHO 10 class minhaFila{ private: int inicioFila, fimFila, f[TAMANHO]; public: void inicializaFila(){ for(int i=0; i<TAMANHO; i++){ f[i]=0; } inicioFila=fimFila=-1; } void insere(int elemento){ if(fimFila!=TAMANHO){ fimFila++; f[fimFila]=elemento; } } void retira(){ if(inicioFila!=fimFila){ int elementoRetirado; inicioFila++; elementoRetirado=f[inicioFila]; f[inicioFila]=0; //return elementoRetirado; //printf("O elemento retirado foi %d: ",&elementoRetirado); } else {printf("A fila está vazia!");} } void imprimeFila(){ for(int i=TAMANHO; i<=f[fimFila]; i--){ printf("%d\n",f[i]); } } }; int main(){ minhaFila f1; int insereElemento,op; //f1.inicioFila(); printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n"); scanf("%d",&op); switch(op){ case 1: f1.inicializaFila(); break; case 2: printf("Digite um número inteiro: "); scanf("%u",&insereElemento); f1.insere(insereElemento); //return main(); break; case 3: f1.retira(); //return main(); break; case 4: f1.imprimeFila(); //return 0; break; } system("PAUSE"); return 0; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 11, 2011 Denunciar Share Postado Abril 11, 2011 (editado) Saudações,Em rápida consulta ao seu código, o seu método "imprimeFila()" está errado, uma vez que tenta percorrer sua fila (vetor) de trás para frente. Observe que quando adiciona um item na fila, você incrementa o valor da variável que controla o fim da fila.Tente algo mais simples como:for (int i = 0; i < TAMANHO; i++) { printf("Fila[%d] = %d\n",i,f[i]); }Abraços,William Rodrigues. Editado Abril 11, 2011 por William Rodrigues Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 11, 2011 Autor Denunciar Share Postado Abril 11, 2011 Ok, o imprime está ok!Agora ainda não consigo inserir, nem retirar, em ambos dá erro segmentação (apontando para um local de memória vazio).O método inicioFila funciona em parte, porque ele zera apenas as posições 0,1,5,6 e a última posição sempre vale 4. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 11, 2011 Denunciar Share Postado Abril 11, 2011 (editado) Saudações,Para controlar o bloco de execução da sua aplicação, utilize um loop ao invés de "return main()".Veja:while (op != 5) { printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n"); scanf("%d",&op); switch(op){ case 1: f1.inicializaFila(); break; case 2: printf("Digite um número inteiro: "); scanf("%u",&insereElemento); f1.insere(insereElemento); break; case 3: f1.retira(); break; case 4: f1.imprimeFila(); break; } }Abraços,William Rodrigues. Editado Abril 11, 2011 por William Rodrigues Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 11, 2011 Autor Denunciar Share Postado Abril 11, 2011 (editado) Não mudou nada.Na hora que mostro a fila há um loop infinito.Quando insiro o programa sai após eu digitar o elemento. O mesmo ocorre quando retiro.Você está ajudando muito!Muito obrigado pela sua atenção. Editado Abril 11, 2011 por Hugão Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 11, 2011 Denunciar Share Postado Abril 11, 2011 Hugão,Tento não mudar muito o código para ficar o mais próximo possível do seu cenário. Segue como está o seu fonte:#include <stdio.h> #include <stdlib.h> #include <iostream> #define TAMANHO 10 class minhaFila{ private: int inicioFila, fimFila, f[TAMANHO]; public: void inicializaFila(){ for(int i=0; i<TAMANHO; i++){ f[i]=0; } inicioFila=fimFila=-1; } void insere(int elemento){ if(fimFila!=TAMANHO){ fimFila++; f[fimFila]=elemento; } } void retira(){ if(inicioFila!=fimFila){ int elementoRetirado; inicioFila++; elementoRetirado=f[inicioFila]; f[inicioFila]=0; //return elementoRetirado; //printf("O elemento retirado foi %d: ",&elementoRetirado); } else {printf("A fila está vazia!");} } void imprimeFila(){ for(int i = 0; i< TAMANHO; i++){ printf("%d\n",f[i]); } } }; int main(){ minhaFila f1; int insereElemento,op; while (op != 5) { printf("\n1- Inicializar fila \n2- Para inserir \n3- Para retirar \n4- Mostrar fila \n5- Sair\n\n"); scanf("%d",&op); switch(op){ case 1: f1.inicializaFila(); break; case 2: printf("Digite um número inteiro: "); scanf("%u",&insereElemento); f1.insere(insereElemento); break; case 3: f1.retira(); break; case 4: f1.imprimeFila(); break; } } system("PAUSE"); return 0; }Estamos ai prá isso ;) Abraços,William Rodrigues. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 11, 2011 Autor Denunciar Share Postado Abril 11, 2011 Eu estava errando porque estava lendo a variável op fora do while. Corriji e deu certo.Cara muito obrigado! Sou iniciante e autoditaca e está sendo ótimo poder ter a ajuda de pessoas como você. Muito obrigado.Abraço;Att,Hugo Sousa. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 11, 2011 Denunciar Share Postado Abril 11, 2011 Hugão,Que bom que deu certo. Precisando e eu puder ajudar, estamos ai.Bons estudos!Abraços,William Rodrigues. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 17, 2011 Autor Denunciar Share Postado Abril 17, 2011 Estou com um pequeno probleminha referente a essa fila.Na parte da impressão não estou conseguindo fazer ma condição para quando a fila estiver vazia apresentar a mensagem: FIla vazia!Jà tentei assim: void imprimeFila(){ if(f[fimFila]==0&&f[fimFila]==0){ printf("\n\nA fima está vazia!!\n"); } else{ printf("\n-----------------------------------------\n"); printf("| Posicao | Elementos | Endereco |\n"); printf("-----------------------------------------\n"); for(int i=0; i<TAMANHO; i++){ printf(" [%u] %u\n",i,f[i]); } } }Mas não acontece nada e quando tento assim: if(f[fimFila]==-1&&f[fimFila]==1) dá certo só quando zero a fila, pois o f[inicioFila] e f[fimFila] recebem o valor inicial de inicioFila e fimFila que é -1 atribuído no método inicializaFila.Alguma dica? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 18, 2011 Denunciar Share Postado Abril 18, 2011 Saudações,Partindo do princípio que sempre seria utilizado o método "inicializaFila()", poderia apenas validar as variáveis "inicioFila" e "fimFila" (se possuem o valor -1).Abraços,William Rodrigues. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 18, 2011 Autor Denunciar Share Postado Abril 18, 2011 A fila deve funcionar assim:1 - Quando iniciada deve ser zerada automaticamente, mas no meu caso ela apresenta lixo em todas posições.2 - Quando a fila for impressa, se estiver vazia, deve apresentar a mensagem de fila vazia, não está acontecendo comigo também.3 - Quando excluídos todos os elementos na próxima exclusão, se estiver vazia, deve informar que está vazia, também não está funcionando.4 - Na inpressão deve ser mostrada o endereço de memória em hexadecimal, também não consigo fazer mesmo com o %x.5 - Não consegui fazer o programa como solocitado pelo professor (é um trabalho de faculdade).O que você me indica? Vamos começar o raciocínio do zero para absorver 100% o conhecimento de fila? Preciso entender isso. Você me ajuda?Acho melhor começar do zero.Suas explicações são claras para mim. Acho que pode ajudar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 18, 2011 Denunciar Share Postado Abril 18, 2011 Saudações,Caro Hugão, essa decisão (começar do zero ou não) cabe a você. Se achar que começar do zero facilitará seu entendimento, o faça.Como está trabalhando com Classe, seu método "inicializaFila" poderia ser o construtor da classe, assim não se preocuparia em invocá-lo.O processo de verificar se a fila está vazia para exibição da mensagem, basta seguir mais ou menos o que disse no meu poste anterior.Se as explicações estão te ajudando, vai postando as suas dúvidas e como está fazendo que vamos te ajudando.Abraços,William Rodrigues. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Hugão Postado Abril 19, 2011 Autor Denunciar Share Postado Abril 19, 2011 Amigo, tive uma idéia aqui e estou tentando modificar o código. Assim que terminar postarei aqui ainda hoje.Quanto ao construtor, ainda não estudei isso. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 William Rodrigues Postado Abril 19, 2011 Denunciar Share Postado Abril 19, 2011 Caro Hugão,Ok, aguardaremos então.PS.: E não pode usar mesmo que ainda não tenha estudado?Abraços,William Rodrigues. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Hugão
Olá galera.
Fiz a fila abaixo, mas ela não insere, não retira e não imprime. Compila normalmente.
Na execução ocorre uma mensagem de falha de segmentação:
Segmentation fault
O fonte da fila:
Link para o comentário
Compartilhar em outros sites
13 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.