|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
22.09.2016, 17:17 | #1 |
Пользователь
Регистрация: 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. (Смотрите через отладчик) |
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 |
Пользователь
Регистрация: 22.09.2016
Сообщений: 40
|
Я надеюсь вы смотрели код. Начинается Answer переходим к Volume В СЛУЧАЕ ошибки код должен повторится, то есть заново прочитать этот блок кода. В каком моменте здесь ошибка написания кода?
"а вообще ужасный метод организации меню на рекурсии..." можете мне предложить другой вариант?????? я с радостью приму пару уроков |
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 |
Пользователь
Регистрация: 22.09.2016
Сообщений: 40
|
Спасибо большое успокоили))
|
22.09.2016, 19:31 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
кстати, на самом деле если бы сделали циклом, а не рекурсией, было бы и проще, и не было бы лабиринта вызовов.
ибо в Answer у вас условие выхода это ввод 5-ки. а в Volume ввод корректного значения. вот и упрощение. ибо с деревом я конечно немного загнул =D оно полезно чтоб сделать библиотеку и повторно юзать часто(или в широком приложении, что расширяется часто), а не так. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
22.09.2016, 19:39 | #7 |
Пользователь
Регистрация: 22.09.2016
Сообщений: 40
|
блин, я и не подумал про условия, реально спасибо
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Фокусы с факториалом | 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 |