Unconfigured Ad Widget

Collapse

Anúncio

Collapse
No announcement yet.

Duvida em listas ligadas

Collapse
X
 
  • Filter
  • Tempo
  • Show
Clear All
new posts

  • Font Size
    #1

    C / C++ Duvida em listas ligadas

    Saudações programadores.

    Por motivos académicos tive de desenvolver algumas funções de listas no GLib. Neste caso eu estou a fazer um código conteúdo de inserção em uma lista duplamente ligada. E para mostrar o conteúdo da lista implementei uma função que imprime o conteúdo no ecrã. Eis aqui o codigo que desenvolvi.

    Na main invoco as funções que foram definidas no utilizador.c . Insiro dois utilizadores e imprimo o conteúdo no ecrã.


    Código PHP:
    #include <stdio.h>
    #include <stdlib.h>

    #include "Utilizador.h"

    //------------------------------------------------------------------------------

    //funcao para imprimir so um elemento da lista

    //------------------------------------------------------------------------------

    void showUtilizador2(gpointer dados_eachgpointer parametros) {     //funcao para mostrar o utilizador

      
    Utilizador *= (Utilizador *) dados_each;

      
    printf("\n---------------------------------\n"); //rever isto melhor
      
    printf("%s |%s |%s |%d | %s | %f\n",  -> nome -> codigo ,  -> passe -> idade -> morada -> saldo);

    }

    //------------------------------------------------------------------------------

    //------------------------------------------------------------------------------

    int main(void) {

        
    GList *lista NULL;

        
    //--------------------------------------------------------------------------

        
    Utilizador u3 consUtilizador("50055" "ola" 50.0 "Sergio" 21 "rua");

        
    lista InsereUtilizador(lista u3);

        
    //--------------------------------------------------------------------------

        
    Utilizador u4 consUtilizador("50056" "ola" 50.0 "Sergio" 21 "rua");

        
    lista InsereUtilizador(lista u4);

        
    printf("Conteudo\n\n");

        
    g_list_foreach(lista, (GFuncshowUtilizador2 NULL);

        return (
    EXIT_SUCCESS);

    No utilizador.c estão implementados as funções de inserção na lista.



    Código PHP:
    //funcao para criar um utilizador

    //------------------------------------------------------------------------------

    GListInsereUtilizador(GList *lista Utilizador u) {  //falta inserir condiçoes de segurança

        
    GList *aux 0;

        
    //..........................................................................

        
    lista g_list_append(lista,&u);

        return 
    lista;

        
    //..........................................................................

    //fim de funcao

    //------------------------------------------------------------------------------

    //funcao para construir uma estrutura di tipo Utilizador

    //------------------------------------------------------------------------------

    Utilizador consUtilizador(char *codigo char *passe float saldo char *nome int idade char *morada) {

        
    Utilizador aux;

            
    strcpy(aux.codigo,codigo);
            
    strcpy(aux.passe,passe);
            
    aux.saldo saldo;
            
    strcpy(aux.nome,nome);
            
    aux.idade idade;
            
    strcpy(aux.morada,morada);

            return 
    aux;                      } 
    O problema ocorre quando executo este código. Não ocorre nenhume falaha de segmentação no entanto quando em teoria deveria ser imprimido no ecrã, "Sergio 50055 ...... , Sérgio 50056" , o programa imprime "Sérgio 50055 ..... , Sérgio 50055". Ou seja o ultimo utilizador inserido substitui todos os outros.

    Eu tive a tentar procurar o erro e quando faço as seguintes alterações, no main.c , a lista imprime direitinha.


    Código PHP:
    #include <stdio.h>
    #include <stdlib.h>

    #include "Utilizador.h"

    //variaveis global

    //------------------------------------------------------------------------------

    //funcao para imprimir so um elemento da lista

    //------------------------------------------------------------------------------

    void showUtilizador2(gpointer dados_eachgpointer parametros) {     //funcao para mostrar o utilizador

      
    Utilizador *= (Utilizador *) dados_each;

      
    printf("\n---------------------------------\n"); //rever isto melhor
      
    printf("%s |%s |%s |%d | %s | %f\n",  -> nome -> codigo ,  -> passe -> idade -> morada -> saldo);

    }

    //------------------------------------------------------------------------------

    //------------------------------------------------------------------------------

    int main(void) {

        
    GList *lista NULL;

        
    //--------------------------------------------------------------------------

        
    Utilizador u3 consUtilizador("50055" "ola" 50.0 "Sergio" 21 "rua");

        
    lista g_list_append(lista,&u3);

        
    //--------------------------------------------------------------------------

        
    Utilizador u4 consUtilizador("50056" "ola" 50.0 "Sergio" 21 "rua");

        
    lista g_list_append(lista,&u4);

        
    printf("A partir daqui\n\n");

         
    g_list_foreach(lista, (GFuncshowUtilizador2 NULL);

        return (
    EXIT_SUCCESS);

    Ao fazer isto o programa retorna a lista direitinha, o que permite concluir que o problema reside na função "GList* InsereUtilizador(GList *lista , Utilizador u)" , mas já executei a mesma linha no main e funciona direitinho.

    Já estive algumas horas a volta disto, mas ainda não consegui encontrar o erro, peço ajuda a toda a gente que tenha experiência com listas que me ajude a encontrar o problema neste código.

    Desde já agradeço pelo tempo despendido.
    Cumprimentos sergiosaturn.
X
Working...
X