Récuperer les valeurs de variables qui appartiennent à une autre fonction.

Signaler
Messages postés
4
Date d'inscription
dimanche 15 janvier 2012
Statut
Membre
Dernière intervention
23 juin 2012
-
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
-
Bonjour !
Je m'initie au développement en C#. Voici une bref topo de mon problème :
-J'ai une fonction avec 2 variables déclarées (aSucces et bEchec). Durant l’exécution de cette fonction les valeurs des 2 variables vont être incrémentées.
-J'ai une autre fonction, dont la charge serait de récupérer les valeurs des variables situées dans la première fonction, pour ensuite actualiser le contenu d'un label (avec WPF).

Donc, ma question est comment récupérer les valeurs des variables d'une fonction, et les stockées dans une autre fonction. J'ai chercher un peu sur google, et je suis tombé sur le fait qu'on peut déclarer les variables avec static, genre => private static int aSucces ou private static int bEchec. Je demande votre aide !

Merci pour tout.

6 réponses

Messages postés
14721
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 septembre 2020
430
Bonjour, l'utilisation de variable static est déconseillée en C#.

si tu utilises des variables d'un type de base (tout sauf les classes que tu écrits toi même: int, double, string etc....), les informations sont passée par valeur, donc tu ne peux pas récupérer les changements effectués sur ces variables.
Il y a deux solutions pour y remédier les mots clés ref et out

exemple fonction
private int somme(ref int a, out int b)
        {
            a += 2;//ajoute 2
            b = 1;//initilise à 1
            return a + b;// retourne la somme
        }

exemple d'appel de la fonction
            int a = 2;
            int b;

            int c = somme(ref a, out b);
            // a et b modifiés accessibles


dans cet exemple, a passe à 4, b est initialisé, la somme est retournée et les valeur modifiées sont accessibles dans ta méthode d'appel.


Si tu utilise une classe personnelle, elle est systématiquement passée par référence, dans ce cas les modifications sont accessibles:

    public class ASommer//class avec valeurs à sommer
    {
        public int a { get; set; }
        public int b { get; set; }
    }



        private int somme(ASommer toto)//fonction pour sommer
        {
            toto.a += 2;//ajoute 2
            toto.b -= 1;//retire 1
            return toto.a+toto.b;
        }


                        ASommer toto new ASommer{a 2, b = 1};
            c = somme(toto);//appel de la fonction somme
            //modification sur toto accessibles


Whismeril
Messages postés
4
Date d'inscription
dimanche 15 janvier 2012
Statut
Membre
Dernière intervention
23 juin 2012

En fait, je m'explique plus simplement ( je code une interface en WPF) :

............................................................
............................................................
............................................................
public MainWindow()
{
InitializeComponent();

DispatcherTimer t1 = new DispatcherTimer();
t1.Tick += new EventHandler(//La est le premier problème);
t1.Interval = new TimeSpan(0,0,1);
t1.Start();
}

private void start_Click(object sender, RoutedEventArgs e)
{
int a = 0;
int b = 0;
for(a<2000)
{
b++;
a++;
}
}

private void Variables(Object sender, EventArgs e)
{
//Vu que la fonction qui gère le clique est du style <RoutedEvent>, je ne peut pas //utiliser de dispatcher timer pour actualiser le contenu d'un label. Donc je suis //obligé de récupérer les valeurs des variables avec la fonction <Variables>,qui est //du style <Event>j, pour y appliquer un dispatcherTimer et ainsi actualisé le //contenu d'un variable.
}


J'espère avoir bien expliqué mon problème.
Messages postés
14721
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
5 septembre 2020
430
Je ne fais pas de WWF, donc je n'ai pas tout compris.

Si tout ce code est écrit dans un seul jeux d'accolades alors tu peux déclarer a et b pour tout le jeux. Sinon tu dois pouvoir les passer en paramètre dans un événement personnalisé.

Enfin si ça ne te convient pas, il reste les variable static. De tête, tu écris une classe static Toto dans laquelle tu écrit deux propriétés static a et b.


Whismeril
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
Salut,

comme whismeril je ne suis pas sûr de comprendre la demande.

* si tu souhaites afficher une valeur incrémentée sur le Tick d'un Timer, alors il suffit de remplir ta TextBox dans l'évènement associé. Ces variables n'ont pas besoin d'être static, juste d'être membres de la classe (et non locales à la fonction), puisqu'à priori cette classe ne sera instanciée qu'une fois.

* si tu souhaites "espionner" l'incrémentation de tes variables à l'intérieur d'une boucle for, alors il va falloir la mettre dans un thread, sinon la boucle ira jusqu'au bout avant de rendre la main au reste du programme. Toujours pas d'utilité à des variables static si tu n'as qu'une instanciation, des variables membres à la classe suffisent.

PS : je connais WPF non plus.
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
11
*je ne connais pas WPF non plus
Messages postés
792
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
12 juillet 2019
8
Bonjour,
Qu'est ce que tu veux afficher a et b qui je suppose sont aSucces et bEchec de ta première question?
et l'incrémentation doit se faire à chaque du timer ou bien juste mettre à jour les labels de a et b avec leurs valeurs courantes?
Il faudrait aussi voir le fichier xaml pour voir comment tu as fait le databinding.

louis