Jump to content

Problemas com listas


Sergiosaturn
 Share

Recommended Posts

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ã.  👍

#include <stdio.h>
#include <stdlib.h>

#include "Utilizador.h"

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

//funcao para imprimir so um elemento da lista

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

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

  Utilizador *u = (Utilizador *) dados_each;

  printf("\n---------------------------------\n"); //rever isto melhor
  printf("%s |%s |%s |%d | %s | %f\n",  u -> nome , u -> codigo ,  u -> passe , u -> idade , u -> morada , u -> 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, (GFunc) showUtilizador2 , NULL);

    return (EXIT_SUCCESS);
}

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


//funcao para criar um utilizador

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

GList* InsereUtilizador(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.  ?

#include <stdio.h>
#include <stdlib.h>

#include "Utilizador.h"

//variaveis global

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

//funcao para imprimir so um elemento da lista

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

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

  Utilizador *u = (Utilizador *) dados_each;

  printf("\n---------------------------------\n"); //rever isto melhor
  printf("%s |%s |%s |%d | %s | %f\n",  u -> nome , u -> codigo ,  u -> passe , u -> idade , u -> morada , u -> 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, (GFunc) showUtilizador2 , 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. :wallbash:

Desde já agradeço pelo tempo despendido.

Cumprimentos sergiosaturn.

Link to comment
Share on other sites

GList *aux = 0;

0 pode ser uma posição de memoria reservada.

Na função consutilizador não alocas absolutamente nada para nenhuma das strings logo vais escrever em zonas interditas de memoria.

o comportamento do programa assim q acedes a uma zona interdita de memoria é imprevisivel (+/-), a partida deve ser so isso.

Link to comment
Share on other sites

Saudações.

Desde já agradeço pela resposta e pela ajuda.

Já descobri o problema e até tens razão o problema era que faltava fazer um malloc na função consUtilizador. É o que dá quando se está desatento  ?.

Em todo o caso obrigado pela ajuda 👍

Muito obrigado e fica bem 🙂 .

Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.