Разделяне на програма на процедури/функции

Ето кода, който използвам. Опитвам се да организирам програмата, като я разделя на процедури и функции. Кодът работеше, когато не беше разделен, но когато го имам в този формат по-долу, текущият номер става 0. Трябва ли да променя UserInput на функция вместо на процедура? Имам нужда от множество стойности, които да бъдат актуализирани и върнати към основната програма, така че нямах представа как мога да го използвам като функция. Благодаря предварително за всякаква помощ и се извинявам за моята глупост, все още съм в ранните етапи на изучаване на програмиране като цяло.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Call ExplanationOfGame()
    CurrentNumber = RandomNumber()
    Label2.Text = CurrentNumber
    While CurrentNumber <> 0
        Call UserInput(UserNumber, CurrentNumber, Answer)
        Call ComputerInput(ComputerNumber, CurrentNumber, Answer)
    End While
    Call DecideWinner(CurrentNumber, Answer)
End Sub

Sub UserInput(ByVal CurrentNumber As Integer, ByVal UserNumber As Integer, ByVal Answer As Integer)
    Answer = 1
    Do
        UserNumber = InputBox("Enter number to minus from the current number (1, 2 or 3). The current number is: " & CurrentNumber)
    Loop Until (CurrentNumber - UserNumber) >= 0
    CurrentNumber = CurrentNumber - UserNumber
    Label2.Text = CurrentNumber
    MsgBox("You took " & UserNumber & " away from the current number. The new current number is " & CurrentNumber)
End Sub

person Z epaa    schedule 18.11.2014    source източник
comment
Променете своите ByVals на ByRefs.   -  person helrich    schedule 19.11.2014


Отговори (1)


Във функцията UserInput използвайте ByRef вместо ByVal за параметрите. ByVal предава само стойността на променливата, така че всъщност не променяте оригиналната променлива.

Другата опция е да го промените във функция и да върнете само CurrentValue. Изглежда, че подавате два параметъра - UserNumber и Answer - които не е необходимо да се предават.

Можете да го промените на:

Function UserInput(CurrentNumber As Integer) As Integer
    ...
End Function

След това го извикайте с помощта на:

CurrentNumber = UserInput(CurrentNumber)
person Community    schedule 18.11.2014
comment
Добре, бих ли сменил sub на функция? Може би нещо подобно?: „Функция UserInput(ByRef CurrentNumber, ByRef UserNumber, ByRef отговор)“ - person Z epaa; 19.11.2014
comment
Не, може да остане суб. Преминавате към функция само ако искате да върнете една стойност, вместо да променяте съществуващи променливи. - person ; 19.11.2014
comment
Промених всички „ByVal“ на „ByRef“, но проблемът продължава? - person Z epaa; 19.11.2014
comment
Какъв проблем имаш? Поставили ли сте точки на прекъсване в кода, през които да преминете и да видите дали стойностите, които очаквате, се предават? - person ; 19.11.2014
comment
Съжалявам, не съм съвсем сигурен как да направя това, кодът определено работеше, преди да се опитам да го разделя на подчинения, така че предположих, че това е проблемът. CurrentNumber е произволно число, представено в Label2.text, и това работи, но в полето за въвеждане, което се появява, currentNumber е 0. Има ли начин да ви изпратя пълния код, за да можете да видите моите грешки? - person Z epaa; 19.11.2014
comment
Току-що направих актуализация на моя отговор, след като прочетох кода ви малко повече. Изглежда, че имате някои ненужни неща, които могат да бъдат опростени. - person ; 19.11.2014
comment
Благодаря за актуализацията, все пак ще мога ли да променя други стойности в кода? Тъй като имам нужда от променливата „Отговор“ за промяна на числото, както и от „Текущо число“ - person Z epaa; 19.11.2014
comment
О... имаш параметрите си в грешен ред. Вашият под има CurrentNumber, UserNumber, но вие го извиквате с UserNumber, CurrentNumber. - person ; 19.11.2014
comment
Ааа, страхотно, това проработи! Изглежда доста глупава грешка :P Сега трябва да го запомня, благодаря много за помощта, Филип. - person Z epaa; 19.11.2014