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

 


Dernière réponse
Sujet : [C++] Comment faire un switch avec une variable string?
youdontcare

HelloWorld a écrit a écrit :

je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :

Code :
  1. if(!strcmp(buffer, "test1" ))
  2. {
  3. }
  4. else if(!strcmp(buffer, "test2" ))
  5. {
  6. }
  7. else if(!strcmp(buffer, "test3" ))
  8. {
  9. }


 
par contre j'avoue ne pas tres bien comprendre ton code :D
peux-tu un peu detailler stp, ca m'interresse  



ce code marche très bien et n'est ni truffé de bugs, ni incompréhensible. le problème avec ce code est que lorsque tu ajoutes une nouvelle fonctionnalité, tu n'as pas qu'à rajouter du code, tu dois modifier ta boucle principale. cf cette pattern : http://users.vnet.net/wwake/xp/xp0012.shtml


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
youdontcare

HelloWorld a écrit a écrit :

je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :

Code :
  1. if(!strcmp(buffer, "test1" ))
  2. {
  3. }
  4. else if(!strcmp(buffer, "test2" ))
  5. {
  6. }
  7. else if(!strcmp(buffer, "test3" ))
  8. {
  9. }


 
par contre j'avoue ne pas tres bien comprendre ton code :D
peux-tu un peu detailler stp, ca m'interresse  



ce code marche très bien et n'est ni truffé de bugs, ni incompréhensible. le problème avec ce code est que lorsque tu ajoutes une nouvelle fonctionnalité, tu n'as pas qu'à rajouter du code, tu dois modifier ta boucle principale. cf cette pattern : http://users.vnet.net/wwake/xp/xp0012.shtml

C_Po_Ma_Faute

wpk a écrit a écrit :

c_est_ta_faute>
c'est bien pour ca ke j'ai mis
ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :  :sol:  
 
Le post initial est trop maigre pour pouvoir presumer de l'utilisation future...
 
Je ferrais jamais ça qu'avec 2 string (et encore), je crois avoir ecrit ce genre de code (entre autres) pour un serv pop3 ou à priori, il n'y avait que kk chaines (commandes) à comparer, mais qui correspondaient à des etats differents d'un automate. Et je trouve le code plus bô comme ça qu'avec un imense if imbriqué qui traine sur 20 pages de code et qui est truffé de bugs.  




 
ok, ton code est bien plus élégant en effet lorsque la quantité de valeurs à tester devient importante  :jap:

HelloWorld je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :

Code :
  1. if(!strcmp(buffer, "test1" ))
  2. {
  3. }
  4. else if(!strcmp(buffer, "test2" ))
  5. {
  6. }
  7. else if(!strcmp(buffer, "test3" ))
  8. {
  9. }


 
par contre j'avoue ne pas tres bien comprendre ton code :D
peux-tu un peu detailler stp, ca m'interresse

flo850 strcmp est pas mal  non plus ( surtout que celle la ne fait que la comparaison , et c'est ce qui t'interesse ja crois )
morceaux choisi du man  
#include <string.h>
 
 int strcmp(
          const char *s1,
          const char *s2);
Carbon_14 Strstr(), c'est pas mal pour les comparaisons
char *strstr(const char *s1, const char *s2);                /* C only */
const char *strstr(const char *s1, const char *s2);          // C++ only
wpk c_est_ta_faute>
c'est bien pour ca ke j'ai mis
ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :  :sol:  
 
Le post initial est trop maigre pour pouvoir presumer de l'utilisation future...
 
Je ferrais jamais ça qu'avec 2 string (et encore), je crois avoir ecrit ce genre de code (entre autres) pour un serv pop3 ou à priori, il n'y avait que kk chaines (commandes) à comparer, mais qui correspondaient à des etats differents d'un automate. Et je trouve le code plus bô comme ça qu'avec un imense if imbriqué qui traine sur 20 pages de code et qui est truffé de bugs.
C_Po_Ma_Faute

wpk a écrit a écrit :

ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :
 
//interface
class A
{
  virtual void processCommand(...)=0;
};
 
class B : public A
{
   virtual void processCommand(...)
   {
   }
};
 
class C : public A
{
   virtual void processCommand(...)
   {
   }
};
 
map<string, A *>  commands;
 
 
void main(void)
{
  //phase d'initialisation
  commands["test"]= new B(...);
  commands["test2"] = new C(...);
 
  //utilisation:
  string buffer;
  ...
  map<string, A*>::iterator it = commands.find(buffer);
  if(it!= commands.end())
  {
    (*it).second->processCommand(...);
  }
  else
  {
    cout<<"Unknown command"<<endl;
  }
}
 
bon, vla en 30 sec ce ke je ferrais pour pas me prendre la tete et avoir du code un peu propre: fini les cases et les if imbriqués (j'ai pas du tout testé mais ca devrais marcher qd meme).  




 
je trouve quand même tout ça un peu tiré par les cheveux pour tester le contenu d'une chaîne parmi quelques possibilités !!!

wpk ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :
 
//interface
class A
{
  virtual void processCommand(...)=0;
};
 
class B : public A
{
   virtual void processCommand(...)
   {
   }
};
 
class C : public A
{
   virtual void processCommand(...)
   {
   }
};
 
map<string, A *>  commands;
 
 
void main(void)
{
  //phase d'initialisation
  commands["test"]= new B(...);
  commands["test2"] = new C(...);
 
  //utilisation:
  string buffer;
  ...
  map<string, A*>::iterator it = commands.find(buffer);
  if(it!= commands.end())
  {
    (*it).second->processCommand(...);
  }
  else
  {
    cout<<"Unknown command"<<endl;
  }
}
 
bon, vla en 30 sec ce ke je ferrais pour pas me prendre la tete et avoir du code un peu propre: fini les cases et les if imbriqués (j'ai pas du tout testé mais ca devrais marcher qd meme).
LeGreg je tiens evidemment a preciser
que ce genre d'optimisation est tres mauvaise :)
et donc a oublier absolument..
 
LEGREG
LeGreg dans ton cas, tu fais juste un test
sur ton 5e charactere :)
(enfin si tu es sur qu'il n'y a que deux cas
sinon il manque manifestement un case default :D )
 

Code :
  1. switch(buffer[4]) {
  2.   case '\0':
  3.   ..
  4.   break;
  5.   case '2' :
  6.   ..
  7.   break;
  8. };


 
LEGREG

chrisbk bref t parti pour les if/else
petoulachi Exact, le switch ne permet pas de tester des chaines de caracteres. C pareil en Java.
TheJackal ben un char c un entier en faite
mais c juste un char et pas une chaine
godbout Si je me trompe pas ca marche pour un char aussi, mais peut etre que c'est ce que tu voulais dire (ou un type qui a une conversion possible vers un entier)
verdoux Le switch marche avec un entier uniquement (ou un type qui a une conversion possible vers un entier)
Alload J'ai essayé de faire comme ça:
 
string buffer;
 
....
 
switch (buffer)
{
case "test":
...
break;
 
case "test2":
...
break;
}
 
 
Mais ça marche pas, quelqu'un a une idée?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)