IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

typedef et liste


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de mathieumadrid
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Par défaut typedef et liste
    Bonjour,

    Je définis le type ELEMENT comme ceci dans un fichier *.h
    J'ai une liste qui contient des éléments de type pointeurs sur ELEMENT (cad des char*). Bien entendu, je dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c\n",*consulter(liste,0));
    pour lire la valeur d'un élément (la fonction consulter lit l'adresse du premier élément de la liste.
    Dans mon fichier de test, je dois redéfinir le type ELEMENT pour pouvoir mettre des int à la place des caractères. Dans le fichier de test (*.c), je fais
    Mais comme vous pouvez le deviner, il y a une concurrence car ELEMENT est déjà défini dans le fichier *.h. Le fichier source qui gère ma liste doit accueillir n'importe quel type d'élément.
    Comment faire pour redéfinir un type ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Par défaut
    Salut.

    Si j'ai bien compris ton problème est que tu aimerais faire des listes génériques, c'est à dire des listes qui peuvent contenir telle ou telle type de donnée (char *, int, structure X, etc ...) sans pour autant changer la structure "élément" de ta liste.

    Pour cela utilise un champ data (par exemple) de type void *. Tu pourras ainsi faire pointer ton data vers n'importe quelle type de donnée au prix de quelques cast.

  3. #3
    Membre averti Avatar de mathieumadrid
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Par défaut
    Comment faire concrètement ???

    Moi dans mon fichier *.h, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /* Type ELEMENT */
    typedef char ELEMENT;
     
    /* Type LISTE */
    typedef struct
    {
    	int capacite;
    	int nbelements;
    	ELEMENT** tableau;
    }* LISTE;
    Dans mon fichier de test, j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    typedef int ELEMENT;
     
    void vue(LISTE);
     
    int main(int argc, char** argv)
    {
    	LISTE liste;
    	ELEMENT i1 = 1;
    	ELEMENT i2 = 2;
    	ELEMENT i3 = 3;
    	ELEMENT* e1 = &i1;
    	ELEMENT* e2 = &i2;
    	ELEMENT* e3 = &i3;
    	liste = creer(5);
    	insererFin(liste,e1);
    	insererFin(liste,e2);
    	insererFin(liste,e3);
    	/*executer(liste,x2);*/
     
    	vue(liste);
     
    	detruire(&liste);
     
    	return 0;
    }
    (Remarque: mon code de test ne compile pas)

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Par défaut
    Concrètement un petit header de ce genre ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    typedef struct		s_list_elem
    {
      void			*data;
      struct s_list_elem	*prev;
      struct s_list_elem	*next;
    }			t_list_elem;
     
    typedef struct		s_list
    {
      int			size;
      t_list_elem		*first;
      t_list_elem		*last;
    }			t_list;
     
    void		list_init(t_list *liste);
    int		list_push(t_list *list, void *data);
    int		list_pop(t_list *list);
    int		list_size(t_list *list);
    Donc tu as une structure t_list qui représente la "tête" de la liste, et une structure t_list_elem qui représente un élément de la liste. Et bien sure quelques fonctions utiles pour travailler sur les listes chainées.

    Ensuite dans ton code tu n'as qu'à faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    t_list *my_list;
    int a = 4;
    int b = 5;
    my_list = malloc(sizeof(*my_list));
    list_init(my_list); /* Pour mettre les champs de la tête à 0*/
    list_push(my_list, &a);
    list_push(my_list, &b);
    Bon j'ai fais ça à bout de nez j'ai pas testé mais l'esprit est là (oublie pas de tester le retour de malloc). Tu peux donc avec le void * "pusher" les données que tu veux.

  5. #5
    Membre averti Avatar de mathieumadrid
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 39
    Par défaut
    oui mais dans mon fichier *.h, je gère des ELEMENT donc il faut que je définisse le type ELEMENT quelque part. Selon toi, je devrai faire
    Je dois aussi redéfinir le type ELEMENT dans le fichier de test !
    Je mets le header,le code source et le fichier de test pour que vous compreniez mieux mon problème.

    Remarques:
    - le header se trouve dans un dossier C/Include/
    - la source se trouve dans un dossier C/Source/
    - le fichier de test se trouve dans un dossier C/Test/
    Fichiers attachés Fichiers attachés

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 57
    Par défaut
    Premièrement je ne comprend pas pourquoi tu DOIS utiliser ELEMENT. C'est l'intitulé de ton exercice ? Avec mon exemple donné plus haut tu peux tout a fais "pusher" des ELEMENTS il n'y a pas de problème.

    Deuxièmement je n'ai que survolé ton code et je n'ai rien vu qui pourrai t'empécher un void * comme type de donnée dans tes éléments.

    Au passage vérifie tes valeurs de retour plus souvent comme celle des malloc par exemple

Discussions similaires

  1. Typedef sur liste de types ?
    Par Iradrille dans le forum Langage
    Réponses: 7
    Dernier message: 06/11/2013, 11h36
  2. typedef struct dans une liste d'initialisations
    Par titibete dans le forum C++
    Réponses: 3
    Dernier message: 17/11/2010, 20h39
  3. typedef et list
    Par cirtes dans le forum SL & STL
    Réponses: 4
    Dernier message: 10/09/2007, 09h39
  4. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25
  5. Sortir un typedef d'une classe
    Par Theophil dans le forum C++Builder
    Réponses: 13
    Dernier message: 03/07/2002, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo