Rempalcer des if/else avec des String en Switch/case avec des entiers?

Rempalcer des if/else avec des String en Switch/case avec des entiers? - C - Programmation

Marsh Posté le 23-12-2003 à 09:57:29    

Bonjour,
 
 j'ai un programme qui utilise des if/else avec strcmp sur des String, et j'aimerai transformer cela en Switch/case avec des entiers.
 
Je ne sais pas comment faire, j'ai peut etre une piste avec les define. Pourriez vous m'aider s'il vous plait ?

Reply

Marsh Posté le 23-12-2003 à 09:57:29   

Reply

Marsh Posté le 23-12-2003 à 10:48:52    

précise ton usage, j'ai une solution sur un cas un peu similaire.

Reply

Marsh Posté le 23-12-2003 à 10:52:45    

Disons que je fais un strtok sur une Ligne String
J'ai une variable appelé token qui est un String
 
Cette variable peut prendre differente valeurs (une dizaine) qui peut etre par exemple "TATA", "TOTO", "TITI", "TUTUTU" ...
 
A chaque valeur est associé un pseudi traitement different.
 
Avant on faisait un
if (strcmp(token,"TATA" )==0)
{
 
}
else.....
 
 
c tres lourd je trouve, alors que la structure du Switch/Case est bien plus elegante.
 
Mais je vois pas de solution simple sans tout casser :(

Reply

Marsh Posté le 23-12-2003 à 11:07:59    

pseudo traitement différent ? il l'est vraiment ?
 
http://dejean.benoit.free.fr/tmp/g [...] bnailer3.c
moi j'ai un truc XML, et en fonction de la chaine, je tappe dans un champ. j'ai donc ranger des couples (chaine, offset) et après recherche dichotomique dedans.
 
tu peux faire la même chose (ou avec une table de hachage), tu range des couples (chaine, id_unique), tu cherches et après tu switch. ou alors (chaine, ptr_fonction), et là, pas de switch, direct l'appel

Reply

Marsh Posté le 23-12-2003 à 11:42:55    

Merci pour le code. Je ne suis pas spécialiste en C, je vais donc voir ce que je peux faire. En tout cas l'idee est bonne :)

Reply

Marsh Posté le 23-12-2003 à 12:05:39    

Au passant, je ne sais pas si c louable ou pas, mais le plus performant à la compilation/execution, c'est le SWITCH/CASE ou le IF/ELSE ?

Reply

Marsh Posté le 23-12-2003 à 12:09:54    

ça dépend du compilateur et du bordel, de la taille du switch.
sinon tu peux utiliser une fonction de hachage parfaite, bien bijective et te servir d'elle pour l'indice. la soupe de gperf doit être récupérable et modifiable

Reply

Marsh Posté le 24-12-2003 à 03:58:25    

taz a écrit :

ça dépend du compilateur et du bordel, de la taille du switch.
sinon tu peux utiliser une fonction de hachage parfaite, bien bijective et te servir d'elle pour l'indice. la soupe de gperf doit être récupérable et modifiable

Exactement, c'est la seule methode vraiment efficace des qu'on a un nb de chaines plus grand que 3 ou 4. gperf c'est pas du C++ qui est genere?? Il y a un cperf (son ancetre?) qui genere du C. Ca demande un poil de pratique dans le parametrage pour eviter les collisions.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 24-12-2003 à 07:28:53    

non non gperf crache du C et en option du C++. et son job c'est justement de générer quelque chose qui évite tant que possible les collisions

Reply

Marsh Posté le 24-12-2003 à 12:22:34    

Oui, je viens d'y jeter un oeil, ca a l'air de s'etre pas mal ameliore, gperf.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed