Rempalcer des if/else avec des String en Switch/case avec des entiers? - C - Programmation
Marsh Posté le 23-12-2003 à 10:48:52
précise ton usage, j'ai une solution sur un cas un peu similaire.
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
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
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
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 ?
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
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. |
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+,
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
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+,
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 ?