Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Variable contenant une autre variable mémoire

7 réponses
Avatar
SL3News
Bonjour,
Je voudrais pouvoir déclarer et utiliser des variables mémoires de façon
dynamique. En d'autres termes, j'ai un conteneur de
variable qui contient à un moment donné le nom d'une variable mémoire. Je
voudrais donc utiliser le contenu du conteneur
comme si j'utilisais directement la variable mémoire.
Exemple :
Au lieu de déclarer directement une variable numeclie comme ceci :
int numeclie = 15;

Je veux passer par un conteneur en utilisant les deux instructions suivantes
:
string conteneur = "numeclie";
int &conteneur = 15;

NB : le symbole & a été utilisé tout simplement parce-que c'est ce que je
faisais dans VFP.
Ainsi, l'instruction :
int &conteneur = 15;
permet de déclarer non pas une variable mémoire "conteneur", mais plutôt une
variable mémoire dont le nom est lû dans la
variable conteneur c'est-à-dire ici "numeclie".

Je cherche donc l'équivalent de la macro de substitution & (de VFP) en C#

Merci d'avance pour vos contributions.

7 réponses

Avatar
Gilles TOURREAU
Le Tue, 25 Sep 2007 13:45:15 +0200, SL3News a écrit:

Bonjour,
Je voudrais pouvoir déclarer et utiliser des variables mémoires de façon
dynamique. En d'autres termes, j'ai un conteneur de
variable qui contient à un moment donné le nom d'une variable mémoire. Je
voudrais donc utiliser le contenu du conteneur
comme si j'utilisais directement la variable mémoire.
Exemple :
Au lieu de déclarer directement une variable numeclie comme ceci :
int numeclie = 15;

Je veux passer par un conteneur en utilisant les deux instructions
suivantes
:
string conteneur = "numeclie";
int &conteneur = 15;

NB : le symbole & a été utilisé tout simplement parce-que c'est ce que je
faisais dans VFP.
Ainsi, l'instruction :
int &conteneur = 15;
permet de déclarer non pas une variable mémoire "conteneur", mais plutôt
une
variable mémoire dont le nom est lû dans la
variable conteneur c'est-à-dire ici "numeclie".

Je cherche donc l'équivalent de la macro de substitution & (de VFP) en C#

Merci d'avance pour vos contributions.





Il n'a pas d'équivalent pour ce genre de chose...

Vous pouvez cependant utiliser les dictionnaires comme-ceci :

Dictionary<string, objet> dico;

dico = new Dictionary<string, objet>();
dico.Add("Clé1", 1664);
dico.Add("Clé2", "Titi");

int i = (int)dico["Clé1"];
string s = (string)dico["Clé2"];


Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
SL3News
"Gilles TOURREAU" a écrit dans le message de news:

Le Tue, 25 Sep 2007 13:45:15 +0200, SL3News a écrit:

Bonjour,
Je voudrais pouvoir déclarer et utiliser des variables mémoires de façon
dynamique. En d'autres termes, j'ai un conteneur de
variable qui contient à un moment donné le nom d'une variable mémoire. Je
voudrais donc utiliser le contenu du conteneur
comme si j'utilisais directement la variable mémoire.
Exemple :
Au lieu de déclarer directement une variable numeclie comme ceci :
int numeclie = 15;

Je veux passer par un conteneur en utilisant les deux instructions
suivantes
:
string conteneur = "numeclie";
int &conteneur = 15;

NB : le symbole & a été utilisé tout simplement parce-que c'est ce que je
faisais dans VFP.
Ainsi, l'instruction :
int &conteneur = 15;
permet de déclarer non pas une variable mémoire "conteneur", mais plutôt
une
variable mémoire dont le nom est lû dans la
variable conteneur c'est-à-dire ici "numeclie".

Je cherche donc l'équivalent de la macro de substitution & (de VFP) en C#

Merci d'avance pour vos contributions.





Il n'a pas d'équivalent pour ce genre de chose...

Vous pouvez cependant utiliser les dictionnaires comme-ceci :

Dictionary<string, objet> dico;

dico = new Dictionary<string, objet>();
dico.Add("Clé1", 1664);
dico.Add("Clé2", "Titi");

int i = (int)dico["Clé1"];
string s = (string)dico["Clé2"];


Cordialement

--
Gilles TOURREAU





Merci beaucoup,
Je vais voir ce que cela donne.
Avatar
Christophe Lephay
"Gilles TOURREAU" a écrit dans le message de news:

Le Tue, 25 Sep 2007 13:45:15 +0200, SL3News a écrit:

Bonjour,
Je voudrais pouvoir déclarer et utiliser des variables mémoires de façon
dynamique. En d'autres termes, j'ai un conteneur de
variable qui contient à un moment donné le nom d'une variable mémoire. Je
voudrais donc utiliser le contenu du conteneur
comme si j'utilisais directement la variable mémoire.
Exemple :
Au lieu de déclarer directement une variable numeclie comme ceci :
int numeclie = 15;

Je veux passer par un conteneur en utilisant les deux instructions
suivantes
:
string conteneur = "numeclie";
int &conteneur = 15;

NB : le symbole & a été utilisé tout simplement parce-que c'est ce que je
faisais dans VFP.
Ainsi, l'instruction :
int &conteneur = 15;
permet de déclarer non pas une variable mémoire "conteneur", mais plutôt
une
variable mémoire dont le nom est lû dans la
variable conteneur c'est-à-dire ici "numeclie".

Je cherche donc l'équivalent de la macro de substitution & (de VFP) en C#

Merci d'avance pour vos contributions.





Il n'a pas d'équivalent pour ce genre de chose...

Vous pouvez cependant utiliser les dictionnaires comme-ceci :

Dictionary<string, objet> dico;

dico = new Dictionary<string, objet>();
dico.Add("Clé1", 1664);
dico.Add("Clé2", "Titi");

int i = (int)dico["Clé1"];
string s = (string)dico["Clé2"];



ou :

SortedDictionary< string, int > dico = new SortedDictionary< string, int
>();

Pour ne pas avoir à caster :
dico.Add( "numeclie", 10 );
int i =dico[ "numeclie" ];

Bien sur, celà suppose que tes variables soient toutes du même type, auquel
cas tu n'as vraiment d'autre choix que d'utiliser un dictionnaire d'objects
(comme dans la solution proposée par gilles). Une alternative plus eficace
consiste à gérer un dictionnaire distinct pour chaque type.

La différence entre Dictionary et SortedDictionary est que le premier repose
sur une table de hachage tandis que le second sur un arbre binaire.
L'efficacité d'une table de hachage étant fortement tributaire de
l'adequation entre les données et la fonction de hachage utilisée (pour
réduire les risques de collision dans la table ainsi qu'une répartition
adaptée à la taille du tableau sous-jacent), je préfère largement
SortedDictionary au quotidien.
Avatar
Jean BONBEUR
pour ouvrir d'autres pistes

peut etre est-ce le mot clé ref que vous souhaitez utiliser.
si vous souhaitez rendre des variables "accessibles" parcequ'elles sont en
dehors de votre portée, passez les en reference, ou mettez les dans une
static class, ou public static quelque part. si elles ne sont pas
"singleton", genre des variables au milieu d'une boucle, quel sens ça a
votre truc ?

sinon, essayez un emballage.

public class IntRef
{
public int Value ;
}

public sealed class A : object
{
public A(IntRef i)
{
this.i = i ;
}

public void Test() { i.Value = i.Value + 1 ; }

IntRef i ;
}

public sealed class B : object
{
public B(IntRef i1,IntRef i2)
{
this.i1 = i1 ;
this.i2 = i2 ;
}

public void Test()
{
i1.Value = i1.Value * i2.Value ;
i2.Value = i1.Value - i2.Value ;
}

IntRef i1 ;
}


IntRef zozo = new IntRef() ;
zozo.Value = 3 ;

new A(zozo).Test() ;
new B(zozo,zozo).Test() ;

// quelle est la valeur de zozo.Value ?

en fait : est-ce un mécanisme de nommage à l'interieur du code pour
referencer des choses, ou un mécanisme pour l'exterieur qui permette de
définir des parametres, config... et ça va servir à quoi ?
Avatar
SL3News
"Jean BONBEUR" a écrit dans le message de news:

pour ouvrir d'autres pistes

peut etre est-ce le mot clé ref que vous souhaitez utiliser.
si vous souhaitez rendre des variables "accessibles" parcequ'elles sont en
dehors de votre portée, passez les en reference, ou mettez les dans une
static class, ou public static quelque part. si elles ne sont pas
"singleton", genre des variables au milieu d'une boucle, quel sens ça a
votre truc ?

sinon, essayez un emballage.

public class IntRef
{
public int Value ;
}

public sealed class A : object
{
public A(IntRef i)
{
this.i = i ;
}

public void Test() { i.Value = i.Value + 1 ; }

IntRef i ;
}

public sealed class B : object
{
public B(IntRef i1,IntRef i2)
{
this.i1 = i1 ;
this.i2 = i2 ;
}

public void Test()
{
i1.Value = i1.Value * i2.Value ;
i2.Value = i1.Value - i2.Value ;
}

IntRef i1 ;
}


IntRef zozo = new IntRef() ;
zozo.Value = 3 ;

new A(zozo).Test() ;
new B(zozo,zozo).Test() ;

// quelle est la valeur de zozo.Value ?

en fait : est-ce un mécanisme de nommage à l'interieur du code pour
referencer des choses, ou un mécanisme pour l'exterieur qui permette de
définir des parametres, config... et ça va servir à quoi ?



Bonjour,
Je vous remercie pour vos contributions.

La macro de substitution peut être utile dans plusieurs cas :
- On peut avoir un conteneur de table par exemple qui contient la table sur
laquelle on désire effectuer une opération. L'opération se fait en utilisant
le conteneur de la table. Le BindingNavigator par exemple fait la même chose
c'est-à-dire que les commandes portent sur BindingNavigator.BindingSource.
Chaque formulaire n'a qu'à initialiser simplement sa source de données dans
le BindingNavigator.BindingSource.
- On peut avoir un fichier contenant des variables (paramètres) par exemple.
On déclare le contenu de chaque enregistrement grâce à la macro de
substitution et on peut utiliser directement chacune de ces variables tout
comme si on les avait déclaré nous-même.
- etc.
Bref, il y a plein de situations dans lesquelles on peut faire appel à la
macro de substitution.
Avatar
Jean BONBEUR
Ok, dans ce cas, essayez plutot un mécanisme de classe. c'est typé, et bien
mieux qu'une macro, qui n'a pas de regle de "locaclité" coincidant avec la
portée. donc, c'est trés chiant. le côté "global" est forcément attrayant et
séduisant, mais en fait, c'est trés casse gueule, imprecis, et source de
(presque) toutes les embrouilles.

public Configuration
{
public void LoadFrom(string filename)
{ ... }
public void SaveTo(string filename)
{ ... }

public string Parametre1 { get {...} }
public int Parametre2 { get {...} }
public bool Parametre3 { get {...} }
}

// exemple 1 : global, mais typé
public Program
{
public static void Main()
{
Configuration.LoadFrom("settings.xml") ;

Worker w0 = new Worker() ;
Worker w1 = new Worker() ;
...
w0.Job() ;
w1.Job() ;
}

public static Configuration Configuration = new Configuration() ;
}

public class Worker
{
public void Job()
{
string p1 = Program.Configuration.Parametre1 ;
...
}
}

// exemple 2 : local et typé
public Program
{
public static void Main()
{
Configuration config = new Configuration() ;
config.LoadFrom("settings.xml") ;

Worker w0 = new Worker(config) ;
Worker w1 = new Worker(config) ;
...
w0.Job() ;
w1.Job() ;
}

public static ;
}

public class Worker
{
public Worker(Configuration configuration)
{
this.configuration = configuration;
}

private Configuration configuration

public void Job()
{
string p1 = configuration.Parametre1 ;
...
}
}



en fait, arrangez vous pour faire descendre le long de vos objets le paquet
de parametres regroupé dans la configuration.
le jour ou vous avez deux instances de sgbd qui vont bosser, mais pas sur la
meme base, si c'est du global, vous etes niké, ils vont taper dans le meme
parametre. alors vous modifiez le parametre avant que l'appel se fasse, et
il faut savoir dans toutes les parties du programme ou il faut le faire : et
c'est impossible de le savoir precisement, et sans induire un paquet
d'anomalies... ce qui justifie la technique 2 : pas de globalité absolue,
mais un partage décidé par l'objet "du dessus" seulement si c'est averé.


// exemple 3 : local et typé, et specifique
public Program
{
public static void Main()
{
Configuration config0 = new Configuration() ;
config.LoadFrom("settings.xml") ;

Configuration config1 = new Configuration() ;
config.LoadFrom("special-settings.xml") ;

Worker w0 = new Worker(config0) ;
Worker w1 = new Worker(config1) ;
...
w0.Job() ;
w1.Job() ;
}

public static ;
}

dans cet exemple, vous n'avez pas touché une seule ligne du Worker pour lui
faire prendre la bonne valeur. si vous avez un besoin plus raffiné au niveau
du parametrage, il suffit d'abstraire la configuration, ou d'avoir un
Builder qui vous donne les configs répondant à vos différents cas : "tous
les parametres viennent du fichier truc, sauf celui la qui est dans la base
de registre, mais dans le cas de la config2, je prend aussi celui la dans la
base de registre, et celui la dans le .ini, et je prend le plus grand des
deux etc etc"
Avatar
P. GILLES
http://www.journaldunet.com/developpeur/tutoriel/csharp/050830-csharp-unsafe-utiliser-pointeurs.shtml
http://msdn2.microsoft.com/fr-fr/library/t2yzs44b(VS.80).aspx

Patrick
Developpeur VFP s'initiant à .Net

"SL3News" a écrit dans le message de
news:%23L60hl2$
Bonjour,
Je voudrais pouvoir déclarer et utiliser des variables mémoires de façon
dynamique. En d'autres termes, j'ai un conteneur de
variable qui contient à un moment donné le nom d'une variable mémoire. Je
voudrais donc utiliser le contenu du conteneur
comme si j'utilisais directement la variable mémoire.
Exemple :
Au lieu de déclarer directement une variable numeclie comme ceci :
int numeclie = 15;

Je veux passer par un conteneur en utilisant les deux instructions
suivantes :
string conteneur = "numeclie";
int &conteneur = 15;

NB : le symbole & a été utilisé tout simplement parce-que c'est ce que je
faisais dans VFP.
Ainsi, l'instruction :
int &conteneur = 15;
permet de déclarer non pas une variable mémoire "conteneur", mais plutôt
une variable mémoire dont le nom est lû dans la
variable conteneur c'est-à-dire ici "numeclie".

Je cherche donc l'équivalent de la macro de substitution & (de VFP) en C#

Merci d'avance pour vos contributions.