Journal nom de variable C/C++

Posté par  .
Étiquettes : aucune
0
29
mar.
2004
Bonjour journal,

j'aimerais savoir si tu saurais resoudre un petit probleme qui me tracasse.

J'aimerai pouvoir lire/ecrire une variable dont le nom serait stocker dans une autre variable.
Par exemple :
int entier;
string nom_variable = "entier";

et je voudrai, en utilisant nom_variable, modifier la valeur de entier.

En PHP, cela se fait comme ça :

$entier=0;
$nom_variable = "entier";

$$nom_variable=10;

echo $entier; // affiche 10

cela me serait utile pour faire une recherche style base de donnee.

J'ai une structure avec trois string et je voudrait que, par l'intermediaire d'une fonction, une recherche soit faites dans l'une des trois string.

Merci
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 1.

    desolé, je voulais pas le mettre en premiere page.

    il faudrait que la case 'premiere page' soit dechocher par defaut.
    • [^] # Re: nom de variable C/C++

      Posté par  . Évalué à 1.

      De manière simple, c'est impossible! Tu peux à la rigueur passer d'une variable à son nom en tant que châine de caractère grâce à une macro :
      #define titi(arg) #arg
      remplacera titi(variable_num2) en "variable_num2", mais l'inverse n'est pas possible, c'est une base du C!

      Une ruse pourrait être de compiler ton source contenant ces variables comme une bibliothèque dynamique, de la charger avec dlopen() et de rechercher l'adresse des variables avec un dlsym().
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 1.

    tu peux utiliser un genre de liste qui à une chaine de caractère associe une valeur
    • [^] # Re: nom de variable C/C++

      Posté par  (site web personnel) . Évalué à 1.

      plutôt qu'une liste, une table de hashage ...

      http://www.sgi.com/tech/stl/hash_map.html(...)

      Au choix :

      string -> valeur

      ou

      string -> pointeur

      La deuxième solution permettant de modifier la valeur d'une variable existante.
      • [^] # Re: nom de variable C/C++

        Posté par  . Évalué à 1.

        Au passage la hash_map de la STL de gnu ne gère pas par défaut le type std::string à cause du functor hash qui n'existe pas pour ce type (apparemment elle a existé il fut un temps), ce qui correspond a la spec SGI. Donc soit on passe tout en char*, soit on réécrit un functor pour la fonction de hash.

        J'ai essayé une fois d'écrire le functor en appelant celui de hash<char*> mais je capte rien a la syntaxe du functor :D alors j'ai jamais reussi a compiler ca correctement. Simple curiosité mais si y'en a qui ont la réponse à ca, ça m'interesse.
        • [^] # Re: nom de variable C/C++

          Posté par  (site web personnel) . Évalué à 0.

          Tu veut dire ca: ?

          Rq: Il a ete fait pour gcc 3.1 je ne sais pas s'il est tjrs valable.

          #ifndef _HASH_FUN_EXT_HH
          #define _HASH_FUN_EXT_HH

          #include <ext/hash_map>

          namespace __gnu_cxx {
          inline size_t __stl_hash_std_string(std::string __s)
          {
          std::string::iterator i;
          unsigned long __h = 0;
          for (i=__s.begin() ; i != __s.end(); ++i)
          __h = 5*__h + *i;

          return size_t(__h);
          }
          template<> struct hash<std::string>
          {
          size_t operator()(const std::string __s) const
          { return __stl_hash_std_string(__s); }
          };

          template<> struct hash<const std::string>
          {
          size_t operator()(const std::string __s) const
          { return __stl_hash_std_string(__s); }
          };
          }

          #endif
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 2.

    Tu n'as pas trop le choix : il faut que tu implementes une especes table relationnelle avec une recherche rapide parmis toutes les chaines de caracteres qui te servent à ca, et tu fais correspondre la bonne chaine a un pointeur sur l'entier.
    Mais c'est pas très souple, compliqué à mettre en oeuvre, et peut etre dangereux (il faut limiter la durée de vie des entrées de ta table à celle des variables "pointées", il faut enregistrer toutes les variables si tu veux pouvoir pointer n'importe laquelle). Bref, je te conseille de rechercher en priorité une autre solution plus conforme à l'esprit du C++ et moins inspirée des languages de script ou dérivés.
  • # Re: nom de variable C/C++

    Posté par  (site web personnel) . Évalué à 2.

    Cherche du coté du conteiner "multimap" ou "map" de la STL.

    "La première sécurité est la liberté"

  • # Re: nom de variable C/C++

    Posté par  . Évalué à 0.

    C'est pas possilble avec eval ?

    (J'ai pas de machine sous la main pour me raffraichir la mémoire).
    • [^] # Re: nom de variable C/C++

      Posté par  (site web personnel) . Évalué à 4.

      eval en C++ ?!?

      Le C++ est un language compilé (enfin, dans l'utilisation qu'on en fait dans 99,9% des cas), donc, un bout de code C++ n'a aucun sens pour ton programme pendant l'execution.

      Le seul moyen de générer du code dynamiquement puis de l'executer, c'est de le compiler (en gros, system("g++ -shared file.cpp -o file.so"); ...) et de le charger à coups de dlopen/dlsym, mais c'est *hyper* lourd. (et ça ne marche pas pour des variables locales)
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 1.

    C'est dégueulasse et faut changer de logique.
  • # Re: nom de variable C/C++

    Posté par  (site web personnel) . Évalué à 1.

    Soit le fait que tu retrouves ta variable par le nom n'est pas important et tu utilises simplement un pointeur.
    Sinon, soit tu connais toutes les valeurs possibles de ta chaine de caracteres et tu utilises un generateur de table de hash statique comme gperf : http://www.gnu.org/software/gperf/gperf.html(...)
    Soit tu utilises un map<string, int> de la STL ou un hash_map.
    Tu trouveras la doc officielle de la STL icitte :
    http://www.sgi.com/tech/stl/table_of_contents.html(...)
    Tres tres utile, tu verras ...
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 1.

    On ne peut pas faire exactement la même chose. Si le nom "entier" est déterminé dynamiquement, il faut passer par exemple par une map de ce style :

    map<string, int> valeur ;

    valeur["entier"] = 0 ;
    string nom_variable = "entier" ;
    valeur[nom_variable] = 10 ;
    cout << valeur["entier"] ; // affiche 10

    Mais en général ce n'est pas une bonne idée de vouloir reprendre litéralement une manière de faire provenant d'un autre langage... Il faudrait trouver une bonne structure C++ en fonction de ton problème. Poste ta question sur fr.comp.lang.c++.

    Ah, et si tu pars sur une solution à base de map, bien lire la doc, il y a quelques trucs peu intuitifs.
  • # Re: nom de variable C/C++

    Posté par  . Évalué à 4.

    Tu serais pas le Pierre Tramo du C++ ?
  • # Re: nom de variable C/C++

    Posté par  (site web personnel) . Évalué à 1.

    ben ca ca revient au même chose (tel qu'expliquer) sauf que var connait pas le nom de la variable, mais seulement son adresse :

    int entier = 0;
    int *var;

    var = &entier;
    *var = 10;

    printf("entier : %i", entier);

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.