Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1542 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Gérer des priorités d'opérateur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Gérer des priorités d'opérateur

n°885282
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:23:31  profilanswer
 

J'ai 2 objets Symbole, qui peuvent contenir soit une variable, une constante ou un opérateur.
 
Je cherche à comparer la priorité de 2 Symboles lorsque ceux-ci sont des opérateurs.
 
Pour cela, je dois stocker les priorités de plusieurs opérateurs dans un structure X, pour qu'elles soient facilement accessible.
 
Qu'est-ce qui serait idéal pour faire ca?
 
ex: comparer la priorité entre s1.chaine et s2.chaine (s1.chaine vaut +, s2.chaine vaut *)
 
un hash serait une bonne solution?

mood
Publicité
Posté le 28-10-2004 à 20:23:31  profilanswer
 

n°885292
Panini
Posté le 28-10-2004 à 20:36:34  profilanswer
 

une valeur décimale... :??:

n°885296
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:45:04  profilanswer
 

Panini a écrit :

une valeur décimale... :??:


 
ouais ca je le sais
 
mais faut jme créer une structure qui va faire que
 
+ => 7
- => 7
* => 6
/ => 6
% => 6
...
 
je regarde du coté de la STL avec map, mais j'semble incapable de me déclarer un map en dehors de ma class de cette facon:
 

Code :
  1. #include <map>
  2. using namespace std;
  3. map<char, int> priorites;
  4. priorites["*"] = 6;
  5. priorites["/"] = 6;
  6. priorites["%"] = 6;
  7. priorites["+"] = 7;
  8. priorites["-"] = 7;


 
j'ai cette erreur quand je fais ca
 


[yaberger@lfs01]# g++ tp2.cpp
In file included from Expression.h:3,
                 from tp2.cpp:5:
Symbole.h:8: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:8: error: expected `,' or `;' before '=' token
Symbole.h:9: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:9: error: expected `,' or `;' before '=' token
Symbole.h:10: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:10: error: expected `,' or `;' before '=' token
Symbole.h:11: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:11: error: expected `,' or `;' before '=' token
Symbole.h:12: error: expected constructor, destructor, or type conversion before '=' token
Symbole.h:12: error: expected `,' or `;' before '=' token

n°885298
Joel F
Real men use unique_ptr
Posté le 28-10-2004 à 20:45:55  profilanswer
 

utilise des compile time tags

n°885300
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:47:08  profilanswer
 

Joel F a écrit :

utilise des compile time tags


 
comprends pas  :??:

n°885302
Joel F
Real men use unique_ptr
Posté le 28-10-2004 à 20:48:51  profilanswer
 

ta classe symbole, passe la en template.
 
template<size_t PRIORITY> class Symbol;
 
et passe en parametre template la valeur de ta priorité.
ensuite,instancie un type par priorité et fait creer des instances de ces types selon leur priorité.

n°885303
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:51:17  profilanswer
 

Joel F a écrit :

ta classe symbole, passe la en template.
 
template<size_t PRIORITY> class Symbol;
 
et passe en parametre template la valeur de ta priorité.
ensuite,instancie un type par priorité et fait creer des instances de ces types selon leur priorité.


 
faut justement qu'il existe une table dans mon code qui dit que le symbole "+" est de priorité 7 et le symbole "*" de priorité 6, c'est ca que je tente de faire en ce moment. Selon ce que je comprends de ton truc ca m'aidera pas à ca  :sweat:

n°885304
Joel F
Real men use unique_ptr
Posté le 28-10-2004 à 20:53:20  profilanswer
 

fait toi un bete Lookup table de 255 entrée
et tableau['*'] = 7.
 
tuperds en memoire mais c simple

n°885305
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:54:28  profilanswer
 

Joel F a écrit :

fait toi un bete Lookup table de 255 entrée
et tableau['*'] = 7.
 
tuperds en memoire mais c simple


 
c'est ca que j'essaye de faire avec map mais ca fonctionne pas
pas obligé d'utiliser map alors?

n°885308
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:55:58  profilanswer
 

je risque aussi d'avoir éventuellement des "++" et ce genre de truc, alors le 255 entrée pas sur que ca fonctionne ...

mood
Publicité
Posté le 28-10-2004 à 20:55:58  profilanswer
 

n°885310
Joel F
Real men use unique_ptr
Posté le 28-10-2004 à 20:56:59  profilanswer
 

hmmm le ++ oauis c cho :-/

n°885311
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 20:58:40  profilanswer
 

Joel F a écrit :

hmmm le ++ oauis c cho :-/


 
spour ca j'envisageais d'utiliser map de la STL
 
sinon le prof avait parlé d'une possibilité d'utiliser enum pour faire ce truc, possible?
 
ou tout betement autre idée?

n°885312
Joel F
Real men use unique_ptr
Posté le 28-10-2004 à 21:00:32  profilanswer
 

enum ouais mais ca va etre bien lourd

n°885314
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 21:03:22  profilanswer
 

Joel F a écrit :

enum ouais mais ca va etre bien lourd


 
ca c'est clair
 
du genre:
 
enum priorites { ADDITION = 7, MULTIPLICATION = 6 };
 
et dans le code jvais devoir vérifier si c'est de quel opérateur il s'agit etc... en gros c'est presque plus facile d'hardcoder le tout dans ma fonction :/

n°885315
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 21:04:21  profilanswer
 

ou bien dans mon objet symbole, j'ajoute un élément priorité
 
dans le constructeur, si le symbole est un opérateur, j'entre dans un switch immense qui set la priorité de l'opérateur :/

n°885317
Panini
Posté le 28-10-2004 à 21:06:40  profilanswer
 

Sensément, à priorité égale, on résout les priorités de gauche  ou de droite à gauche selon le type des opérateurs concernés. Voir la table de priorités des opérateurs dans n'importe quel bouquin de c/c++.

n°885318
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 21:08:51  profilanswer
 

Panini a écrit :

Sensément, à priorité égale, on résout les priorités de gauche  ou de droite à gauche selon le type des opérateurs concernés. Voir la table de priorités des opérateurs dans n'importe quel bouquin de c/c++.


 
... ? j'ai bien une table de priorité sous les yeux
 
je cherche le moyen de la consulter dans mon prog
 
jdois lire des expressions comme
 
3 + 4 * 2, les mettre en notation postfixé, et les évaluer
 
le tout se fait à l'aide de pile et de file, mais justement pour pas me retrouver avec  
 
3 4 + 2 *
 
mais bien
 
3 4 2 * +, je dois vérifier les priorités d'opérations

n°885325
Lam's
Profil: bas.
Posté le 28-10-2004 à 21:26:08  profilanswer
 

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )

n°885327
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 21:32:26  profilanswer
 

Lam's a écrit :

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )


 
j'ai tenté les ' au lieu des " et ca me fait la meme erreur
 
là jme suis ajouté un int priorite dans mon objet symbole et je lui assigne la bonne valeur dans mon constructeur
 
niveau structure de donnée c'est acceptable? sinon j'écoute les autres propositions

n°885331
Lam's
Profil: bas.
Posté le 28-10-2004 à 21:38:20  profilanswer
 

C'est louche ton truc. Et si tu tentes un:
 map.insert(std:: pair<char,int>('*',6));  
 
ca merde aussi ?


Message édité par Lam's le 28-10-2004 à 21:39:04
n°885345
Panini
Posté le 28-10-2004 à 22:02:18  profilanswer
 

Lam's a écrit :

Euh, t'as remarqué que tu avais une map de char vers int, mais que tu essayais de mettres des char* dedans (<"> au lieu de <'> )


Exact, y a gros bug en effet.
 
déclare plutôt :  
map<const char *, int> priorites  
voir : map<std::string, int> priorites
 
Le premier cas fonctionne bien si tu fournis les valeurs des clés via des variables globale, de telle sorte que "++" par exemple soit unique (car tu compares le pointeur et non la valeur de la chaine).
 
Le second cas est quand même plus propre.
 

n°885360
burgergold
5$? va chez l'diable!
Posté le 28-10-2004 à 22:19:09  profilanswer
 

mais là tout mon truc fonctionne bien jusqu'ici avec mon constructeur, j'hésite à le modifier, au pire je le ferai lorsque tout sera complet et fonctionnel
 
j'ai déjà 5 des 7 fichiers de test du prof qui passe #1 avec mon prog (les autres c'est parce que j'ai seulement intégré les opérateurs + - * / % pour le moment)
 
:)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Gérer des priorités d'opérateur

 

Sujets relatifs
operateur = besoin d'aide pour le comprendreGérer les composant d'une forme ...
Comment gérer les entrées de cette table ?gérer le timeout sur script newslletter avec un refresh
[C++] Problème de surcharge d'opérateurcomment gerer un evnmt sur bouton sans implemente MouseListener?
opérateur d'affectationSurcharge d'opérateur
gérer [code][/code] avec une regex[VC++6/MFC] Facilités pour gérer une configuration, genre fichier ini?
Plus de sujets relatifs à : [C++] Gérer des priorités d'opérateur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR