CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]question de choix (if ou case)

marionnettiste
marionnettiste
Niveau 1
20 octobre 2007 à 07:43:32

Bonjour,

Je commence à toucher la programmation, et une question me trotte a l´esprit.
J´aimerais pouvoir faire un système de switch avec comme paramètre de switch un string. Je me doute que ce n´est pas super possible en langage C standard, mais est ce que si je fait une succession de if /else/if/else etc est aussi performant ?
Ou bien existe t´il un moyen de créer un genre d´index qui permettrait de faire correspondre une valeur de type string a une valeur de type int, afin de générer un paramètre viable pour le switch dont je reve.

godrik
godrik
Niveau 30
20 octobre 2007 à 11:14:21

ah, une question interessante.
En effet, en C, un switch est souvent plus rapide qu´une succession de if/else.
La question est "pourquoi est ce que c´est plus rapide ?" .
Basiquement, lorsque l´on ecrit
switch (a)
{case 1: ... case 2: ... case 3: ... case 4: ... ...}
le compilateur pour créer une table des "lignes" ou apparait case 1, case 2, case 3.
Ainsi, il peut faire son choix en faisant: goto ligne[a];

Que l´on soit d´accord, on est vraiment entrain de grapiller des pouiemes. Une fois que tu aura mis ta fonction qui parse tes chaines de caracteres, ce pouiemme deviendra encore plus insignifiant.

D´ou ma question finale: as tu vraiment besoin de performance a ce point ?

Pseudo supprimé
Pseudo supprimé 20 octobre 2007 à 13:16:38

Après, si c´est un grand switch de chaînes de caractères, tu peux passer par une table de hash. Mais si ta table est petite, tu vas perdre plus que tu ne gagnes lors du hashing. Par contre, quand tu as beaucoup de valeurs, tu commences à gagner grâce à un accès en temps constant (Mouais, modulo la taille du mot hashé, ah, les subtilités de la complexité). Sinon, tu peux peut être également utiliser un arbre avec en feuilles des pointeurs de fonction : à l´issue de ton parsing du mot, tu aboutis directement à sa fonction de traitement, par exemple.

marionnettiste
marionnettiste
Niveau 1
20 octobre 2007 à 13:34:49

Oui je le crains, il s´agit d´une application pour un serveur de jeu de rôle en ligne (Neverwinter Nights2 - le langage est très proche du C mais je n´ai pas de goto dans les mots clé de ce langage).

Vu que le script sera appelé très souvent par les joueurs (en gros a chaque fois que le joueur fera reposer son personnage pour regagner point de vie, sortilège ou don) Il ne faudrait pas que la routine ne soit une source de latence.
en gros ça serait un aiguillage de 50 voies (voire peut être plus par la suite et en fonction du de l´avancement de ce monde persistant). Donc je me pose des contraintes relative au système embarqué, multitache/temps partagés voir avec une pointe de temps réel.

Enfin je pense que je vais peut être revoir le concept en rajoutant manuellement des variables de type int a mes 50 +1 (default) états dirigeant mon switch.

Merci de me confirmer ce que je pensais.

godrik
godrik
Niveau 30
20 octobre 2007 à 13:47:45

si tu n´as que 50 mot a reconnaitre, il y a fort a parier qu´il suffit de regarder uniquement les 4 premiers caracteres de ta chaine. Ca peut te simplifier la vie.

Fvirtman
Fvirtman
Niveau 10
20 octobre 2007 à 14:10:44

Marionnettiste > si tes string sont constantes (tout au long du programme), ne peux tu pas les remplacer par un enum ?
Sachant qu´un enum, c´est un int, donc tu résoud le probleme du siwtch.

Sinon, si ton but est un acces rapide de chaines, et peux, par exemple, fait un std::map<std::string,pointeur_de_fonction>. L´acces a une map est en O(ln2(n)), ce qui, pour 50 éléments, te fait un temps moyens de 7 ~ 8 acces.

Pseudo supprimé
Pseudo supprimé 20 octobre 2007 à 14:13:01

Ou, en continuant sur cette idée, de trouver un hash portant sur un minimum de caractères.

Tu parles d´états : les chaînes sont vraiment nécessaires ? Ne pourrais-tu pas te contenter de constantes entières ?

marionnettiste
marionnettiste
Niveau 1
20 octobre 2007 à 17:08:47

En gros j´ai trouvé ma solution.
J´ai trouvé un moyen de créer une constante entière sur les éléments à tester, donc je la récupère et je règle mon problème de switch par la même occasion.

Hélas je n´ai pas le type enum a ma disposition. Le fait du hash me semble un peu compliqué, dans la mesure ou je conçois un canevas de script et qu´il sera mis en ligne pour le masse public de concepteur de monde de ce même jeu.

Encore merci pour votre participation aussi rapide qu´efficace.

Sous forums
  • Aide à l'achat Mac
  • Création de Jeux
  • Linux
  • Création de sites web
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment