Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
1 / 1 / 0
Регистрация: 30.06.2015
Сообщений: 99

Обнуляется переменная

25.07.2017, 16:39. Показов 1740. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Сразу предупреждаю, мягко говоря, код не очень красивый. Проблема такая, есть 2 класса.
Первый:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace MemoriesCards
{
    public partial class MainForm : Form
    {
        /// <summary>
        /// Закончил на 26:39
        /// </summary>
        int[] cards = new int[16];
        static Random rand = new Random();
        bool[] opens = new bool[16];
 
        public Image[] imagesArrey = new Image[10];
        public PictureBox[] picturesArrey = new PictureBox[16];
        
        int status = 0;
        int cardA;
        int cardB;
 
        public MainForm()
        {
            InitializeComponent();
            for (int i = 0; i <= 15; i++)
            {
                PushPictureBoxArrey(i);
            }
            for (int i = 0; i <= 9; i++)
                PushImagesArrey(i);
            initGame();
        }
 
        private void menuExit_Click(object sender, EventArgs e)
        {
            Close();
        }
 
        private void menuRules_Click(object sender, EventArgs e)
        {
            MenuBtnFunc menuBtn = new MenuBtnFunc();
            menuBtn.RulesText();
        }
 
        private void menuAbout_Click(object sender, EventArgs e)
        {
            MenuBtnFunc menuBtn = new MenuBtnFunc();
            menuBtn.AboutText();
        }
 
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int pictureNumber = int.Parse(((PictureBox)sender).Tag.ToString());
            if (opens[pictureNumber]) return;
            switch(status)
            {
                case 0: status_0(pictureNumber); break;
                case 1: status_1(pictureNumber); break;
                case 3: status_3(pictureNumber); break;
            }
 
        }
        //Change
        private void show(int picture)
        {
            LogickFunk log = new LogickFunk();
            log.showFunk(picture, cards, picturesArrey, imagesArrey);
        }
        //Change
        public void hide(int picture)
        {
            LogickFunk log = new LogickFunk();
            log.hideFunk(picture, picturesArrey, imagesArrey);
        }
        //Change
        private void status_0(int pictureNumber)
        {
            LogickFunk log = new LogickFunk();
            log.status_0Funk(pictureNumber, cards, picturesArrey, imagesArrey, out status, out cardA);
        }
 
        private void status_1(int picture)
        {
            /*cardB = pictureNumber;
            if (cardA == cardB) return;
            show(pictureNumber);
            status = 2;
            if (cards[cardA] == cards[cardB])
            {
                open(cardA);
                open(cardB);
                done += 2;
                if (done == 16)
                    youWin();
                else
                    status = 0;
            }
            else
                status = 3;*/
            LogickFunk log = new LogickFunk();
            log.status_1Funk(picture, out cardB, cards, picturesArrey, imagesArrey, out status, cardA);
        }
        //Change
        private void youWin()
        {
            LogickFunk log = new LogickFunk();
            log.youWinFunk();
        }
        
        private void status_3(int picture)
        {
            hide(cardA);
            hide(cardB);
            status_0(picture);
            //LogickFunk log = new LogickFunk();
            //log.status_3Funk(out cardA, out cardB, picturesArrey, imagesArrey, cards, picture, out status);
        }
        //Change
        private void initGame()
        {
            LogickFunk log = new LogickFunk();
            log.initGame(cards, opens, picturesArrey, imagesArrey);
            status = 0;
        }
        //Change
        public void shuflCards()
        {
            LogickFunk logFunk = new LogickFunk();
            logFunk.ShuflCard(cards);
        }
        //Change
        public void loadPicture(int picture, int image)
        {
            LogickFunk log = new LogickFunk();
            log.loadPictureFunk(picture, image, picturesArrey, imagesArrey);
        }
        //заполнение масива PictureBox
        private PictureBox PushPictureBoxArrey(int i)
        {
            for(i = 0; i <= 15; i++)
            {
                switch (i)
                {
                    case 0: picturesArrey[i] = pictureBox1; break;
                    case 1: picturesArrey[i] = pictureBox2; break;
                    case 2: picturesArrey[i] = pictureBox3; break;
                    case 3: picturesArrey[i] = pictureBox4; break;
                    case 4: picturesArrey[i] = pictureBox5; break;
                    case 5: picturesArrey[i] = pictureBox6; break;
                    case 6: picturesArrey[i] = pictureBox7; break;
                    case 7: picturesArrey[i] = pictureBox8; break;
                    case 8: picturesArrey[i] = pictureBox9; break;
                    case 9: picturesArrey[i] = pictureBox10; break;
                    case 10: picturesArrey[i] = pictureBox11; break;
                    case 11: picturesArrey[i] = pictureBox12; break;
                    case 12: picturesArrey[i] = pictureBox13; break;
                    case 13: picturesArrey[i] = pictureBox14; break;
                    case 14: picturesArrey[i] = pictureBox15; break;
                    case 15: picturesArrey[i] = pictureBox16; break;
                }
            }
            i = 0;
            return picturesArrey[i];
        }
        //заполнение масива Image
        public Image PushImagesArrey(int i)
        {
            for (i = 0; i <= 9; i++)
            {
                switch (i)
                {
                    case 0: imagesArrey[i] = Properties.Resources._1; break;
                    case 1: imagesArrey[i] = Properties.Resources._2; break;
                    case 2: imagesArrey[i] = Properties.Resources._3; break;
                    case 3: imagesArrey[i] = Properties.Resources._4; break;
                    case 4: imagesArrey[i] = Properties.Resources._5; break;
                    case 5: imagesArrey[i] = Properties.Resources._6; break;
                    case 6: imagesArrey[i] = Properties.Resources._7; break;
                    case 7: imagesArrey[i] = Properties.Resources._8; break;
                    case 8: imagesArrey[i] = Properties.Resources._9; break;
                    case 9: imagesArrey[i] = Properties.Resources.empty; break;
                }
            }
            i = 0;
            return imagesArrey[i];
        }
 
        private void menuNewGamem_Click(object sender, EventArgs e)
        {
            initGame();
        }
        //Change
        private void open(int picture)
        {
            LogickFunk log = new LogickFunk();
            log.openFunk(picture, opens, cards, picturesArrey, imagesArrey);
        }
    }
}

и второй:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace MemoriesCards
{
    class LogickFunk
    {
        static Random rand = new Random();
        int nCardA, nCardB;
        int nStatus;
        bool[] opens = new bool[16];
        int nDone;
 
        public void ShuflCard(int[] cards)
        {
            int a = rand.Next(0, cards.Length);
            int d = rand.Next(0, cards.Length);
            if (a == d) return;
            int x;
            x = cards[a];
            cards[a] = cards[d];
            cards[d] = x;
        }
 
        public void youWinFunk()
        {
            MessageBox.Show("You Win!");
        }
 
        public void initGame(int[] cards, bool[] opens, PictureBox[] picturesArrey, Image[] imagesArrey)
        {
            for (int j = 0; j < cards.Length; j++)
                cards[j] = j % (cards.Length / 2) + 1;
            for (int j = 0; j < 100; j++)
                ShuflCard(cards);
            for (int j = 0; j < cards.Length; j++)
                loadPictureFunk(j, 9, picturesArrey, imagesArrey);
            for (int j = 0; j < cards.Length; j++)
                hideFunk(j, picturesArrey, imagesArrey);
            for (int j = 0; j < cards.Length; j++)
                opens[j] = false;
        }
 
        public void loadPictureFunk(int picture, int image, PictureBox[] picturesArrey, Image[] imagesArrey)
        {
            picturesArrey[picture].Image = imagesArrey[image];
        }
        public void hideFunk(int picture, PictureBox[] picturesArrey, Image[] imagesArrey)
        {
            loadPictureFunk(picture, 9, picturesArrey, imagesArrey);
            picturesArrey[picture].Cursor = Cursors.Hand;
        }
        public void showFunk(int picture, int[] cards, PictureBox[] picturesArrey, Image[] imagesArrey)
        {
            loadPictureFunk(picture, cards[picture], picturesArrey, imagesArrey);
            picturesArrey[picture].Cursor = Cursors.Arrow;
 
        }
 
        public void openFunk(int picture, bool[] opens, int[] cards, PictureBox[] picturesArrey, Image[] imagesArrey)
        {
            opens[picture] = true;
            showFunk(picture, cards, picturesArrey, imagesArrey);
        }
 
        public void status_0Funk(int picture, int[] cards, PictureBox[] picturesArrey, Image[] imagesArrey, out int status, out int cardA)
        {
            cardA = picture;
            nCardA = picture;
            showFunk(picture, cards, picturesArrey, imagesArrey);
            status = 1;
            nStatus = status;
        }
 
        public void status_1Funk(int picture, out int cardB, int[] cards, PictureBox[] picturesArrey, Image[] imagesArrey, out int status, int cardA)
        {
            cardB = picture;
            nCardA = cardA;
            status = 3;
            nCardB = picture;
            if (nCardA == nCardB) return;
            showFunk(picture, cards, picturesArrey, imagesArrey);
            nStatus = 2;
            if (cards[nCardA] == cards[nCardB])
            {
                openFunk(nCardA, opens, cards, picturesArrey, imagesArrey);
                openFunk(nCardB, opens, cards, picturesArrey, imagesArrey);
                nDone += 2;
                if (nDone == 16)
                    youWinFunk();
                else nStatus = 0;
            }
            else
                nStatus = 3;
            status = nStatus;
            MessageBox.Show(Convert.ToString(nDone));
        }
 
        public void status_3Funk(out int cardA, out int cardB, PictureBox[] picturesArrey, Image[] imagesArrey, int[] cards, int picture, out int status)
        {
            /*hide(cardA);
            hide(cardB);
            status_0(pictureNumber);*/
            cardA = nCardA;
            cardB = nCardB;
            hideFunk(cardA, picturesArrey, imagesArrey);
            hideFunk(cardB, picturesArrey, imagesArrey);
            status_0Funk(picture, cards, picturesArrey, imagesArrey, out status, out cardA);
        }
    }
}

Идея в том, что при каждом вызове функции status_1Funk(соответственно когда заходит во ветвление), во втором классе, переменная nDone должна увеличиваться на 2(и она увеличивается).
Проблема в том, что уже к концу этого метода, переменная nDone обнуляется(nDone = 0).

Подскажите в чем причина? Где мой косяк?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2017, 16:39
Ответы с готовыми решениями:

Обнуляется переменная
using System; namespace ConsoleApp6 { class Program

Обнуляется глобальная переменная
Добрый день. У меня обнуляется глобальная переменная, хотя и не должна. Идея в том, что каждой галлерее соответсвует своя папка в каталоге...

При возвращение метода переменная int с каждый раз обнуляется
При возвращение метода переменная int с каждый раз обнуляется, Нужно сделать чтобы ноль присваивался только один раз. Не знаю как сделать,...

4
911 / 796 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
25.07.2017, 16:57
Пройдись отладчиком посмотри в каком моменте твоя переменная обнуляется, по коду она не должна обнуляться в твоей функции. Эта переменная где-то еще используется? ибо искать не очень по коду твоему. Если она в начале функции всегда 0, то так и будет, если я правильно понял логику вызова данной функции ( именно в начале, не в конце на выводе сообщения с ней )
0
1 / 1 / 0
Регистрация: 30.06.2015
Сообщений: 99
25.07.2017, 17:12  [ТС]
Эта переменная где-то еще используется?
Нет, больше ни где не используется.
Если она в начале функции всегда 0, то так и будет, если я правильно понял логику вызова данной функции
Вот это скорей всего мой косяк. Отладчиком прошелся, переменная равняется 0 еще в начале функции.

Как исправить, чтобы значение сохранялось, а не обнулялось?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
25.07.2017, 17:18
Цитата Сообщение от OPELLIEK Посмотреть сообщение
Проблема в том, что уже к концу этого метода, переменная nDone обнуляется(nDone = 0).
Она обнуляется не к концу метода, а к началу выполнения следующего метода.

Проблема в том, что вы каждый раз создаете новый экземпляр класса LogickFunk.
В итоге у вас в памяти куча одноразовых LogickFunk, каждый из которых используется один раз со своими значениями по умолчанию.

Добавлено через 35 секунд
Цитата Сообщение от OPELLIEK Посмотреть сообщение
Как исправить, чтобы значение сохранялось, а не обнулялось?
Держите один экземпляр класса LogickFunk и вызывайте нужный метод повторно на нем, а не на новом экземпляре.
0
1 / 1 / 0
Регистрация: 30.06.2015
Сообщений: 99
25.07.2017, 17:24  [ТС]
Вот оно что Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2017, 17:24
Помогаю со студенческими работами здесь

Обнуляется вложенный список
Hello. Есть класс. class ClassRegex { Regex r; public string d; List&lt;ClassRegex&gt; crlist; } Идея в том, что идет перебор...

Почему элемент обнуляется входя в цикл?
сортировать список написал, при входе в цикл фор root стает = null хоть до него я ему присвоил указатель на 1 елемент root = first; почему...

Обнуляется счетчик в цикле foreach рекурсивной функции
Вызываю функцию: Передаю значение count = 0. private void сlearFs_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) ...

При создании объекта класса обнуляется массив
При создании объекта одного класса в другому, в первом классе массив обнуляется, все значения, которые до этого в него были записаны,...

Объект самопроизвольно обнуляется или тайна библиотеки xNet
Прикручиваю к своему проекту прокси, использую библиотеку xNet, библиотека удобная, спасибо автору, но объект response самопроизвольно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru