begin process at 2012 02 12 02:44:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

tableau de liste


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

tableau de liste

dimanche 18 mai 2008 à 16:31:30 | tableau de liste

kenikun

Bonjour,
J'ai un programme en C avec une liste chainee simple dont voici la declaration :
[code]
typedef struct Element_
{
    int map;
    char val[4];
    struct Element_ * suivant;
}Element;
[/code]

Pour les besoins de mon application, je cree ensuite un tableau de liste.
[code]
Element * tab = (Element*)malloc(sizeof(Element)*76);
[/code]
Le tableau est initialisé avec tous les map à  0, val à  "" et suivant à  NULL. Ensuite je remplis le tableau. Par exemple je peux avoir quelque chose du genre:

Case 0: val="abc\0" map=1 , suivant=NULL
.....
...
case 76: val="etc\0" map=5, suivant:val="epu\0" map=1, suivant=NULL

Mon programme fonctionne correctement et fait bien ce que je veux. Mais je rencontre un probleme lorsque je vais liberer l'espace alloué pour le tableau de liste. J'ai pensé à  faire une fonction qui permet de liberer une case et ensuite faire une boucle pour liberer toutes les autres.

int liberer(Element* p)
{
    Element *tmp;
    while(p)
    {
    tmp=p->suivant;
    free(p);
    p=tmp;
    }
    return 0;
}
Vu que je veux faire une modification, je passe en parametre un pointeur sur la case et j'appelle la fonction avec l'adresse de la case. Par exemple : liberer(&tab[0]);
Jusque là  tout va bien (enfin pour la premiere case), mais dès que je veux passer à  la case suivante, j'ai un SIGSEGV. J'ai regardé dans le debogueur et j'ai cette information : ***glibc detected *** /home/seb/appli/debug/src/appli: free(): invalid pointer: 0x0805e5e4 (c'est l'adresse de la case 1 apres avoir liberé la case 0).

Quelqu'un aurait-il une solution à  mon problème?
Merci

dimanche 18 mai 2008 à 18:23:00 | Re : tableau de liste

chaipo

Salut,

euh si c'est juste libérer la place allouer à ce moment là: "Element * tab = (Element*)malloc(sizeof(Element)*76);" avec malloc, il suffit d'utiliser free.
dimanche 18 mai 2008 à 19:52:29 | Re : tableau de liste

jfrancois

Bonjour,

1) "Pour les besoins de mon application, je cree ensuite un tableau de liste."
Non, c'est juste un tableau de structures et non une liste ou un tableau de listes. Le champ suivant n'a aucune utilité du coup, d'ailleurs il est systématiquement mis à NULL dans le switch d'initialisation. A moins d'imaginer que, par la suite, les éléments du tableau se pointent les uns les autres, comme après un tri !

2) "J'ai pensé à  faire une fonction qui permet de liberer une case et ensuite faire une boucle pour liberer toutes les autres."
Pourquoi ? Les éléments de la liste n'ont pas été alloués, il n'y a donc pas de raison de les désallouer ! Quand la liste est créée, chaque élément occupe déjà sa pleine propre place : 1 entier + 4 caractères + 1 pointeur. Celà ne serait pas le cas (et il faudrait effectivement une boucle de désallocation) si val était un pointeur sur une chaîne de caractères allouée au moment de son initialisation. Une simple libération du tableau suffit.

3) Case 0: val="abc\0" map=1 , suivant=NULL ne va pas du tout !
c'est plutôt : case 0 : strcpy(val,"abc"); map=1; suivant=NULL; break;


Jean-François

dimanche 18 mai 2008 à 20:51:00 | Re : tableau de liste

Edydy

En résumé ce que jfrancois veut te dire c'est que le tu ne peux pas désallouer une case de ton tableau parce que tu as allouer tes 76 éléments d'un coup.

En gros le principe du free c'est une désallocation par malloc :

Tu fais un malloc, tu devras faire un free;
deux malloc, deux free...

Ton code devrait donc être dans ce style la alors pour l'allocation de mémoire et faire une vrai chaine liée,
mais l'inconvénient, c'est que tu ne pourra plus acceder par indice à tes éléments.

Element * tab = NULL;
Element* tmp = NULL;
//premier élément alloué
tab = (Element*)malloc(sizeof(Element));
tmp = tab;
for(int i = 0; i < 74; i++){
   tmp->suivant = (Element*)malloc(sizeof(Element));
   if(!tmp)
      error;
   tmp = tmp->suivant;
}
//dernier élément
   tmp->suivant = (Element*)malloc(sizeof(Element));
   if(!tmp)
      error;
   tmp->suivant = NULL;




Cette discussion est classée dans : liste, tableau, case, element, map


Répondre à ce message

Sujets en rapport avec ce message

Comment recupéré un element d'une liste? [ par Sat83 ] Bonjour!J'ai une liste d'Objet:list canaux;Où Data est une classe...Comment faire pour récupéré le Nième element de cette liste?Comme avec un tableau tableau de liste [ par help26 ] salut , je crée un tableau de listes chainées de telle façon que chaque element du tableau est un pointeur sur une liste et j'arrive pas a comprendre tableau ou liste chainée [ par leFeu ] j'ai un programme a faire et je dois choisir les structures de données a utiliser.normalement un tableau dynamiqe me suffit car la taille de ma liste Problème avec liste chainée [ par MasterShadows ] Bonjour à tous ,alors voilà dans le cadre de mon tp de C je dois créer une liste simplement chainée tout ce qu'il y'a de plus générique.donc on nous d afficher une grille [ par igloobuster ] salut à tous, j'ai un tableau a deux dimmensions et j'aimerais afficher se tableau dans une fenetre.J'ai pensé à une Listview, mais le probleme est qu Fichiers binaires [ par lektrosonic ] Bonsoir,supponsons que j'ai un liste ou un tableau d'une structure quelquonque. (on ne connai pas la taille du tableau)Je voudrais ecrire la totalite tableau [ par ngabou98 ] bonjour à tous  j'ai besoin de votre coup de main j'ai un tableau donc les élément sont remplie à partir de la somme des element d'un autre tableau.en scanner un code barre [ par ankou001 ] Bonjour; j'aimerai scanner un code barre avec une douchette et le mettre directement dans une case d'un tableau sans etre obligé de sélèctionner ma ca savoir quel case d'un tableau bidimensionel est lié au clic de la souris [ par juju116 ] bonjour j'ai un petit souci de comprehension j'ai un tableau declaré ainsi: int tableau[3][3]; tout mes cases sont intialisé à zero à l'aide de deux b liste et tableau [ par dida87 ] est ce qu'on peux remlpir une liste chainnee a partir d'un tableau de chaines de caracteres.c'est urgent.merci pr votre aide.


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,544 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales