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:
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... .
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; };
Si je veux que element pointe vers un élément de type structure comme celle ci par exemple:
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 struct idy_t { char* s1; char* s2; int i1; };
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.
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; }
Cordialement,
Johnny
Partager