Accueil > Forum > > > > liste chainée et pointeur générique ?
liste chainée et pointeur générique ?
samedi 22 juillet 2006 à 13:35:43 |
liste chainée et pointeur générique ?

tintin72
|
Bonjour,
J'essaie de coder une liste chainée dont la valeur à stockée est matérialisé par un pointeur sur void de façon rendre mon code générique:
typedef void* PVOID; //définit un pointeur générique
typedef struct{
PVOID data; //pointeur générique struct ELEMENT *next;//pointe sur l'élément suivant struct ELEMENT *prev;//pointe sur l'élément précédent } ELEMENT;
typedef ELEMENT* PELEMENT; //définit un pointeur sur une structure ELEMENT
typedef struct{
PELEMENT head; //pointe sur le 1er élément PELEMENT tail; //pointe sur le dernier élément PELEMENT curr; //pointe sur l'élément courant UINT nbElem; //nombre d'éléments dans la liste } LIST;
//Fonctions relatives à la gestion de la liste add, remove etc...... // code.............
Supposons que je veuille créer une liste chainée qui manipulerait des int. Imaginons que la fonction addElem(PVOID data) ajoute un nouvel élément à la liste et y stocke la valeur 'data' (donc un int dans mon cas). Comment faire pour passer ma valeur à placer dans la liste ?
Y a bien ça:
int a = 25; addElem(&25);
mais ça n'a aucun interêt puisqu'il faut créer une variable int pour chaque élément de la liste.
Ce que j'aimerais faire c'est une utilisation simple du genre: addElem(25); mais bien sûr ça ne peut pas marcher.
Aussi, j'aimerais savoir quel est la méthode pour utiliser des liste chainée génériques. (j'ai regardé comment était conçues les listes dans GTK+ mais j'ai pas tout compris)
Merci d'avance
Tintin 72
|
|
samedi 22 juillet 2006 à 14:25:54 |
Re : liste chainée et pointeur générique ?

luhtor
|
Bas en C++, on pourrait faire une fonction template
template <class U>
void addElement(const U & object)
Mais en C, je pense pas que tu es une solution relativement propre. Tu peux toujours créer une fonction pour chaque type.
addElement(int);
addElement(float);
...
|
|
samedi 22 juillet 2006 à 14:47:11 |
Re : liste chainée et pointeur générique ?

tintin72
|
Oui j'y avais pensé, mais ça fait vraiment beaucoup de code. Je sais qu'il y a une solution (complexe!) avec des macros, mais j'ai pas encore tout compris.
Ce que je pige pas avec l'histoire du pointeur générique c'est que, ok, il pointe sur n'importe quel type (char, int etc....) mais comment il stocke cette valeur ? Il fais une allocation dynamique ? (comment il fait pour le sizeof() selon si c'est un int un char ou une structure qui est passé en paramètre ?)
Tintin 72
|
|
samedi 22 juillet 2006 à 14:52:59 |
Re : liste chainée et pointeur générique ?

JCDjcd
|
Ton type generique est tres bien. Cependant il ne faut pas faire &25 mais &a. Comme tu as choisi (et tu as raison) d'implementer les listes generiquement, il faut faire une allocation memoire pour ton int : int *data; data = malloc(sizeof(int)); *data = 25; addElement(data);
puis pour la liberation : free(delElement(list));
L'inconvenient ici c'est que tu alloue un int pour rien, comme un int (32 bits) tient en memoire dans un pointeur (32 bits aussi) il tu suffit de faire :
addElement((void*)25); en fait tu enregistres le pointeur qui pointe a l'adresse 25 de la memoire.
Pourquoi faire simple quand on peut faire compliqué ?
|
|
samedi 22 juillet 2006 à 15:20:43 |
Re : liste chainée et pointeur générique ?

tintin72
|
Merci beaucoup pour ta réponse 
Je ne savais pas qu'on pouvait passer une valeur littérale à un pointeur générique. Par contre comment ferais tu pour récupérer cette valeur ?
Tintin 72
|
|
samedi 22 juillet 2006 à 19:09:38 |
Re : liste chainée et pointeur générique ?

JCDjcd
|
En fait tu utilise la memoire que tu a alloué pour le champs data de la structure ELEMENT, donc tu te donnes la convention que le pointeur qui pointe a l'adresse 25 est en fait le nombre 25, je dis bien que c'est une convention, i.e. que pour apres recupere la valeur il faut suivre cette convention, donc si tu a l'element <elem>, tu peux avoir la valeur du "PVOID data" correspondant a l'element <elem> par <elem->data>, ensuite si tu veux le nombre, il te suffit donc de faire <nombre=(int)(elem->data)>
Pourquoi faire simple quand on peut faire compliqué ?
|
|
dimanche 23 juillet 2006 à 00:57:32 |
Re : liste chainée et pointeur générique ?

steve_clamage
|
C'est franchement pas une bonne solution.
Si la structure possède un attribut de type void* c'est au code de la
liste de se charger de l'allocation lors de l'insertion d'une cellule
et de la désallocation lors de la suppression de cellule. Il faut dans
ce cas ajouter un attribut qui stocke la taille d'un élément.
Sinon il y a aussi la solution avec une macro pour faire générer le
code parametrable selon le type, mais c'est pas super au niveau de la
maintenance.
|
|
dimanche 23 juillet 2006 à 12:46:16 |
Re : liste chainée et pointeur générique ?

JCDjcd
|
alors ca c'est absolument pas vrai du tout, car la plupart du temps <data> pointe sur une structure (par exemple TOTO), donc l'allocation de TOTO est faite a l'exterieur, et on peut utiliser 10 fois la liste, sans a avoir a chaque fois besoin de reallouer TOTO. D'ailleurs c'est pas deleteElem, mais plutot removeElem, on enleve seulement l'element, et surtout on ne le supprime pas a coup de free(data). (en revanche il faut faire free(elem)). Le gestionnaire des listes n'a pas a s'occuper de ce qu'est en realite <data>, en plus <data> peut pointer sur un tableau de la pile, ou quelque chose d'autre , et alors il ne faudra surtout pas faire free(data)
Pourquoi faire simple quand on peut faire compliqué ?
|
|
dimanche 23 juillet 2006 à 17:32:08 |
Re : liste chainée et pointeur générique ?

steve_clamage
|
Tu n'as pas compris, c'est infiniment plus simple à l'utilisation si le
conteneur "semble" stocker des valeurs plutot que des "references",
sinons il faut tenir compte de la durée de vie de chaque objet contenue
et ca devient trés vite ingérable.
Pour chaque insertion on alloue et on copie, indépendamment du type d'allocation de l'objet.
|
|
lundi 24 juillet 2006 à 10:12:23 |
Re : liste chainée et pointeur générique ?

DeAtHCrAsH
|
Eh ben il y en a qui aime bien se prendre la tete ....
Comme steve l'a fait remarquer, c'est au gestionnaire de liste de gérer les allocations. Je suis d'avis pour utiliser un deuxième paramètre indiquant la taille de la variable utilisé. Allouer en dohors du gestionnaire, puis passé ensuite le pointeur sur cette allocation ne peut etre que source d'erreur et de bug! Mieux vaut privilégier un code simple et sure, qu'un code qui risque d'etre ingérable par la suite.
Shell
|
|
Cette discussion est classée dans : élément, liste, pointeur, générique, chainée
Répondre à ce message
Sujets en rapport avec ce message
Liste chainée d'objets de classes différentes [ par gillig ]
Voici un problème auquel je ne trouve pas de réponse, enfin, rien d'efficace.J'ai une classe CDessin contenant une liste chaînée (CList) de pointeurs
liste chainée: type file d'attente [ par cunbreizh ]
MAIDER! MAIDER!Votre texte ICIVotre texte ICIdébutant dans la prog en C. Je cherche à programmer de la manière la plus simple et basic possible une st
Help urgent !! liste doublement chainée [ par arthur007 ]
Bonjour à touspuisuqe je suis un débutant dans la programmation C, j'ai besoin de votre aide.j'ai 2 structures: typedef struct Comp{int Code; char Nom
[C++.NET]Accès à un élément d'un formulaire [ par tidou ]
HelloJ'ai un problème :cry: J'ai un formulaire nommé disons "X" avec une liste déroulante.J'ai un autre formulaire disons "Y" avec une zone de texte
liste chainée [ par krater ]
sur un projet de video-club nous avons utilise une liste double chainées cepedant, nous avons quelque récurent à la compillation si une reponse pouvai
Lecture d'un fichier texte pour mettre dans une liste chainée [ par webgladiator ]
Merci de prendre du temps à me lire.J'ai un projet d'info dont le but est d'effectuer le plus court itinéraire dans le metro parisien (opimisation).J'
Du remord pour vector [ par guifr ]
Bonjour à tous, Dans une application je dois utiliser des tableaux dynamiques. Ma première idée était de créer des listes chainées, mais j'hésite à i
clonage de liste chainée et suppression [ par avillenave ]
Bonjour, Je développe actuellement en C, un algo de recuit simulé avec un calcul d'entropie J'ai un tableau de liste chainée Bon, dans cet al
recherche dans une liste chainée [ par sossouha ]
salut, J'ai à faire le recherche d'un caractère dans une liste chainée en langage C. voici la structure que j'utilise typedef struct arc { char va
Trier une liste chainée ? [ par tintin72 ]
Bonjour,Je voudrais connaitre le principe du trie dans une liste chainée.Je voudrais par ex trier une liste chainée qui existe déjà et qui contient de
Livres en rapport
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|