SOS , coincé dans mon programme
Fermé
minosys
Messages postés
8
Date d'inscription
samedi 5 janvier 2013
Statut
Membre
Dernière intervention
1 août 2014
-
5 janv. 2013 à 14:12
minosys Messages postés 8 Date d'inscription samedi 5 janvier 2013 Statut Membre Dernière intervention 1 août 2014 - 5 janv. 2013 à 15:37
minosys Messages postés 8 Date d'inscription samedi 5 janvier 2013 Statut Membre Dernière intervention 1 août 2014 - 5 janv. 2013 à 15:37
A voir également:
- SOS , coincé dans mon programme
- Programme demarrage windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Désinstaller programme windows 10 - Guide
- Forcer la fermeture d'un programme - Guide
- Programme démarrage windows 10 - Guide
4 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
5 janv. 2013 à 14:31
5 janv. 2013 à 14:31
Je n'ai pas très bien compris si l'objectif était d'avoir dans une même pile des éléments "int" et des éléments "char". Si oui tu peux utiliser une union.
Si tu as deux piles distinctes mais que tu ne veux pas écrire deux push différents, ça dépend de ta structure de pile.
Si tu empiles toujours des void * (adresses) tu peux écrire une pile générique dont chaque élément empilé pointe vers l'élément (int, char ou ce que tu veux) que tu as empilé.
Après il faut juste savoir si tu pointes sur un objet de quel type tu pointes, mais si tu as une pile de char, une pile d'int, il n'y a pas de problème, tu seras en quoi caster ce sur quoi le void * pointe...
En C, si tu voulais des piles réellement typées (ie une pile qui ne permet d'empiler que des int, une pile qui ne permet d'empiler que des char) tu seras obligé d'écrire le code pour la pile "int" et la pile "char", ce qui je te l'accorde est fastidieux (et la seule solution que je vois un peu moins moche, c'est de passer par des void *).
C'est la raison pour laquelle en C++ les templates ont été introduits et reproduisent ce mécanisme : on pratique code une pile générique pile<T> qui raisonne sur des objets générique de type T. Ensuite, si le code requiert une pile<int> et une pile<char>, alors le compilateur compilera implicitement ces deux classes...
Si tu as deux piles distinctes mais que tu ne veux pas écrire deux push différents, ça dépend de ta structure de pile.
Si tu empiles toujours des void * (adresses) tu peux écrire une pile générique dont chaque élément empilé pointe vers l'élément (int, char ou ce que tu veux) que tu as empilé.
Après il faut juste savoir si tu pointes sur un objet de quel type tu pointes, mais si tu as une pile de char, une pile d'int, il n'y a pas de problème, tu seras en quoi caster ce sur quoi le void * pointe...
En C, si tu voulais des piles réellement typées (ie une pile qui ne permet d'empiler que des int, une pile qui ne permet d'empiler que des char) tu seras obligé d'écrire le code pour la pile "int" et la pile "char", ce qui je te l'accorde est fastidieux (et la seule solution que je vois un peu moins moche, c'est de passer par des void *).
C'est la raison pour laquelle en C++ les templates ont été introduits et reproduisent ce mécanisme : on pratique code une pile générique pile<T> qui raisonne sur des objets générique de type T. Ensuite, si le code requiert une pile<int> et une pile<char>, alors le compilateur compilera implicitement ces deux classes...
minosys
Messages postés
8
Date d'inscription
samedi 5 janvier 2013
Statut
Membre
Dernière intervention
1 août 2014
5 janv. 2013 à 15:10
5 janv. 2013 à 15:10
voila la structure de ma pile :
est ce qu'il y'a un moyen de la rendre capable d'empiler des éléments char , et int ? ou bien il faut créer une deuxième pile de type char?
typedef int typeElem; typedef struct { typeElem val[TAILLE]; typeElem *sommet; }Pile;
est ce qu'il y'a un moyen de la rendre capable d'empiler des éléments char , et int ? ou bien il faut créer une deuxième pile de type char?
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
Modifié par mamiemando le 5/01/2013 à 15:19
Modifié par mamiemando le 5/01/2013 à 15:19
Je crois que tu n'as pas bien lu ce que j'ai écrit plus haut. Comme typeElem ne peut désigner qu'un seul type la réponse est non.
Soit dans ta pile tu mets des objets de différentes nature :
- tu peux t'abstraire du type en C c'est de passer par des pointeurs (void * puisqu'on ne sait pas sur quoi on pointe).
- tu peux aussi faire une union si c'est juste une famille particulière de types :
http://www.siteduzero.com/tutoriel-3-34523-les-unions.html
Soit ta pile stocke des objets tous de même nature (par exemple que des int, ou que des char).
- en C tu dois coder une pile pour le type int, et une autre pour le type char
- en C++ tu peux écrire une pile générique (template)
.. ou même éviter de la recoder en utilisant le type std::stack fournit par la STL :
http://www.cplusplus.com/reference/stack/stack/
Bonne chance
Soit dans ta pile tu mets des objets de différentes nature :
- tu peux t'abstraire du type en C c'est de passer par des pointeurs (void * puisqu'on ne sait pas sur quoi on pointe).
- tu peux aussi faire une union si c'est juste une famille particulière de types :
http://www.siteduzero.com/tutoriel-3-34523-les-unions.html
Soit ta pile stocke des objets tous de même nature (par exemple que des int, ou que des char).
- en C tu dois coder une pile pour le type int, et une autre pour le type char
- en C++ tu peux écrire une pile générique (template)
template <typename T> struct pile_t { T val[TAILLE]; T *sommet; };
.. ou même éviter de la recoder en utilisant le type std::stack fournit par la STL :
http://www.cplusplus.com/reference/stack/stack/
Bonne chance
minosys
Messages postés
8
Date d'inscription
samedi 5 janvier 2013
Statut
Membre
Dernière intervention
1 août 2014
5 janv. 2013 à 15:37
5 janv. 2013 à 15:37
merci beaucoup pour votre réponse , je vais lire le tutoriel des unions et l'essayer dans mon programme pour voir qu'est ce que cela va donner .