Zakres ważności zmiennych

2015-01-11 18:07
RocketsMan
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;
        }

Pozostało 580 znaków

2015-01-11 19:30
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ąć.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2015-01-11 19:33
RocketsMan
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

edytowany 1x, ostatnio: furious programming, 2016-12-13 18:26

Pozostało 580 znaków

2015-01-11 19:42

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.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2015-01-11 19:59
RocketsMan
0

Działa. Dzięki za pomoc.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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