Tableau de références

Résolu
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 27 sept. 2006 à 16:32
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008 - 29 sept. 2006 à 18:59
Bonjour,

J'ai plusieurs entiers :
int entier1, entier2, entier3, entier4

Je voudrais créer un tableau qui contienne les références à mes entiers. C'est à dire, je voudrais que si je modifie la valeur d'un élément de mon tableau, ça modifie la valeur de mon entier correspondant. C'est bête, mais je ne sais pas comment faire... pourriez-vous m'éclairer ?

Mathmax

12 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 sept. 2006 à 13:29
oula je viens de relire ma derniere réponse, cest ni tres clair ni tres francais...

bon en gros au lieu d'initialiser ton tableau tu laisse le compilateur le faire pour toi en créant une méthode dont les paramètres sont de type "params"....pour l'utilisation de params, je te laisse te référer a la msdn si cest pas suffisement clair dans l'exemple que je vais faire apres. ainsi tu aura un tableau temporaire généré par le compilo que tu n'as pas à gérer, et tu utilise simplement tes variables avec une écriture assez "simple". ca va être un peu lourd à taper l'appel de la méthode, mais finallement ca sera comme si tu initialisais ton tableau....

donc la méthode :

//out pour passer le type int par référence puisque int n'est pas un type référence
//out plutot que ref pour passer tes entiers alors qu'ils ne sont pas initialisés (avec ref ca marcherais pas)
//params plus facile a expliquer par l'exemple, tu verras ce que ca veux dire lors de l'appel de la fonction
private void InitEntiers (TonObject groups, out params int[] Values)
{
for (int i = 0; i < Values.length; i++)
Values[i] = int.Parse(groups[i].Value);
}

et donc l'appel :

//si groups n'est pas une donnée membre mais une variable locale, évidemment, sinon tu pourras lenlever des paramètres ;)
int entier1, entier2, entier3, entier4;
InitEntiers(groups, out entier1, out entier2, out entier3, out entier4);


si tu avais utilisé ref plutot que out, (ce qui est tout a fait faisable), tu aurais du faire
int entier1 0, entier2 0, entier3 = 0, entier4 = 0;

jespere que cest plus clair comme ca ;)
3
taoetc Messages postés 346 Date d'inscription lundi 8 septembre 2003 Statut Membre Dernière intervention 3 septembre 2007 3
27 sept. 2006 à 17:01
Je vois pas trop comment dire " l'application concrete de cela "mais bon.

Pourquoi tu n'utilise pas plutot les valeurs de ton tableau plutot que d'avoir un tableau plus un groupe de variable. 

Ca m'a l'air plus du C++ que du c# non.

Autrement il existe un truc qui s'appelle le databinding, mais pour des entiers  et un tableau, je pense pas que ca marche tres bien.

Par contre, si tu as un tableau  et que tu as plusieurs objets graphiques , là, ca doit fonctionner.

Bon, je crois que je t'ai pas trop avancé, désolé

Be happy , by
Tao
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
27 sept. 2006 à 17:48
Mais non il parle d'un tableau en programmation :)
Ce code fait ce que tu désire, j'aimerais savoir si il y a une méthode plus simple :)

class Integer
{
public Integer(int i)
{
_iValue = i;
}

private int _iValue;

public int Value
{
get { return _iValue; }
set { _iValue = value; }
}

}

Integer a = new Integer(1);
Integer b = new Integer(2);
Integer c = new Integer(3);


Integer[] array = new Integer[3];


array[0] = a;
array[1] = b;
array[2] = c;



array[0].Value++;

MessageBox.Show(array[0].Value.ToString());
MessageBox.Show(a.Value.ToString());
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
27 sept. 2006 à 18:19
Merci pour vos réponse.
Oui j'avais pensé à ça aussi MoDDib, mais c'est pas très élégant je trouve. J'aimerais aussi une méthode plus simple.
Sinon pour ce qui est de l'utilisation. En fait, j'ai un assez grand nombre d'entiers que je souhaiterais instancier comme ceci :
entier1 = int.Parse(groups[1].Value);

entier2 = int.Parse(groups[2].Value);

entier3 = int.Parse(groups[3].Value);

....

alors je préferais les instancier en utilisant une boucle. Si un tableau contient les références à mes entier, je n'ai qu'à faire :

for (int i = 0; i < MesEntiers.length; i++)
    MesEntiers[i] = int.Parse(groups[i].Value);
Mathmax
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
27 sept. 2006 à 18:44
Ok mais ce que je ne comprends pas dans ce cas là c'est pourquoi tu veux absolument que modifier la valeur dans le tableau modifie la variable : autant jetter les variables et ne garder que le tableaux non ? après tout ces entiers ne sont que des valeurs que tu as déjà dans ton tableau ?
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
27 sept. 2006 à 18:54
parce que les variables ont des noms bien pratiques alors que les éléments du tableau ne sont pas très parlant. Ca facilite beaucoup la lecture du programme si je sais tout de suite à quoi elle correspond grâce au nom...

Mathmax
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
28 sept. 2006 à 16:17
et avec une méthode que tu crées qui possèdes des paramètres "param", cela ne pourrait pas convenir? tu crée ta méthode qui boucle, et tu dois l'appeler en faisant...ca reste comme si tu initialisais ton tableau, et ta fonction boucle...

public void InitEntiers(out entier1, out entier2, out entier3, out entier4);


la seule question que je me pose, est ce qu'une méthode avec des paramètres "param" peut avoir ces paramètres en "out"?
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
29 sept. 2006 à 15:48
Merci beaucoup pour ta réponse leprov. Je ne connaissais pas l'histoire des params. C'est pas mal comme principe.... Ta méthode me conviens mais je reste quand même étonné qu'on ne puisse pas faire de tableau de référence en c#. N'y a t'il pas une méthode pour considerer des entiers (ou string ou autre type veleur...) comme des instances de classe et nom plus des instances de structure ? Celà permettrait de faire en sorte que 2 entiers pointent vers un même objet et donc que la modification de l'un entraine la modification de l'autre et vis versa.

Mathmax
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 sept. 2006 à 16:13
oui tu peux le faire mais ce n'est pas trop conseillé, cest pour ca que je te parlais plutot d'une méthode avec des "params".
sinon renseigne toi a propos des blocs "unsafe", la tu pourras utiliser des pointeurs (et donc des références sur tes int).
mais a la limite la méthode params restera quoiqu'il en soit plus courte a écrire, plus lisible, plus propre, et plus sure au niveau de la gestion mémoire (le Garbage collector et le framework ne sont pas la pour rien quand meme).
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 sept. 2006 à 16:31
autre solution a laquelle je viens de penser, tu dois pouvoir utiliser des Int32 au lieu des int....cest la meme chose mais deja encaspulé, je suppose que ca doit aussi pouvoir faire ton bonheur
0
MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
29 sept. 2006 à 16:58
int est un alias pour Int32 : ça ne changera rien
0
cs_mathmax Messages postés 403 Date d'inscription vendredi 28 octobre 2005 Statut Membre Dernière intervention 31 août 2008
29 sept. 2006 à 18:59
Merci pour ces précisions. J'avais aussi essayé d'utiliser Int32, mais ça me donnait la même chôse. Pour ce qui est des pointeurs, j'ai trouvé un article très bien fait qui explique tout.
Merci encore.




Mathmax
0
Rejoignez-nous