Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2016, 17:17   #1
Silentium.noxe
Пользователь
 
Аватар для Silentium.noxe
 
Регистрация: 22.09.2016
Сообщений: 40
Вопрос Мой код ожил и показывает мне фокусы

Я всех приветствую кто посетил данную тему и хотел бы рассказать странные вещи которые я встретил при изучении С#.

Учусь на сайте mysharp.ru и там прохожу ООП "Методы в Си-шарп. Разница между простыми и статическими " Урок 14(пишу это если кому интересно и захочет сам посмотреть). На том уроке нужно было написать программу "телевизор" у которого можно было переключать каналы. с данным заданием я справился, всё работает пошли дальше. Пришёл к уроку об аксессорах так вот там нужно было написать код "телевизор", но с громкостью(два разных проекта)

Данная тема меня заинтересовала и я добавляю эту программу к первой и что наблюдаю... фокусы, я не имею ни малейшего представления почему программа так работает. Всё работает якобы нормально, но в глубине кода есть баг от которого мне не удаётся избавится.

Проблема: (работаем с методом Громкость)
1.вводим 1234
2.консоль говорит об ошибке
3.вводим 21
4.открывается Главное Меню (метод Ответ[Answer])
5.выходим
6.происходит последний вывод

И что мы наблюдаем?! после последнего выхода мы по идее должны нажать рандомную клавишу и выйдем, НО НИЧЕГО ПОДОБНОГО код всё равно работает с методом Громкость хотя давно не должен.

Я начал смотреть в отладчике и что наблюдаю:
стартует код (мы в Гл.Меню), выбираем Громкость, повторяем комбинацию описанную выше и тут начинается. Когда происходит "выход" из программы, программа осуществляет это путешествие
знак "_" означает резкий прыжок которого не должно быть, знак "-" указывает на последовательное выполнение кода, "троеточие" всё нормально, числа это номера строк.
144_69-70_58...(снова выходим)144_69-70_127-128
и дальше по порядку, программа завершилась.


Кто знает помогите, мне страшно, я не знаю что думать.

P.S. (Смотрите через отладчик)
Вложения
Тип файла: zip TV.zip (16.9 Кб, 7 просмотров)
Silentium.noxe вне форума Ответить с цитированием
Старый 22.09.2016, 17:33   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

как код написан так и работает.
вы на стек вызовов посмотрите, у вас же вложенный Volume:

TV_2.exe!TV_2.TV.Answer()Строка 130 C#
TV_2.exe!TV_2.TV.Volume()Строка 69 C#
TV_2.exe!TV_2.TV.Volume()Строка 58 C#
TV_2.exe!TV_2.TV.Answer()Строка 127 C#
TV_2.exe!TV_2.MainClass.Main()Строк а 155 C#

из-за ошибки у вас идет лишний вход в Volume.
вы из него выйдете, но первый запуск Volume войдет снова в Answer.
если уж оставить код как есть, то вызов Answer в Volume должен быть только когда успешно ввели значение.

а вообще ужасный метод организации меню на рекурсии...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 18:39   #3
Silentium.noxe
Пользователь
 
Аватар для Silentium.noxe
 
Регистрация: 22.09.2016
Сообщений: 40
По умолчанию

Я надеюсь вы смотрели код. Начинается Answer переходим к Volume В СЛУЧАЕ ошибки код должен повторится, то есть заново прочитать этот блок кода. В каком моменте здесь ошибка написания кода?

"а вообще ужасный метод организации меню на рекурсии..." можете мне предложить другой вариант??????

я с радостью приму пару уроков
Silentium.noxe вне форума Ответить с цитированием
Старый 22.09.2016, 18:48   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а откуда по вашему я стек вызовов взял?(это из студии, отладка)

смотрите, по вашему же плану:
0)мы в Answer=>Answer=>Answer#1
1)входим в Volume=>Volume#1
2)вводим неверное значение.
вы показываете сообщение об ошибке и входите снова в Volume=>Volume#2.
3)вводим верное значение, Volume#2 в конце вызывает Answer=>Answer#2_1
4)жмем выход, выходим из Answer#2_1 и Volume#2, возвращаемся в Volume#1
далее Volume#1 вызывает в конце Answer=>Answer#1_1*

5)выходим по запросу из Answer#1_1, затем молча из Answer#1

* - вот он ваш повторный запрос выхода.

так же как вариант хранить что был нажат выход, и просто не задавать больше вопросов тогда


я бы хранил меню деревом объектов, вполне себе удобная навигация, да и добавлять легко, тогда чуть ли не весь код работы с меню будет в одном месте и без повторов.
могу попозже дать пример кода.
в принципе дерево много где полезно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 18:51   #5
Silentium.noxe
Пользователь
 
Аватар для Silentium.noxe
 
Регистрация: 22.09.2016
Сообщений: 40
По умолчанию

Спасибо большое успокоили))
Silentium.noxe вне форума Ответить с цитированием
Старый 22.09.2016, 19:31   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

кстати, на самом деле если бы сделали циклом, а не рекурсией, было бы и проще, и не было бы лабиринта вызовов.
ибо в Answer у вас условие выхода это ввод 5-ки.
а в Volume ввод корректного значения.
вот и упрощение.

ибо с деревом я конечно немного загнул =D
оно полезно чтоб сделать библиотеку и повторно юзать часто(или в широком приложении, что расширяется часто), а не так.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 22.09.2016, 19:39   #7
Silentium.noxe
Пользователь
 
Аватар для Silentium.noxe
 
Регистрация: 22.09.2016
Сообщений: 40
По умолчанию

блин, я и не подумал про условия, реально спасибо
Silentium.noxe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Фокусы с факториалом newerow1989 Общие вопросы Delphi 9 03.11.2014 09:10
Мой индусский код! Я горжусь им! Tronix Свободное общение 36 25.07.2011 20:00
Excel 2003-2007 ???( люди добрые sos... мой фаил не open-или мне кирдык!!!) Александр82 Microsoft Office Excel 1 04.10.2010 19:09