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ã.
[code]
#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);
}[/code]
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.
[code]
#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);
}[/code]
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.