SOS , coincé dans mon programme
minosys
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
minosys Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
minosys Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
je suis entrain de faire un programme qui fait l'évaluation d'une expression arithmétique a l'aide des piles , donc j'ai dédié 2 piles pour cela, la première pour "Operator" , la 2 ème pour "Number", et une fonction qui empile (
le problème c'est que je veux empiler même un opérateur de type char , sans devoir écrire une nouvelle fonction
j'ai essayé de créer une structure :
mais cela n'as pas marché :( .
je suis entrain de faire un programme qui fait l'évaluation d'une expression arithmétique a l'aide des piles , donc j'ai dédié 2 piles pour cela, la première pour "Operator" , la 2 ème pour "Number", et une fonction qui empile (
bool push (pile*,int)) .
le problème c'est que je veux empiler même un opérateur de type char , sans devoir écrire une nouvelle fonction
push ( pile*,char), y'a il un moyen pour le faire ?
j'ai essayé de créer une structure :
typedef struct{ char a; int a; }Element;
mais cela n'as pas marché :( .
A voir également:
- SOS , coincé dans mon programme
- Programme demarrage windows - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Message programmé iphone - Guide
- Mettre en veille un programme - Guide
- Programme word gratuit - Guide
4 réponses
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...
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?
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