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 spongurex . Évalué à 1.
il faudrait que la case 'premiere page' soit dechocher par defaut.
[^] # Re: nom de variable C/C++
Posté par calandoa . Évalué à 1.
#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 Nap . Évalué à 1.
[^] # Re: nom de variable C/C++
Posté par Matthieu Moy (site web personnel) . Évalué à 1.
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 inz . Évalué à 1.
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 -=[ silmaril ]=- (site web personnel) . Évalué à 0.
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 xilun . Évalué à 2.
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 Pat Le Nain . Évalué à 2.
# Re: nom de variable C/C++
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
"La première sécurité est la liberté"
# Re: nom de variable C/C++
Posté par locnet . Évalué à 0.
(J'ai pas de machine sous la main pour me raffraichir la mémoire).
[^] # Re: nom de variable C/C++
Posté par Matthieu Moy (site web personnel) . Évalué à 4.
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 Ramso . Évalué à 1.
# Re: nom de variable C/C++
Posté par Obi MO (site web personnel) . Évalué à 1.
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 #3588 . Évalué à 1.
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 Moby-Dik . Évalué à 4.
# Re: nom de variable C/C++
Posté par jaroug (site web personnel) . Évalué à 1.
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.