viciado 1 Denunciar post Postado Março 18, 2010 Estou tentando fazer lista duplamente encadeada em c, só que não entendi muito bem a teoria. O código está assim: typedef struct lista { int dado; struct lista *ant; struct lista *prox; } LISTA; void inserir_posterior(LISTA *L, int n) { LISTA *aux; aux = (LISTA *) malloc(sizeof(LISTA)); aux->dado = n; aux->prox = L->prox; aux->ant = *L; L->prox = *aux; } Eu sei que não está correto, quais os meus erros na parte teoria de listas e na parte da linguagem ? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Uma lista duplamente encadeada possui elementos com ponteiros p/ o elemento anterior e p/ o próximo. Só isso. Se L = { int a = 3; ant = 0x038385; prox = 0x07fa82}, o teu aux = { n = -10; prox = 0x07fa82; ant = (conteudo do endereco de L) } e L->prox = (conteudo de aux). O certo é, se L é o ultimo elemento da lista: aux->prox = NULL; aux->ant = L; L->prox = aux; Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Uma lista duplamente encadeada possui elementos com ponteiros p/ o elemento anterior e p/ o próximo. Só isso. Se L = { int a = 3; ant = 0x038385; prox = 0x07fa82}, o teu aux = { n = -10; prox = 0x07fa82; ant = (conteudo do endereco de L) } e L->prox = (conteudo de aux). O certo é, se L é o ultimo elemento da lista: aux->prox = NULL; aux->ant = L; L->prox = aux; Tentei assim: #include <stdio.h> typedef struct lista { int dado; struct lista *ant; struct lista *prox; } LISTA; void cria_lista(LISTA *L) { L = NULL; } void inserir_posterior(LISTA *L, int n) { LISTA *aux; aux = (LISTA *) malloc(sizeof(LISTA)); aux->dado = n; aux->prox = NULL; aux->ant = L; L->prox = aux; } void imprime(LISTA *L) { while(L->prox != NULL) { printf("%d \n",L->dado); L = L->prox; } } int main() { LISTA l; cria_lista(&l); inserir_posterior(&l,10); inserir_posterior(&l,20); inserir_posterior(&l,30); imprime(&l); return 0; } O programa não deu erro, porém exibiu a seguinte mensagem: 4200336 Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Execute o depurador e veja o que acontece passo a passo. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Execute o depurador e veja o que acontece passo a passo. Como eu executo depurador, estou utilizando gcc para windows Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 gcc é um compilador. Você precisa do gdb. Se estiver no netbeans ou no eclipse, eles tem um modo de depuração. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 gcc é um compilador. Você precisa do gdb. Se estiver no netbeans ou no eclipse, eles tem um modo de depuração. Eu não sei o que é depuração. Mais o código está correto ? Pq está estranho o q o programa está imprimindo Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Eu não sei o que é depuração. Mais o código está correto ? Pq está estranho o q o programa está imprimindo Uma boa hora p/ aprender de vez. http://lmgtfy.com/?q=depura%C3%A7%C3%A3o+programa%C3%A7%C3%A3o Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Eu não sei o que é depuração. Mais o código está correto ? Pq está estranho o q o programa está imprimindo Uma boa hora p/ aprender de vez. http://lmgtfy.com/?q=depura%C3%A7%C3%A3o+programa%C3%A7%C3%A3o Ok. Mais eu iniciei o topico para aprender lista duplamente encadeada e não depuração Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Não é desculpa. Depuração é usado independente do assunto que você está estudando. A primeira pessoa que deve possuir condições de verificar os erros do código é o autor do mesmo. Você continua se batendo com ponteiros e sequer pára p/ aprender a usar um depurador porque é mais rápido e fácil postar o código e esperar que algum trouxa do fórum entregue a resposta completa, como acontece com vários que postam no fórum. E não importa o quanto falem p/ ler mensagens de compilador, colem links ou criem tópicos ensinando como usar uma ferramenta de desenvolvimento, como o Victor já fez com o GCC. Se você quer virar programador, já deveria ter mudado o comportamento faz tempo e demonstrado algum interesse e iniciativa em ir atrás das coisas. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Não é desculpa. Depuração é usado independente do assunto que você está estudando. A primeira pessoa que deve possuir condições de verificar os erros do código é o autor do mesmo. Você continua se batendo com ponteiros e sequer pára p/ aprender a usar um depurador porque é mais rápido e fácil postar o código e esperar que algum trouxa do fórum entregue a resposta completa, como acontece com vários que postam no fórum. E não importa o quanto falem p/ ler mensagens de compilador, colem links ou criem tópicos ensinando como usar uma ferramenta de desenvolvimento, como o Vitor já fez com o GCC. Se você quer virar programador, já deveria ter mudado o comportamento faz tempo e demonstrado algum interesse e iniciativa em ir atrás das coisas. O que essa mensagem tem a ver como lista duplamente encadeada ? Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Tudo. Tem a ver com lista duplamente encadeada, com hashtable, com raw sockets, com exploit return-to-libc, buffer overflow, heap corruption, IPC, threads, escalonamento de processos... Compartilhar este post Link para o post Compartilhar em outros sites
VictorCacciari 42 Denunciar post Postado Março 19, 2010 Pessoal... sem mais flames, por favor. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Tudo. Tem a ver com lista duplamente encadeada, com hashtable, com raw sockets, com exploit return-to-libc, buffer overflow, heap corruption, IPC, threads, escalonamento de processos... Na boa, não quer ajudar não responde Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Eu tentei assim: #include <stdio.h> struct no { int info; struct no *ant, *prox; }; typedef struct no *LISTA; LISTA criar(LISTA L) { L = NULL; return L; } LISTA aloque(LISTA L) { L = (LISTA) malloc(sizeof(struct no)); return L; } void ins_posterior(LISTA L, int num) { LISTA aux, temp; aloque(aux); aloque(temp); if(L==NULL) { aux->info = num; aux = L->prox; aux->ant = L; } else { temp = L->prox; L->prox = aux; aux->ant = L; aux->prox = temp; temp->ant = aux; } } void display(LISTA L) { LISTA aux; aux = L; printf("\n LINKED LIST \n"); while(aux!=NULL) { printf("%d \n",aux->info); aux = aux->prox; } } int main() { LISTA l; criar(l); ins_posterior(l,10); ins_posterior(l,20); ins_posterior(l,30); display(l); return 0; } Ao executar o programa aparece a mensagem do windows: A instrução no "0x00401321" fez referência à memória no "0x77bf2850". A memória não pôde ser "written" No gdb aparece a seguinte mensagem: Program received signal SIGSEGV, Segmentation fault. 0x0040134f in ins_posterior <L=0x241378, num=10> at lista.c:38 38 aux->ant = L; Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Na boa, não quer ajudar não responde Não tá a fim de aprender a programar, não tente. Agora que magicamente você sabe o que é o gdb e um depurador, a mensagem é bem explicativa: não se pode acessar o endereço de memória p/ escrita. Foi na linha 38 ver o que está acontecendo? Criou breakpoint p/ ver o estado das variáveis? O gdb tem o comando help. Reveja a função de inserção inteira. E atente para o fato comum de que argumentos de função são desempilhados qdo a função termina de executar e retornar algo para o nada não faz nada. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Na boa, não quer ajudar não responde Não tá a fim de aprender a programar, não tente. Agora que magicamente você sabe o que é o gdb e um depurador, a mensagem é bem explicativa: não se pode acessar o endereço de memória p/ escrita. Foi na linha 38 ver o que está acontecendo? Criou breakpoint p/ ver o estado das variáveis? O gdb tem o comando help. Reveja a função de inserção inteira. E atente para o fato comum de que argumentos de função são desempilhados qdo a função termina de executar e retornar algo para o nada não faz nada. Sim não pode acessar o endereço para escrita, só não sei pq nao pode. Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 Sim não pode acessar o endereço para escrita, só não sei pq nao pode. Então use o depurador e descubra. É p/ isso que serve. Compartilhar este post Link para o post Compartilhar em outros sites
viciado 1 Denunciar post Postado Março 19, 2010 Sim não pode acessar o endereço para escrita, só não sei pq nao pode. Então use o depurador e descubra. É p/ isso que serve. Tentei esse outro programa que eu já tinha no pc, também aparece essa mensagem de erro do windows #include <stdio.h> struct no { int info; struct no *prox; }; typedef struct no *lista; void inic(lista *l) { *l = NULL; } void ins_fim(lista *l, int num) { if(*l==NULL) { *l = (lista)malloc(sizeof(struct no)); if(*l==NULL) exit(1); (*l)->info = num; (*l)->prox = NULL; } else ins_fim(&(*l)->prox, num); } void ins_inicio(lista *l, int num) { lista aux; aux = (lista)malloc(sizeof(struct no)); if(aux==NULL) exit(2); aux->info = num; aux->prox = *l; *l = aux; } void exibir(lista l) { if(l=NULL) { puts("Lista vazia"); exit(3); } else { printf("%d \n",l->info); exibir(l->prox); } } int main() { lista L; inic(&L); ins_fim(&L,10); ins_inicio(&L,20); ins_inicio(&L,30); ins_fim(&L,40); exibir(L); return 0; } Compartilhar este post Link para o post Compartilhar em outros sites
_Isis_ 202 Denunciar post Postado Março 19, 2010 P/ você usar o depurador, tem que compilar o fonte com -g. você define breakpoint usando b <NUM_LINHA>, lista o fonte com l [<NUM_LINHA>], executa usando r, prossegue 1 passo com s, avança até o próximo breakpoint com c e exibe as variáveis com display ou print. Compartilhar este post Link para o post Compartilhar em outros sites