Zakres ważności zmiennych

0

Witam.

Gdy próbuje modyfikować zmienna globalna w jakiejś funkcji i potem ta funkcje wywołać w innej funkcji obsługującej jakieś zdarzenie to za każdym razem funkcja liczy od zera, zamiast zapamiętywać poprzedni stan. Dlaczego się tak dzieje?


int _wsp1, _wsp2,rzuty; // zmienne globalne

// .... Jakis tam wczesniejszy kod nie operujacy na zmeinnych globalnych



private void rzut_Click(object sender, EventArgs e)
        {
            Random rnd = new Random();
            rzuty = rnd.Next(1, 7);

            switch (rzuty)
            {
                case 1:
                    Kosc.Image = Image.FromFile("gfx/1.png");
                    break;
                case 2:
                    Kosc.Image = Image.FromFile("gfx/2.png");
                    break;
                case 3:
                    Kosc.Image = Image.FromFile("gfx/3.png");
                    break;
                case 4:
                    Kosc.Image = Image.FromFile("gfx/4.png");
                    break;
                case 5:
                    Kosc.Image = Image.FromFile("gfx/5.png");
                    break;
                case 6:
                    Kosc.Image = Image.FromFile("gfx/6.png");
                    break;

            }
            Kosc.Show();
            b_rzut.Enabled = false;
            timer.Enabled = true;

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (gracz1.IsYourTurn == true) ruch(_wsp1, p_gracz_1);
            else ruch(_wsp2, p_gracz_2);
        }

        public void ruch(int _wsp,PictureBox gracz)  // ta funkcja zawsze liczy od zera zamiast zapamiętywać wartość
         {
            _wsp = _wsp + rzuty;
            if (_wsp >= GPS.Count)
            {
                int _dziesiatki = _wsp / 10;
                _wsp -= _dziesiatki * 10;                
            }
            gracz.Location = new Point(GPS[_wsp].X, GPS[_wsp].Y);
            _wsp = 5;
            Kosc.Hide();

            timer.Enabled = false;

            b_rzut.Enabled = true;
        }
1

W C# nie ma zmiennych globalnych. Ty chyba próbujesz tak nazwać pola klas, które mają wartości domyślne dla każdego nowego obiektu.
Lepiej napisz, co chcesz osiągnąć.

0

Tak. Z tymi zmiennymi globalnymi pomyliło mi sie z C++.

Otóz tak jak pisałem wartość zmiennej _wsp obliczona w funkcji run() ma myc zapisana do tej zmiennej an której akurat wynonuje operacje czyli _wsp1 lub _wsp2.

`dodanie znaczników ``` - @furious programming

1

Dobra, już widzę o co chodzi.
Ponieważ int to typ wartościowy, a nie referencyjny, to metoda ruch operuje na kopii swojego argumentu _wsp, a nie na oryginalnej wartości, którą tam przekazujesz. Z tego powodu, po wykonaniu się timer1_Tick żadnych zmian w wartościach pól _wsp1 i _wsp2 nie ma. Musisz zamienić ten parametr na referencyjny, czyli dodaj ref przed int.

0

Działa. Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1