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 :

Pointeur générique et liste chaînée


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Par défaut Pointeur générique et liste chaînée
    Salut,
    Dans le but d'appronfondir ma pratique sur la généricité et la manipulation de liste chaînée, je souhaiterai effectuer l'opération suivante. On dit que le pointeur générique peut pointer vers n'importe quel type d'objet.
    Imaginons que je déclare:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct liste{
     int nb_elt;
     struct noeud* noeud;
    };
     
    struct noeud {
     void* element;
     void* next;
    };
    Dans ce cas, element est le pointeur générique qui pointe vers l'objet que je désire utiliser dans mon application. Dans mon application, j'utilise des fonctions qui effectuent des opérations sur les listes telles que enlever un élément, avoir la taille, savoir si on est en fin de liste, etc... .
    Si je veux que element pointe vers un élément de type structure comme celle ci par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct idy_t {
     char* s1;
     char* s2;
     int i1;
    };
    Pour tester ce que cela donnerait, j'ai fait un petit test avec le programme suivant:
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct Vcard{
    	char* nom;
    	char* prenom;
    	char* tel;
    }VCard_t;
     
    int init_vcard(VCard_t** vcard)
    {
    	(*vcard) = malloc(sizeof*(*vcard));
    	if (NULL == (*vcard)) return -1;
    	(*vcard)->nom = malloc(sizeof*((*vcard)->nom));
    	(*vcard)->prenom = malloc(sizeof*((*vcard)->prenom));
    	(*vcard)->tel = malloc(sizeof*((*vcard)->tel));
    	return 0;
    }
     
    int set_vcard(VCard_t* vcard, const char* n, const char* p, const char* t)
    {
    	if (vcard)
    	{
    		if (NULL != n) strcpy(vcard->nom,n);
    		if (NULL != p) strcpy(vcard->prenom,p);
    		if (NULL != t) strcpy(vcard->tel,t);
    		return 0;
    	}
    	return -1;
    }
     
    int main ( void )
    {
    	void * ptr = NULL;
    	int i;
    	VCard_t* client;
    	i = init_vcard(&client);
    	if (i != 0)
    	{
    		fprintf(stderr,"[ERROR] Initialisation VCard!!");
    		exit(-1);
    	}
    	i = set_vcard(client, "R", "J", "03020066634");
    	if (i != 0)
    	{
    		fprintf(stderr,"[ERROR] Initialisation VCard!!");
    		exit(-1);
    	}
    	ptr = &client;	
    	printf("-------------------------------------\n");
    	printf("---------Pointeur generique----------\n"); 
    	printf("Adresse	pointeur gen:%p\n",ptr);
    	printf("Adresse ptr structure:%p\n",client);
    	printf("-------------------------------------\n");
    	return EXIT_SUCCESS;
    }
    Ce que je n'arrive pas à comprendre, c'est pourquoi l'adresse du pointeur générique en sortie du programme n'est pas la même que celle de la structure. Il devrait normalement pointer vers l'adresse de client. Je crois qu'il y a un point que je n'ai pas saisi. Si ça ne marche pas sur ce petit programme, je pense que pour ce que je voudrais faire avec les listes échouera aussi. Et puis, comme le pointeur générique ne sait pas vers quel type d'objet il pointe, je pourrai jamais utiliser les notations . ou -> pour les structures.
    Cordialement,
    Johnny

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    fait une routine qui prends en paramètre un void * et passe-lui client....

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    dans ptr tu mets l'adresse de client.. Donc client ne peut jamais être égal à ptr...

  4. #4
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Tel que vous l'avez écrit, ptr contient l'adresse du pointeur client, ce qui est différent de l'adresse de la structure qui est, elle, contenue dans client. Il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ptr=client;
    ou
    ptr=&*client;

    Ensuite, vous avez des problèmes d'allocation au niveau des champs de la structure.

  5. #5
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par souviron34
    dans ptr tu mets l'adresse de client.. Donc client ne peut jamais être égal à ptr...
    Si, avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client=(VCard_t *) ptr;

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par stephl
    Ensuite, vous avez des problèmes d'allocation au niveau des champs de la structure.
    Oui..

    Pour allouer une chaîne il faut allouer 1 de plus que la lngueur de la chaîne (pour stocker le caractère de fin de chaîne).

    Citation Envoyé par stephl
    Si, avec:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client=(VCard_t *) ptr;
    Oui mais c'est le contraire qu'il veut...

    et il met ptr = &client, et client est Vcard *.
    donc ptr devient vcard **

  7. #7
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Oui mais c'est le contraire qu'il veut...
    J'avais compris; c'était une boutade!

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Par défaut
    Salut,
    merci pour vos réponses. Je pense avoir compris l'interêt des pointeurs génériques. En fait, lorsque j'écris ptr = &client je récupère l'adresse du pointeur sur la structure de type VCard d'ou la différence d'adresses en sortie de mon programme. Puis, si j'écris ptr = &*client là je récupère effectivement bien l'adresse de ce que je voulais. En fait, ma question à l'origine était sur l'utilisation des pointeurs génériques dans les listes chaînées. L'element , type abstrait, permet en fait de récupérer l'adresse d'un objet de type quelconque préalablement initialisé en mémoire. Et en fait si on veut manipuler cet élément, il faut créer des fonctions spécifiques à l'application donnée telles que afficher le contenu ou comparer les éléments. Est-ce que ma façon de voir les choses est la bonne?
    Cordialement,
    Johnny

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par jro-daemon
    . Est-ce que ma façon de voir les choses est la bonne?
    oui pour ton exposé du problème et ta solution

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Par défaut
    Ok, merci à toi. Je pense avoir bien compris comment ça marche grâce à vous.

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/10/2009, 11h45
  2. Listes chaînées génériques
    Par sperca dans le forum Débuter
    Réponses: 5
    Dernier message: 03/12/2008, 23h13
  3. Liste chaînée sans pointeur
    Par lyes312 dans le forum Langage
    Réponses: 19
    Dernier message: 21/06/2008, 18h39
  4. Réponses: 6
    Dernier message: 14/02/2008, 13h16
  5. Pointeurs et listes chaînées
    Par womannosky dans le forum C++
    Réponses: 8
    Dernier message: 11/11/2007, 04h41

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